Ermitteln Sie, ob die Maustaste gedrückt wurde, und rufen Sie dann ein Skript oder einen Befehl auf

11

Gibt es eine Möglichkeit, den Zustand der Maustaste aus der Bash zu ermitteln? Xdotool kann nur die Position der Maus ermitteln.

Ich möchte etwas einrichten, in dem ich eine Regel definieren kann, nach der beim Drücken einer Maustaste ein Skript ausgeführt werden kann.

MartinP
quelle
Sie können sicher Maus erkennen Ereignisse , aber ich glaube nicht , dass es eine Möglichkeit , das System zu fragen , ob die Maustaste zur Zeit gerade gedrückt wird . Jeder Mausaktivitäts-Parser, den ich gesehen habe, überwacht, ob Sie den Pseudocode MouseButton1Downund die MouseButton1UpEreignisse, auf die Sie reagieren müssen, verzeihen .
DopeGhoti
Ich brauche ein Skript, das die Maus überwacht und beim Drücken der linken Taste etwas bewirkt.
MartinP
Benötigen Sie eine Klärung. Möchten Sie etwas, wo, wenn Sie sich in einer Shell befinden und Sie auf das Terminalfenster klicken, diese bestimmte Shell etwas tut? Oder möchten Sie, dass beim Klicken auf eine bestimmte Maustaste an einer beliebigen Stelle ein Skript ausgeführt wird (und Sie das Skript nicht in einem Terminal anzeigen müssen)?
Patrick
Ich benötige ein Skript, das ich ausführen werde und dann überall auf dem Desktop nach Maustasten Ausschau hält. Die Maus wird nicht blockiert, sondern nur angehört. Ich habe versucht, ein Programm dafür in C mit Xlib zu schreiben, aber es hat nur XGrabButton und XGrabPointer und das möchte ich nicht, weil es den Zeiger erfasst und ein anderes Fenster keine Klickereignisse registriert.
MartinP

Antworten:

11
xinput --query-state <mouse_id>

Dies gibt Ihnen einen Status für alle Maustasten, der so aussieht:

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

Die mouse_id kann bezogen werden von:

xinput --list

Hier ist ein kleines Skript zur Überwachung von Maustasten:

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

Möglicherweise müssen Sie die Erkennungszeichenfolge MOUSE_ID ('mouse') in eine andere Zeichenfolge ändern.

Sieger
quelle
xinput --listgibt mir X Input extension not available.. Leider enthüllt Google in dieser Angelegenheit nichts, was in meinem Fall hilfreich ist: Xvnc4In einer minimalen Debian-VM. Wahrscheinlich habe ich Pech
Tino
6

Mit dem Befehlszeilentool können Sie xevden Status der Maustasten in der X-Umgebung ermitteln.

Beispiel

$ 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

Mit diesen Informationen gelangen Sie jedoch nur teilweise zu einer Lösung. Die Schlüsselinformation, die Sie oben extrahieren möchten, ist die Nummer, die einer bestimmten Taste Ihrer Maus zugeordnet ist. In meinem Beispiel drücke ich die linke Taste "Taste 1".

xbindkeys

Mit diesem Tool können Sie eine Aktion einrichten, die mit einem gedrückten Knopf verknüpft ist. Sie können sogar eine Regel einrichten, für die ein Tastendruck oder sogar eine Taste + gleichzeitig gedrückt werden muss.

Beispiel

Sie müssen zuerst sicherstellen, dass die Pakete xbindkeys installiert sind.

Anschließend müssen Sie den folgenden Befehl nur einmal ausführen, um eine Vorlage für die xbindkeys-Konfigurationsdatei zu erstellen.

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

Mit der erstellten Datei können Sie sie in einem Texteditor öffnen und eine Regel wie die folgende hinzufügen:

"xterm"
  b:3

Diese Regel besagt, dass wir das Programm ausführen möchten, xtermwenn die Taste 3 gedrückt wird. Die "Taste 3" ist meine rechte Maustaste.

Mit der obigen Änderung müssen wir xbindkeys töten, wenn es bereits läuft, und es dann neu starten.

$ killall xbindkeys
$ xbindkeys

Jetzt, da dies immer läuft, wenn ich die rechte Maustaste drücke, xtermwird eine ausgeführt.

Verweise

slm
quelle
2
Das funktioniert aber nur für das erstellte Fenster. Wie kann ich dieses Ereignis global erfassen?
MartinP
4

Wenn Sie nur den Befehl bash in xterm per Mausklick (oder Rad-Ereignis) ausführen möchten, können Sie folgendes Beispiel ausprobieren:

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

Dies ist für Rad-Event (für Klick-Set 12 stattdessen)

Ivan M
quelle
Können Sie das bitte erklären?
Lucaswxp
2

Sie können nicht Ihre Kuchen- Knopf-Presse-Veranstaltung haben und es essen. Wenn Sie möchten, dass Ihr Skript ein Mausereignis empfängt, wird das Mausereignis anstelle einer anderen Anwendung an Ihr Skript gesendet. Dies bedeutet, dass Ihr Skript das Mausereignis abrufen muss. Wenn Ihr Skript das Ereignis nicht beansprucht, wird es von dem Fenster abgerufen, das es erhalten soll.

Wenn Sie möchten, können Sie das Mausereignis erneut an das fokussierte Fenster oder das Fenster an den angegebenen Koordinaten senden ( xdotool click).

Mit XBindKeys können Sie ein Skript für bestimmte Maus- oder Tastaturereignisse ausführen.

Gilles 'SO - hör auf böse zu sein'
quelle