Détecter si le button de la souris est enfoncé, puis invoquer un script ou une command

Y at-il un moyen d'get l'état du button de la souris à partir de bash? Xdotool peut seulement get l'location de la souris.

Je voudrais mettre en place quelque chose où je peux définir une règle où quand un button de la souris est pressé, un script peut être exécuté.

 xinput --query-state <mouse_id> 

Cela vous donne un état pour tous les buttons de la souris, qui ressemble à ceci:

 2 classs : 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 

Le mouse_id peut être obtenu à partir de:

 xinput --list 

Voici un petit script d'observateur de button de souris:

 #!/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 

Vous devrez peut-être changer la string de détection MOUSE_ID ('souris') en quelque chose d'autre.

Vous pouvez utiliser l'outil de command line xev pour connaître l'état des buttons de votre souris dans l'environnement X.

Exemple

 $ 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 

Mais cette information ne vous apporte que partiellement une solution. L'information key que vous voulez extraire de ci-dessus est quel numéro est associé à un button particulier de votre souris. Dans mon exemple, j'appuie sur le button gauche, "buton 1".

xbindkeys

Vous pouvez utiliser cet outil pour configurer une action associée à un button pressé. Vous pouvez même configurer une règle qui nécessite une pression sur une touche ou même une touche + touche enfoncée.

Exemple

Vous devrez d'abord vous assurer que les packages xbindkeys sont installés.

Ensuite, vous devrez exécuter la command suivante, une seule fois, pour créer un file de configuration model xbindkeys.

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

Avec le file créé, vous pouvez l'ouvrir dans un éditeur de text et append une règle comme celle-ci:

 "xterm" b:3 

Cette règle stipule que nous voulons exécuter le programme xterm lorsque le button 3 est pressé. Le "button 3" est mon button droit de la souris.

Avec la modification ci-dessus, nous avons besoin de tuer xbindkeys s'il est déjà en cours d'exécution, puis redémarrez-le.

 $ killall xbindkeys $ xbindkeys 

Maintenant avec cette exécution à chaque fois que je clique sur le button droit de la souris, un xterm sera exécuté.

Les references

  • xev man page
  • Comment changer les fonctions des buttons de la souris sous Linux
  • Raccourcis keyboard avec xbindkeys

Vous ne pouvez pas avoir votre événement de presse de button de gâteau et le manger. Si vous souhaitez que votre script reçoive un événement souris, l'événement souris sera envoyé à votre script plutôt qu'à n'importe quelle autre application, ce qui signifie que votre script doit saisir l'événement souris. Si votre script ne réclame pas l'événement alors la window qui devrait l'get l'obtient.

Si vous le souhaitez, vous pouvez renvoyer l'événement souris à la window ciblée ou à la window à des coordonnées données ( xdotool click ).

Vous pouvez utiliser XBindKeys pour exécuter un script sur certains events de la souris ou du keyboard.

si vous voulez juste exécuter la command bash dans xterm en cliquant sur la souris (ou l'événement wheel), vous pouvez essayer cet exemple:

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

c'est pour l'événement de la roue (pour le jeu de clic 12 à la place)