Esta pregunta ya se ha formulado, pero nunca se respondió correctamente. Después de la autorización con @Seth, ahora lo vuelvo a preguntar. Esto me permitirá responder y posiblemente modificar la pregunta mucho más fácilmente. La pregunta original se puede encontrar aquí:
Asigne Ctrl y Alt a los botones del mouse
Problema:
Aunque es muy simple asignar cualquier pulsación de tecla a un botón del mouse usando xbindkeys
en conjunto xdotool
o xte
parece mucho más problemático asignarle una tecla modificadora (por ejemplo , ALT , CTRL , SHIFT , etc.).
La solución final debe permitir, entre otras cosas, un CTRL + clic (por ejemplo, para seleccionar múltiples entradas de una lista) con solo el mouse.
Puede encontrar un par de enfoques posibles para resolver esto aquí en Stack Exchange, así como en otros foros relacionados con Linux. Pero ninguno de ellos funciona como se esperaba, ya que conducen a otros problemas y efectos secundarios.
Notas:
Algunos de los ejemplos a continuación involucran la sintaxis de Guile con Scheme y dependen del .xbindkeysrc.scm
archivo, mientras que otros dependen del .xbindkeysrc
archivo con su sintaxis respectiva. Soy consciente de que no trabajarán juntos.
Además, los fragmentos a continuación se basan xdotool
únicamente, pero estoy abierto a enfoques que involucren otras aplicaciones como, por ejemplo xte
, también, aunque parece que ambos conducen a los mismos resultados y, por lo tanto, estoy usando solo xdotool
acciones aquí.
Enfoque A:
Actualizando el .xbindkeysrc
archivo con:
"xdotool keydown ctrl"
b:8
"xdotool keyup ctrl"
release + b:8
Eso es lo que intenté inicialmente, pero tiene el efecto secundario de que el modificador se está reteniendo y no se puede liberar.
Enfoque B:
Actualizando el .xbindkeysrc.scm
archivo con:
(xbindkey '("b:8") "xdotool keydown ctrl")
(xbindkey '(release "b:8") "xdotool keyup ctrl")
(xbindkey '("m:0x14" "b:8") "xdotool keydown ctrl")
(xbindkey '(release "m:0x14" "b:8") "xdotool keyup ctrl")
Encontrado en http://www.linuxforums.org/forum/hardware-peripherals/169773-solved-map-mouse-button-modifier-key.html e intenta abordar el problema donde se mantiene el modificador (como se describe en el enfoque un).
Aunque corrige que solo funciona parcialmente, ya que no es posible realizar otros clics del mouse mientras se presiona el botón del pulgar.
Enfoque C:
Actualizando el .xbindkeysrc
archivo con:
"xdotool keydown ctrl"
b:8
"xdotool keyup ctrl"
release + control + b:8
Probado por OP de la pregunta vinculada aquí en askubuntu. Mucho más simple y más sólido ya que no involucra estados modificadores. Sin embargo, el problema persiste, es decir, no se puede hacer clic CTRL + .
Parece que xbindkeys
el problema es en sí mismo ya que reconoce el clic pero no lo ejecuta. Esto se puede probar usando xev | grep button
y xbindkeys -v
:
Un clic normal del mouse según lo registrado xev
debería verse así:
state 0x10, button 1, same_screen YES
state 0x110, button 1, same_screen YES
Además del botón del pulgar:
state 0x10, button 8, same_screen YES
state 0x10, button 8, same_screen YES
Pero cuando tiene xbindkeys
habilitada la configuración anterior , no registra nada. Aunque tiene sentido para el botón del pulgar, ya que está asignado a CTRL y, por lo tanto, ya no es un botón del mouse, es extraño que el botón 1 no esté grabado también. Esto es probable porque xbindkeys
no lo ejecuta pero sí lo reconoce:
Button press !
e.xbutton.button=8
e.xbutton.state=16
"xdotool keydown ctrl"
m:0x0 + b:8 (mouse)
got screen 0 for window 16d
Start program with fork+exec call
Button press !
e.xbutton.button=1
e.xbutton.state=20
Button release !
e.xbutton.button=1
e.xbutton.state=276
Button release !
e.xbutton.button=8
e.xbutton.state=20
"xdotool keyup ctrl"
Release + m:0x4 + b:8 (mouse)
got screen 0 for window 16d
Start program with fork+exec call
Enfoque D:
Actualizando el .xbindkeysrc
archivo con:
"xdotool keydown ctrl"
b:8
"xdotool keyup ctrl"
release + control + b:8
"xdotool click 1"
b:1
Simplemente demasiado simple ... pero conduce a un bucle infinito de clics.
ACTUALIZAR:
Mientras tanto, compré un Logitech G502 y noté que una vez configurado a través del controlador en Windows, no solo el perfil en sí se almacena en la memoria del dispositivo, sino que la pulsación de tecla real se realiza con el mouse. ¡De hecho, eso resolvió mi problema en Linux!
El único otro mouse que recuerdo que pudo hacer eso fue el Razer Copperhead en aquellos días. Pero supongo que hay otros ratones disponibles hoy que pueden hacer lo mismo.
Respuestas:
Pasé mucho tiempo tratando de hacer que ese enlace funcionara. Finalmente encontré una solución, que es complicada pero funciona bien y no implica software de terceros. Lo comparto aquí esperando que ayude a la gente. Además, sé que esto no es perfecto en términos de seguridad, por lo que cualquier comentario constructivo es más que bienvenido.
Hay soluciones que son realmente agradables, como la que se propone aquí , pero siempre sufre la limitación de xbindkeys que agarran todo el mouse, lo que hace que los modificadores + el mapeo del mouse sean inciertos. Además, la solución basada en el engaño del enlace anterior usa ctrl + más / ctrl + menos que Gimp no reconoce, por ejemplo.
Me di cuenta de que lo que queremos es un botón del mouse que actúe como teclado, así que usé uinput, a quien se puede acceder a través de Python , escribí un script que monitoriza / dev / my-mouse para hacer clic en el botón del pulgar y enviar la tecla Ctrl al teclado virtual. Aquí están los pasos detallados:
1. Hacer reglas de udev
Queremos que los dispositivos sean accesibles (derechos y ubicación).
Para el ratón:
Udev buscará un dispositivo reconocido por el kernel con nombres como event5, y selecciono mi mouse con el nombre. La instrucción SYMLINK asegura que encontraré mi mouse en / dev / my_mx_mouse. El dispositivo será legible por un miembro del grupo "mxgrabber".
Para encontrar información sobre su hardware, debe ejecutar algo como
Para entrada:
No es necesario el enlace simbólico, uinput siempre estará
$/dev/uinput
o$/dev/input/uinput
dependerá del sistema en el que se encuentre. Solo dale el grupo y los derechos para leer Y escribir, por supuesto.Debe desenchufar: conecte el mouse y el nuevo enlace debería aparecer en / dev. Puede obligar a udev a activar sus reglas con
$udevadm trigger
2. Active el módulo UINPUT
Y para hacerlo persistente:
3. Crear nuevo grupo
O como sea que haya llamado a su grupo de acceso. Entonces deberías sumarte:
4. Script de Python
Necesita instalar la biblioteca python-uinput (obviamente) y la biblioteca python-evdev . Use pip o su paquete de distribución.
El script es bastante sencillo, solo tiene que identificar el código de evento del botón.
5. ¡Disfruta!
Todo lo que necesita ahora es hacer que su archivo de Python sea ejecutable y pedirle a su administrador de escritorio que cargue el archivo al inicio. ¡Quizás también una copa de vino para celebrar el buen trabajo!
6. Extra gratis
Yo uso xbindkeys para un comportamiento adicional. Por ejemplo, la siguiente configuración puede ser buena si tiene un mouse con clics en el lado de la rueda:
Para que esta última combinación funcione, debe deshabilitar el botón que configuró para el script python , de lo contrario, xbindkeys lo tomará. Solo debe permanecer la tecla Ctrl:
Recargar con
$ xmodmap ~/.Xmodmap
7. Conclusión
Como dije al principio, no estoy perfectamente contento con el hecho de que tengo que darme los derechos para escribir en / dev / uinput, incluso si se piensa que es el grupo "mxgrabber". Estoy seguro de que hay una forma más segura de hacerlo, pero no sé cómo.
En el lado positivo, funciona muy, muy bien. ¡Cualquier combinación de teclado o tecla del mouse que funcione con el botón Ctrl del teclado ahora funciona con la del mouse!
fuente
Encontré una solución con PyUserInput . Esto termina siendo bastante simple y no requiere derechos de administración. Con python 2 y PyUserInput instalados, utilicé el siguiente script:
Después de otorgar derechos de ejecución al script, lo llamo con una línea
~/.xsessionrc
, por ejemplo~ / ruta / a / script.py &
Nota . Esto no impide que se active el evento del botón del mouse. En mi caso, solía
xinput set-button-map
cambiar la asignación del botón xinput y asignar el número del botón que me interesaba a algo que no estaba en uso.Por ejemplo, si desea usar el botón 8 en su mouse pero el botón 8 ya tiene una función (por ejemplo
page-next
), puede usar lo siguiente.xsessionrc
Botón proporcionado
12
no tiene significado para el sistema operativo, y asignar una función personalizada para el botón12
de.xbuttonmodifier.py
, la secuencia de comandos que he descrito anteriormente.fuente
xinput
. Ver pregunta editada.Tengo una solución parcial No he descubierto cómo desasignar el botón existente, por lo que terminas haciendo clic en el botón y el modificador que deseas. Entonces, si ese botón del mouse tiene algún propósito existente, todavía se disparará. Por ejemplo, al reasignar el botón derecho del mouse a una tecla de control, se enviará un control + clic.
De todos modos, encontré una publicación en el foro que es similar a su pregunta para la cual la respuesta fue instalar btnx y configurar sus modificadores a través de eso. Parece que btnx ya no está disponible a través del repositorio. Hay un ppa, pero no funciona para el último ubuntu.
Publicación en el foro: publicación: http://ubuntuforums.org/showthread.php?t=1245930
Pero la fuente está disponible:
Puede compilarlo desde el origen, pero esto colocará archivos en su sistema que el administrador de paquetes no puede mantener.
A saber, los siguientes archivos:
Los siguientes enlaces simbólicos:
Entonces ... si no te importa construir desde la fuente ...
Obtenga las dependencias para btnx:
Si nunca ha construido nada desde la fuente, es posible que también necesite build-essential:
Luego obtenga y compile btnx:
Tiene una herramienta de configuración GUI separada. Obtenga las dependencias para ello:
Ahora obtenga y compile la herramienta de configuración de GUI:
Ahora ejecuta la herramienta:
Haga clic en Detectar botones del mouse Si desea poder leer las instrucciones mientras usa la herramienta, cambie el tamaño de la ventana que aparece, el texto del diálogo se recorta más tarde si no lo hace y si intenta cambiar el tamaño durante la detección, se cancelará La detección. Solo haz la ventana un poco más grande.
Haga clic en Presione para iniciar la detección del mouse, luego intente no mover el mouse hasta que el texto cambie ... Tarda unos 5-10 segundos. El texto cambiará. Cuando lo haga, ignore lo que dice y haga clic en Adelante.
Haga clic en el botón "Presione para iniciar la detección del botón"
Aquí hará clic en un botón de su mouse varias veces (hasta que la barra de estado se llene). Luego, establezca el nombre del botón en algo que reconocerá más adelante (por ejemplo: LeftButton) Haga clic en el botón Agregar.
Repita esto para cada botón del mouse (no olvide las ruedas de desplazamiento, los clics de desplazamiento, etc.). Probablemente pueda omitir cualquier botón que no quiera reasignar.
Cuando haya agregado todos los botones, haga clic en Aceptar.
En la GUI principal, haga clic en Botones, en el panel izquierdo, seleccione el botón que desea reasignar. Utilizará los nombres que ingresó en los pasos anteriores. Para sus propósitos, querrá seleccionar solo un modificador de clave en Combinación de teclas a la derecha.
No haga clic en Eliminar en esta pantalla, eliminará el botón. Tendrá que volver y detectar el botón nuevamente si lo hace.
Vuelva a la pantalla Conriguraciones y haga clic en reiniciar btnx.
Prueba el nuevo botón.
Si desea desinstalar las aplicaciones, detenga el programa btnx y luego vaya a los respectivos directorios desprotegidos de git y realice la desinstalación:
fuente