¿Cómo reasignar automáticamente los botones de mi mouse al inicio?

30

Luché con esto durante el fin de semana y necesito reasignar los botones de mi mouse.

ancho de banda cero
fuente

Respuestas:

47

Tengo un mouse Logitech con 9 botones, y presionar el "botón central" (# 2) implica hacer clic en la rueda de desplazamiento. No me gusta esto porque soy torpe y generalmente termino desplazándome por la ventana en la que estoy cuando trato de hacer clic en la rueda. Así que quería reasignar automáticamente el botón lateral superior (# 9 en este caso) al botón central (# 2). También quería asignar el botón lateral inferior (# 8) para que ejecute un doble clic en el botón izquierdo (# 1).

Aunque mis objetivos eran específicos, las soluciones a continuación se pueden generalizar a cualquier situación en la que desee reasignar automáticamente los botones del mouse al inicio.

Asignación de botones del mouse a otros botones del mouse

Deberá xinputinstalarlo para esta tarea. Esto se puede hacer completamente en su .xsessionrcarchivo. Primero, use xinputpara descubrir el nombre asignado a su mouse, que luego se correlaciona con una ID de dispositivo de entrada. A continuación se muestra un ejemplo de salida de mi computadora portátil:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer            id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Laser Mouse              id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard           id=5    [slave  keyboard (3)]

Mi mouse se llama a sí mismo Logitech USB Laser Mousey se muestra como id=11. Su mouse tendrá un nombre diferente; darse cuenta de eso queda como un ejercicio para el lector.

Si bien aún conoce la identificación del dispositivo en esta sesión, descubra cuántos botones cree que tiene el controlador de entrada con el mouse . Esto puede ser diferente de la cantidad de botones que es evidente en el dispositivo.xinput list deviceID

Logitech USB Laser Mouse                    id=11   [slave  pointer  (2)]
    Reporting 7 classes:
        Class originated from: 11. Type: XIButtonClass
        Buttons supported: 16
        Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Forward" "Button Back" "Button Task" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"

Con mi mouse, solo hay 9 botones físicos obvios, pero xinputinforma 16.

Dada la naturaleza del USB, esta ID puede cambiar cada vez que reinicia, por lo que no es suficiente escribir algo que esté estáticamente codificado en una ID que descubra una vez. Tendrá que analizar esto dinámicamente al inicio y ejecutar su nueva asignación en función de la ID actual.

Ahora que conoce su nombre, puede usar xinput testpara averiguar qué tecla reasignar. Presione los botones del mouse desde los que desea asignar y para obtener sus índices. (Para referencia, 1, 2 y 3 "siempre" (es decir, generalmente) se refieren a los botones izquierdo, medio y derecho de un mouse de 3 botones. Un cambio de mapa común los invierte para hacer que el mouse sea zurdo. )

button press   2
button release 2
button press   9
button release 9

En este caso, descubrí que quiero asignar el botón n. ° 9 (lateral, superior) al botón n. ° 2 (centro).

Ahora que sabe cómo se llama su mouse y qué botones desea cambiar, puede escribir un ~/.xsessionrcscript que invoque xinputpara ejecutar la reasignación de botones al inicio. A continuación se muestra mi guión completo.

# Map button 9 (top side button) to button 2 (middle button)
my_mouse_id=$(xinput | grep "Logitech USB Laser Mouse" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16

La primera línea aquí establece una variable de sesión temporal igual a la ID del mouse según lo informado por xinput. Esto se hace usando grepel nombre conocido del mouse en el informe xinputy luego sedextrayendo el número de identificación de ese id=xxxtoken en el informe. Este valor luego se usa en una xinput set-button-mapdirectiva, que ejecuta la reasignación. En el ejemplo anterior, el único cambio es que el botón n. ° 9 se está reasignando para imitar el botón n. ° 2. Todos los demás permanecen en su configuración predeterminada.

Actualización: como señala @Lokasenna a continuación , si su dispositivo se presenta como un mouse y un teclado, es posible que deba limitar el recuento de resultados del grepuso -m 1.

Asignación de botones de mouse a funciones arbitrarias

Ver también esta respuesta .

Necesitará xinput, xbindkeysy xautomation(incluido xte) instalado para esta tarea.

Use xinput listy xinput testpara descubrir la identificación del dispositivo de su mouse y el número del botón que desea asignar. En mi caso, quería asignar el botón lateral inferior (# 8) a un doble clic en el botón izquierdo (# 1).

Crea o edita ~/.xbindkeysrc. El formato de este archivo es una serie de líneas emparejadas. La primera línea es un comando que se ejecutará para un evento; La segunda línea es la descripción del evento. Utilizaremos el xtecomponente de xautomationpara enviar eventos directamente al controlador de entrada.

Para crear un evento de doble clic cuando se suelta un botón, agregué lo siguiente:

"/usr/bin/xte 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release

Esta configuración asigna una secuencia de dos clics del mouse en el botón n. ° 1 a la liberación del botón n. ° 8. (En teoría, supongo que podría asignar cualquier comando a un botón del mouse, pero este es el caso más común. Consulte esta respuesta para ver otros ejemplos prácticos).

Actualización para Ubuntu 16.04

Para los usuarios con varios ratones conectados a su sistema, también debe pasar la identificación del dispositivo. Esto puede no aplicarse a todos los usuarios y fue descubierto en Ubuntu 16.04 con Unity.

xinput list

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Kensington      Kensington Expert Mouse   id=9    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=13   [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                     id=14   [slave  pointer  (2)]

Luego modifique el archivo .xbindkeysrc haciendo referencia al valor id = del resultado del comando (id = 9 en este ejemplo):

"/usr/bin/xte -i 9 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
ancho de banda cero
fuente
77
Gracias por la información. Parece que su awk necesitaría cambiar según la cantidad de palabras en el dispositivo. Solíased 's/^.*id=\([0-9]*\)[ \t].*$/\1/'
jbo5112
De acuerdo con la prueba de pulgar xinput, la tecla de activación dispara tres teclas diferentes: ¿cómo vincularlas todas juntas en .xbindkeysrc?
axltop
@ jbo5112 Acabo de comenzar a usar varios ratones en mi computadora portátil de trabajo y tuve una buena razón para volver a visitar su comentario. Ahora he reemplazado mi antigua awkdeclaración con su seddeclaración en mis ejemplos. Gracias por la mejora!
zerobandwidth
2
No hay necesidad de usar una identificación en set-button-map; por ejemplo:xinput set-button-map "Logitech Trackball" 1 3 3
jaustin
Problema inusual, supongo: xinputmuestra mi mouse dos veces, de esta manera: ↳ USB OPTICAL MOUSE id = 12 [puntero esclavo (2)] ↳ USB OPTICAL MOUSE id = 13 [puntero esclavo (2)] Solo ID 13 capturará comandos con xinput test. El script siempre capturará la primera ID. ¿Pero por qué es dos veces de todos modos? Ambos desaparecen cuando desconecto este mouse y reaparecen cuando estoy conectado.
w-sky
6

Los pasos cortos para esto son:

Hay una utilidad llamada xinput. xinput listo simplemente xinputmostrará todos los dispositivos de entrada X y sus ID. Aquí encontrará la identificación del mouse que desea reasignar.

Usaré mi ID como ejemplo, desde mi configuración, que es 21, luego xinput --get-button-map 21generaré

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Ahora, si quiere, por ejemplo, intercambiar los botones izquierdo y derecho, simplemente ejecute

xinput --set-button-map 21 3 2 1

Aquí estamos, la reasignación está hecha.

Para ejecutarlo al inicio, simplemente ponga esto en un archivo:

echo "xinput --set-button-map 21 3 2 1" > leftmouseremap.sh

darle permiso ejecutable

chmod +x leftmouseremap.sh 

Finalmente, agregue esto a la aplicación Statrtup manualmente desde la GUI o, si lo desea desde la CLI, coloque el texto a continuación (cambie las rutas a la suya) en un archivo en su ~/.config/autostart, aquí está el mío ( less .config/autostart/leftmouseremap.sh.desktop):

[Desktop Entry]
Type=Application
Exec=/home/ruslan/leftmouseremap.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=/home/ruslan/leftmouseremap.sh
Name=/home/ruslan/leftmouseremap.sh
Comment[en_US]=
Comment=

Tenga en cuenta que con KDE la ruta sería similar ~/.kde/Autosart, para otros administradores de escritorio esto podría ser muy diferente. Alternativamente, la ejecución de inicio se puede hacer con un enfoque general mediante el uso /etc/rc.local.

Ruslan Gerasimov
fuente
Esto resolvió mi problema de derrame de agua. Tengo botones de clic izquierdo / derecho debajo del panel táctil de mi computadora portátil. Derramé agua y ahora ambos botones envían una señal de clic medio al sistema operativo (descubrí esto usando la aplicación 'keymon'). Utilicé su método para reasignar el clic medio al clic izquierdo, para que al menos pueda disfrutar de una experiencia de clic izquierdo. Nunca uso el clic central, así que esto funciona perfectamente para mí :) Gracias por las sencillas instrucciones. Mi ID de dispositivo de entrada era 11, así que ejecuté "xinput --set-button-map 11 1 1 3" ¡Gracias!
Vahid Pazirandeh
3

Cuando se utiliza la excelente respuesta de zerobandwidth , algunos dispositivos, como MX Ergo de Logitech, aparecen como dispositivos de puntero y teclado :

⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech MX Ergo                          id=10   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=14   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ...
    ↳ Logitech MX Ergo                          id=15   [slave  keyboard (3)]

En consecuencia, grep "Logitech MX Ergo"termina devolviendo dos valores. Este último termina siendo incluido como el primer elemento en la cadena de mapeo y arruina todos los botones del mouse.

La solución es fácil: solo use grepel argumento de conteo máximo -m 1:

my_mouse_id=$(xinput | grep -m 1 "Logitech MX Ergo" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput --set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16
Lokasenna
fuente
Gran consejo; He editado la respuesta para incluirla. ¡Gracias!
zerobandwidth
1

Pude cambiar el mapeo del botón central de mi mouse Logitech a 'Volver' usando Easystroke Gesture Recognition, que descargué del Centro de software de Ubuntu. Editar: en la aplicación, debe seleccionar Agregar acción, asignarle un nombre, seleccionar el tipo de clave, hacer clic en Detalles y presionar Entrar, presionar Grabar trazo y, durante la solicitud, presionar el botón central.

atr15
fuente
1
Bienvenido a AskUbuntu. Debe proporcionar más detalles con su respuesta.
David
Ok, mira la edición anterior.
atr15
Buena atrapada. Pero lo que describió no funciona como lo indicó: en realidad, el botón central es el botón predeterminado para poner esa aplicación en 'modo de reconocimiento de gestos': al presionarla, la aplicación comienza a reconocer el gesto que está haciendo. Sin embargo, +1 porque esa aplicación tiene un módulo para revelar ID de botones de mouse; Esto ayuda cuando queremos usar xinputcon botones que no aparecen cuando se usa xinput list <devID>.
1111161171159459134
1
Oh, esto llegó 1 año después: su respuesta vale +1
1111161171159459134
1

Antes del 12.04, había una herramienta gráfica fácil llamada "btnx" en el repositorio estándar, que se agregaba como "Propiedades del botón" en la Configuración del sistema. Lamentablemente, sin embargo, se dejó caer. Aquí se encuentra un PPA "no confiable" para 14.04, 16.04 y 18.04: https://launchpad.net/~oliverstar/+archive/ubuntu/ppa (que se encuentra en https://launchpad.net/ubuntu/xenial/+source / btnx )

No se integrará con la configuración del sistema, pero funciona bastante bien en mi computadora portátil con un mouse barato de 5 botones. ¡También puede reasignarse a teclas y comandos y la configuración es mucho más simple que con cualquier otro método!

w-sky
fuente
Me pregunto si la herramienta está haciendo los mismos cambios, solo en segundo plano. ^ _ ^
ancho de banda cero
0

Tengo HP elitebook 2570p, Ubuntu 18.04.2. Aquí tengo un trackpoint que es inútil para mí y aquí hay 2 botones de trackpoint inútiles debajo del espacio

No uso estas teclas porque las tengo debajo del panel táctil. Me gustaría reasignar estos botones a left = back_button (Alt_L + Left), the right one = middle_mouse_button. El trackpoint en "xinput" es id = 11 y el botón izquierdo es el número 1, el derecho es el 3.

¿Podría alguien escribirme el código correcto para copiarlo en la terminal? Me he combinado con xbindkeysrc pero eso establece cualquier acción en ambos botones (trackpoint y touchpad)

Átomo
fuente
Hice esto y lo hice simplemente: <code> echo xinput set-button-map 11 8 1 2 >> ~ / .xsessionrc </code> Hace que mis botones de punto de contacto (id 11) hagan que la izquierda sea el octavo botón, el medio como clic izquierdo (no 1), y el clic derecho como middel y luego 'code' echo -e "\" / usr / bin / xte 'keydown Alt_L' 'key Izquierda' 'keyup Alt_L' & amp; \ "\ nb: 8" >> ~ / .xbindkeysrc 'código' Establece el botón no 8 (b: 8) en Alt_L + Izquierda => volver :) Ahora tengo 2 botones útiles del mouse
Atom