Rileva se viene premuto il pulsante del mouse, quindi invoca uno script o un comando


11

C'è un modo per ottenere lo stato del pulsante del mouse da bash? Xdotool può ottenere solo la posizione del mouse.

Vorrei impostare qualcosa in cui posso definire una regola in cui quando viene premuto un pulsante del mouse, uno script può essere eseguito.


Puoi certamente rilevare gli eventi del mouse , ma non credo che ci sia un modo per chiedere al sistema se il pulsante del mouse è attualmente premuto . Ogni analizzatore di attività del mouse che ho visto fa attenzione, se perdonerai lo pseudocodice MouseButton1Downe gli MouseButton1Upeventi su cui agire.
DopeGhoti il

Ho bisogno di uno script che guardi il mouse e quando viene premuto il pulsante sinistro, farà qualcosa.
MartinP,

Hai bisogno di chiarimenti. Vuoi qualcosa in cui quando ti trovi in ​​una shell e fai clic sulla finestra del terminale, quella specifica shell fa qualcosa? O lo vuoi in modo tale che quando fai clic su un pulsante specifico del mouse ovunque venga eseguito uno script (e non hai bisogno di vederlo in un terminale)?
Patrick,

Ho bisogno di script, che eseguirò e poi cercherà i pulsanti del mouse ovunque sul desktop. Non bloccherà il mouse, lo ascolterà soltanto. Ho provato a scrivere il programma per esso in C con Xlib, ma ha solo XGrabButton e XGrabPointer e che non voglio, perché prende il puntatore e un'altra finestra non registra gli eventi click.
MartinP,

Risposte:


11
xinput --query-state <mouse_id>

Questo ti dà uno stato per tutti i pulsanti del mouse, che assomiglia a questo:

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

Mouse_id può essere ottenuto da:

xinput --list

Ecco un piccolo script watcher per il pulsante 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

Potrebbe essere necessario modificare la stringa di rilevamento MOUSE_ID ("mouse") in qualcos'altro.


xinput --listmi dà X Input extension not available.. Purtroppo Google per questa faccenda non rivela nulla di utile nel mio caso: Xvnc4in una VM Debian minima. Probabilmente sono sfortunato
Tino,

6

È possibile utilizzare lo strumento da riga di comando xevper scoprire lo stato dei pulsanti del mouse all'interno dell'ambiente X.

Esempio

$ 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

Ma queste informazioni ti portano solo parzialmente a una soluzione. Le informazioni chiave che si desidera estrarre dall'alto sono il numero associato a un determinato pulsante del mouse. Nel mio esempio sto premendo il pulsante sinistro, "buton 1".

xbindkeys

È possibile utilizzare questo strumento per impostare un'azione associata a un pulsante premuto. Puoi persino impostare una regola che richiede la pressione di un tasto o anche un tasto + pulsante premuti insieme.

Esempio

Devi prima assicurarti che i pacchetti xbindkeys siano installati.

Quindi dovrai eseguire il comando seguente, una sola volta, per creare un file di configurazione xbindkeys modello.

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

Con il file creato puoi aprirlo in un editor di testo e aggiungere una regola come questa:

"xterm"
  b:3

Questa regola afferma che vogliamo eseguire il programma xtermquando viene premuto il pulsante 3. Il "pulsante 3" è il mio pulsante destro del mouse.

Con la modifica sopra apportata, dobbiamo eliminare xbindkeys se è già in esecuzione e quindi riavviarlo.

$ killall xbindkeys
$ xbindkeys

Ora, con questo in esecuzione ogni volta che faccio clic con il tasto destro del mouse, xtermverrà eseguito.

Riferimenti


2
Ma questo funziona solo per la finestra creata. Come posso catturare quell'evento a livello globale?
MartinP,

4

se vuoi semplicemente eseguire il comando bash in xterm al clic del mouse (o evento wheel) puoi provare questo esempio:

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

questo è per l'evento ruota (invece di fare clic su set 12)


Per favore, puoi spiegare?
lucaswxp,

2

Non puoi avere il tuo evento per premere il pulsante della torta e mangiarlo. Se si desidera che lo script riceva un evento del mouse, l'evento del mouse verrà inviato allo script anziché a qualsiasi altra applicazione, il che significa che lo script deve catturare l'evento del mouse. Se lo script non rivendica l'evento, viene visualizzata la finestra che dovrebbe visualizzarlo.

Se lo desideri, puoi inviare nuovamente l'evento del mouse alla finestra focalizzata o alla finestra a determinate coordinate ( xdotool click).

Puoi usare XBindKeys per eseguire uno script su determinati eventi del mouse o della tastiera.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.