Script para intercambiar los botones primario y secundario del mouse

Script para intercambiar los botones primario y secundario del mouse

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 listonsusistema, nadie puede ofrecer una respuesta que usted pueda utilizar directamente. Esto se debe a que xinputpuede 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:

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 =>> leftel 3 =>> rightscript 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 xinputhay 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 reversea normalen 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.

información relacionada