Détecter si le bouton de la souris est enfoncé, puis appeler un script ou une commande

11

Existe-t-il un moyen d'obtenir l'état du bouton de la souris à partir de bash? Xdotool ne peut obtenir que l'emplacement de la souris.

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

MartinP
la source
Vous pouvez certainement détecter des événements de souris , mais je ne pense pas qu'il existe un moyen de demander au système si vous appuyez actuellement sur le bouton de la souris . Chaque analyseur d'activité de souris que j'ai vu surveille, si vous pardonnez le pseudocode MouseButton1Downet les MouseButton1Upévénements sur lesquels agir.
DopeGhoti
J'ai besoin d'un script qui surveillera la souris et lorsque le bouton gauche sera enfoncé, il fera quelque chose.
MartinP
Besoin d'éclaircissements. Voulez-vous quelque chose où, lorsque vous êtes dans un shell, et que vous cliquez sur la fenêtre du terminal, ce shell spécifique fait quelque chose? Ou le souhaitez-vous pour que lorsque vous cliquez sur un bouton de souris spécifique n'importe où un script est exécuté (et vous n'avez pas besoin de voir le script dans un terminal)?
Patrick
J'ai besoin d'un script, que j'exécuterai, puis il surveillera les boutons de la souris n'importe où sur le bureau. Il ne bloquera pas la souris, il l'écoutera seulement. J'ai essayé d'écrire un programme pour cela en C avec Xlib, mais il n'a que XGrabButton et XGrabPointer et ce que je ne veux pas, car il saisit le pointeur et une autre fenêtre n'enregistre pas les événements de clic.
MartinP

Réponses:

11
xinput --query-state <mouse_id>

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

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

Le mouse_id peut être obtenu à partir de:

xinput --list

Voici un petit script d'observateur de bouton 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 remplacer la chaîne de détection MOUSE_ID («souris») par autre chose.

Victor
la source
xinput --listme donne X Input extension not available.. Malheureusement, Google ne révèle rien qui soit utile dans mon cas: Xvnc4dans une machine virtuelle Debian minimale. Je n'ai probablement pas de chance
Tino
6

Vous pouvez utiliser l'outil de ligne de commande xevpour connaître l'état des boutons 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 ces informations ne vous permettent que partiellement de trouver une solution. Les informations clés que vous souhaitez extraire ci-dessus sont le numéro associé à un bouton particulier de votre souris. Dans mon exemple, j'appuie sur le bouton gauche, "buton 1".

xbindkeys

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

Exemple

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

Ensuite, vous devrez exécuter la commande suivante, une seule fois, pour créer un fichier de configuration de modèle xbindkeys.

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

Une fois le fichier créé, vous pouvez l'ouvrir dans un éditeur de texte et ajouter une règle comme celle-ci:

"xterm"
  b:3

Cette règle stipule que nous voulons exécuter le programme xtermlorsque le bouton 3 est enfoncé. Le "bouton 3" est le bouton droit de ma souris.

Avec le changement ci-dessus, nous devons tuer xbindkeys s'il est déjà en cours d'exécution, puis le redémarrer.

$ killall xbindkeys
$ xbindkeys

Maintenant que cela fonctionne à chaque fois que je clique sur le bouton droit de la souris, un xtermsera exécuté.

Les références

slm
la source
2
Mais cela ne fonctionne que pour la fenêtre créée. Comment puis-je attraper cet événement à l'échelle mondiale?
MartinP
4

si vous voulez simplement exécuter la commande bash dans xterm sur un clic de souris (ou un événement de roue), vous pouvez essayer cet exemple:

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

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

Ivan M
la source
Pouvez-vous expliquer?
lucaswxp
2

Vous ne pouvez pas avoir votre événement de presse de bouton de gâteau et le manger. Si vous voulez que votre script reçoive un événement de souris, alors l'événement de souris sera envoyé à votre script au lieu de toute autre application - cela signifie que votre script doit saisir l'événement de souris. Si votre script ne revendique pas l'événement, la fenêtre qui devrait l'obtenir l'obtient.

Si vous le souhaitez, vous pouvez renvoyer l'événement de la souris à la fenêtre focalisée ou à la fenêtre aux coordonnées données ( xdotool click).

Vous pouvez utiliser XBindKeys pour exécuter un script sur certains événements de souris ou de clavier.

Gilles 'SO- arrête d'être méchant'
la source