esta respuestamuestre las líneas de comando para intercambiar el botón primario y secundario del mouse. Sin embargo, me gustaría tener un script que intercambie automáticamente los botones del mouse cada vez que se ejecute. ¿Alguien podría indicarme cómo hacer esto? No sé casi nada sobre scripts bash.
Respuesta1
Sin proporcionar la salida de xinput list
onsusistema, nadie puede ofrecer una respuesta que usted pueda utilizar directamente. Esto se debe a que xinput
puede mostrar dispositivos diferentes a los ilustrados en¿Cómo cambio los botones del mouse para que sean zurdos desde la terminal?.
Por ejemplo, aquí está el resultado en OSX:
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ xquartz virtual pointer id=6 [slave pointer (2)]
⎜ ↳ pen id=8 [slave pointer (2)]
⎜ ↳ cursor id=9 [slave pointer (2)]
⎜ ↳ eraser id=10 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ xquartz virtual keyboard id=7 [slave keyboard (3)]
y aquí está el resultado en mi Debian/testing:
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ VMware VMware Virtual USB Mouse id=7 [slave pointer (2)]
⎜ ↳ VirtualPS/2 VMware VMMouse id=9 [slave pointer (2)]
⎜ ↳ VirtualPS/2 VMware VMMouse id=10 [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)]
↳ AT Translated Set 2 keyboard id=8 [slave keyboard (3)]
de modo que en un sistema posiblemente haya una identificación para elegir (puntero virtual xquartz), mientras que en otro hay tres posibilidades. Si los lee, encontrará que los ejemplos citados aquí no son artificiales:
- ¿Cómo puedo cambiar la asignación de teclas del mouse?
- La 'lista de entradas xinput' muestra el mismo dispositivo dos veces y los ID de los dispositivos cambian: ¿cómo usar 'set-prop' en un script?
Dada la variación (y vagadocumentación paraxinput
), probablemente no pueda automatizar la parte relativa a la obtención de la identificación del dispositivo del mouse.
Supongamos que elige un identificador utilizable y, para facilitar la discusión, llámelo "12". Un script puede leer la salida de
xinput get-button-map 12
en una matriz. Algunos lenguajes de programación proporcionan matrices, por ejemplo, bash
. Pero hay varios obstáculos:
- en mi sistema OSX, devuelve una lista "1 2 3", mientras que en el sistema Debian devuelve una lista "1 2 3 4 5 6 7 8 9 10 11 12".
- tienes que adivinar si los botones adicionales significan algo, y
- Incluso la asignación de tres números de botones puede no ser la izquierda/centro/derecha obvia.
Luego, el script para alternar las claves tiene que guardar su estado en algún lugar, por ejemplo, un archivo en su directorio de inicio. Un script para gestionar eso tendría que
- inicializar el archivo con los botones actuales
- actualícelo de acuerdo con su esquema de botones de alternancia (con 3, hay "3!" posibles arreglos)
Suponiendo que tiene la configuración (e interpretación) más simple, podría hacer algo como esto en un script:
#!/bin/sh
id=$1
cfg=$HOME/.mousebuttons
[ -f "$cfg" ] || xinput get-button-map $id | awk ' { printf "normal: %s\n", $0; }' >$cfg
mode=$(awk '{print $1;}' <$cfg)
# read and toggle
list=$(awk '{printf "%d %d %d\n", $3, $2, $4; }' <$cfg)
if [ "x$mode" = "xnormal" ]
then
mode=reverse
else
mode=normal
fi
# update the configuration
echo "$mode $list" | awk '{ printf "%s %d %d %d\n", $1, $2, $3, $4; }' >$cfg
xinput set-button-map $id $list
# show result
xinput get-button-map $id
El script acepta un parámetro (el identificador del dispositivo del mouse). Para el ejemplo dado (y nombrar el script "botones de alternancia", hacerlo ejecutable y colocarlo en su $PATH
):
toggle-buttons 12
debería hacer el trabajo.
Respuesta2
Agregaré mi propia solución a esto ya que las otras respuestas a veces parecen demasiado complicadas para la simple tarea de intercambiar los botones principales (1 y 3) de un mouse.
#!/bin/bash
set -e
# To get the name of a devices, do "xinput list --name-only"
DEVICE_NAME="PixArt Microsoft USB Optical Mouse"
current_button_map=$(xinput get-button-map "$DEVICE_NAME")
if [[ $current_button_map =~ "1 2 3" ]]; then
echo "Making the mouse a lefty"
xinput set-button-map "$DEVICE_NAME" 3 2 1
else
echo "Making the mouse a righty"
xinput set-button-map "$DEVICE_NAME" 1 2 3
fi
Respuesta3
Haría algo como:
#!/bin/sh
mxid=$(xinput --list --short | awk '/Razer/{gsub(/.*id=/, "");gsub(/[[:blank:]].*/, "");print}')
bmap=$(xinput get-button-map $mxid)
nmap=$(awk '{s=$1;$1=$3;$3=s};1' <<<$bmap)
xinput set-button-map $mxid $nmap
Esto supone que conoces el "nombre" de tu mouse (en mi caso es Razer
) y conoces la asignación de botones predeterminada (es decir, qué botones están a la izquierda y a la derecha para que puedas intercambiarlos) que obtienes con xinput list $mxid
:
Button labels: "Button Left" "Button Middle" "Button Right"....
y xinput get-button-map $mxid
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Como puede ver, en mi caso, 1 =>> left
el 3 =>> right
script anterior simplemente lee el mapeo actual e intercambia el primer y tercer valor y luego establece el nuevo mapeo.
Respuesta4
Si necesita alternar un estado (y el orden inverso/inverso de las teclas del mouse es ese estado), del dispositivo debe poder consultar el estado actual del dispositivo o mantener el estado en algún archivo.
Como no pude encontrar si xinput
hay una manera de pedirle al mouse la asignación de botones, probablemente deberías almacenar el estado en un archivo, por ejemplo ~/.config/mousebuttons
. Su secuencia de comandos debe escribir 'inversa' en el archivo cuando se ejecuta:
xin ingrese set-button-map 12 3 2 1 y escriba 'normal' en ese archivo al ejecutar:
xinput set-button-map 12 2 3 La acción real a realizar depende de la lectura del archivo: realice el primer paso si el contenido del archivo cuando se inicia el script es normal
(o el archivo no existe), y realice el segundo si el contenido son reverse
.
El contenido del archivo cambia de reverse
a normal
en cada invocación. Es posible que su estado real no refleje el contenido del archivo, por ejemplo, después de reiniciar; por lo tanto, imprima en la pantalla cuál es el nuevo estado para tener un recordatorio visual. Si el archivo no está sincronizado con el estado, una sola invocación de su secuencia de comandos lo sincronizará nuevamente.