Detecta si se presiona el botón del mouse, luego invoca un script o comando

11

¿Hay alguna forma de obtener el estado del botón del mouse desde bash? Xdotool solo puede obtener la ubicación del mouse.

Me gustaría configurar algo donde pueda definir una regla donde cuando se presiona un botón del mouse, se puede ejecutar un script.

MartinP
fuente
Ciertamente puede detectar eventos del mouse , pero no creo que haya una manera de preguntarle al sistema si el botón del mouse se está presionando en este momento . Cada analizador de actividad de mouse que he visto vigila, si perdonas el pseudocódigo MouseButton1Downy los MouseButton1Upeventos para actuar.
DopeGhoti
Necesito un script que observe el mouse y cuando se presiona el botón izquierdo, hará algo.
MartinP
Necesita aclaración. ¿Desea algo donde, cuando está en un shell, y hace clic en la ventana del terminal, ese shell específico hace algo? ¿O lo desea para que cuando haga clic en un botón específico del mouse en cualquier lugar se ejecute un script (y no necesite ver el script en una terminal)?
Patrick
Necesito un script, que ejecutaré y luego buscará los botones del mouse en cualquier lugar del escritorio. No bloqueará el mouse, solo lo escuchará. Traté de escribir un programa en C con Xlib, pero solo tiene XGrabButton y XGrabPointer y eso no quiero, porque agarra el puntero y otras ventanas no registran eventos de clic.
MartinP

Respuestas:

11
xinput --query-state <mouse_id>

Esto le da un estado para todos los botones del mouse, que se ve así:

2 classes :
ButtonClass
    button[1]=up
    button[2]=up
    button[3]=up
    button[4]=up
    button[5]=up
    button[6]=up
    button[7]=up
    button[8]=up
    button[9]=up
    button[10]=up
    button[11]=up
    button[12]=up
    button[13]=up
    button[14]=up
    button[15]=up
    button[16]=up
ValuatorClass Mode=Relative Proximity=In
    valuator[0]=313
    valuator[1]=667
    valuator[2]=-20

El mouse_id se puede obtener de:

xinput --list

Aquí hay una pequeña secuencia de comandos del observador del botón del mouse:

#!/bin/bash

MOUSE_ID=$(xinput --list | grep -i -m 1 'mouse' | grep -o 'id=[0-9]\+' | grep -o '[0-9]\+')

STATE1=$(xinput --query-state $MOUSE_ID | grep 'button\[' | sort)
while true; do
    sleep 0.2
    STATE2=$(xinput --query-state $MOUSE_ID | grep 'button\[' | sort)
    comm -13 <(echo "$STATE1") <(echo "$STATE2")
    STATE1=$STATE2
done

Es posible que deba cambiar la cadena de detección MOUSE_ID ('mouse') por otra cosa.

Víctor
fuente
xinput --listme da X Input extension not available.. Lamentablemente, Google para este asunto no revela nada que sea útil en mi caso: Xvnc4en una máquina virtual Debian mínima. Probablemente no tengo suerte
Tino
6

Puede usar la herramienta de línea de comandos xevpara averiguar el estado de los botones de su mouse dentro del entorno X.

Ejemplo

$ xev
...
ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319064320, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

ButtonRelease event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319064439, (164,14), root:(166,101),
    state 0x100, button 1, same_screen YES

ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319065208, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

ButtonRelease event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319065337, (164,14), root:(166,101),
    state 0x100, button 1, same_screen YES

ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319066059, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

Pero esta información solo lo lleva parcialmente a una solución. La información clave que desea extraer de arriba es qué número está asociado con un botón particular de su mouse. En mi ejemplo, presiono el botón izquierdo "buton 1".

xbindkeys

Puede usar esta herramienta para configurar una acción asociada con un botón que se presiona. Incluso puede configurar una regla que requiera presionar una tecla o incluso presionar una tecla + un botón.

Ejemplo

Primero deberá asegurarse de que los paquetes xbindkeys estén instalados.

Luego, deberá ejecutar el siguiente comando, solo una vez, para crear un archivo de configuración de plantilla xbindkeys.

$ xbindkeys --defaults > /home/saml/.xbindkeysrc

Con el archivo creado, puede abrirlo en un editor de texto y agregar una regla como esta:

"xterm"
  b:3

Esta regla establece que queremos ejecutar el programa xtermcuando se presiona el botón 3. El "botón 3" es mi botón derecho del mouse.

Con el cambio anterior realizado, necesitamos eliminar xbindkeys si ya se está ejecutando y luego reiniciarlo.

$ killall xbindkeys
$ xbindkeys

Ahora con esto ejecutándose cada vez que hago clic con el botón derecho del mouse, xtermse ejecutará un

Referencias

slm
fuente
2
Pero eso solo funciona para la ventana creada. ¿Cómo puedo ver ese evento a nivel mundial?
MartinP
4

si solo desea ejecutar el comando bash en xterm al hacer clic con el mouse (o evento de rueda) puede probar este ejemplo:

$ echo -e "\e[?1000h"
$ while read -n 6; do echo hellowworld; done

esto es para evento de rueda (para clic set 12 en su lugar)

Ivan M
fuente
Por favor, ¿puedes explicar?
lucaswxp
2

No puede tener su evento de prensa de botón de pastel y comérselo. Si desea que su script reciba un evento de mouse, entonces el evento del mouse se enviará a su script en lugar de a cualquier otra aplicación, lo que significa que su script debe tomar el evento del mouse. Si su script no reclama el evento, entonces la ventana que debería obtenerlo lo recibe.

Si lo desea, puede reenviar el evento del mouse a la ventana enfocada o la ventana en las coordenadas dadas ( xdotool click).

Puede usar XBindKeys para ejecutar un script en ciertos eventos de mouse o teclado.

Gilles 'SO- deja de ser malvado'
fuente