Sprawdź, czy przycisk myszy jest wciśnięty, a następnie wywołaj skrypt lub polecenie

11

Czy jest jakiś sposób na uzyskanie stanu przycisku myszy z bash? Xdotool może uzyskać tylko lokalizację myszy.

Chciałbym ustawić coś, w czym mogę zdefiniować regułę, w której po naciśnięciu przycisku myszy skrypt może zostać wykonany.

MartinP
źródło
Z pewnością można wykryć zdarzenia związane z myszą , ale nie sądzę, że istnieje sposób, aby zapytać system, czy przycisk myszy jest obecnie naciskany . Każdy analizator aktywności myszy, którego widziałem, obserwuje, jeśli wybaczysz pseudokod MouseButton1Downi MouseButton1Upzdarzenia, na które należy zareagować.
DopeGhoti
Potrzebuję skryptu, który będzie obserwował mysz, a kiedy zostanie naciśnięty lewy przycisk, zrobi coś.
MartinP
Potrzebuje wyjaśnienia. Czy chcesz czegoś, co znajduje się w powłoce i klikniesz okno terminala, ta konkretna powłoka coś robi? A może chcesz, aby po kliknięciu określonego przycisku myszy w dowolnym miejscu uruchomiono skrypt (i nie musisz widzieć skryptu w terminalu)?
Patrick
Potrzebuję skryptu, który uruchomię, a następnie będzie szukał przycisków myszy w dowolnym miejscu na pulpicie. Nie blokuje myszy, tylko jej słucha. Próbowałem napisać program w C w Xlib, ale ma on tylko XGrabButton i XGrabPointer i tego nie chcę, ponieważ chwyta wskaźnik, a inne okna nie rejestrują zdarzeń kliknięcia.
MartinP

Odpowiedzi:

11
xinput --query-state <mouse_id>

To daje stan dla wszystkich przycisków myszy, który wygląda następująco:

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 można uzyskać z:

xinput --list

Oto mały skrypt obserwatora przycisku myszy:

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

Być może trzeba zmienić ciąg wykrywający MOUSE_ID („mysz”) na coś innego.

Zwycięzca
źródło
xinput --listdaje mi X Input extension not available.. Niestety Google w tej kwestii nie ujawnia niczego, co byłoby pomocne w moim przypadku: Xvnc4w minimalnej maszynie wirtualnej Debiana. Prawdopodobnie nie mam szczęścia
Tino
6

Możesz użyć narzędzia wiersza poleceń, xevaby sprawdzić stan przycisków myszy w środowisku X.

Przykład

$ 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

Ale ta informacja tylko częściowo prowadzi do rozwiązania. Kluczową informacją, którą chcesz wyodrębnić z powyższego, jest to, który numer jest powiązany z określonym przyciskiem myszy. W moim przykładzie naciskam lewy przycisk „buton 1”.

xbindkeys

Możesz użyć tego narzędzia, aby skonfigurować akcję związaną z naciśnięciem przycisku. Możesz nawet ustawić regułę, która wymaga naciśnięcia klawisza lub nawet naciśnięcia klawisza + przycisku.

Przykład

Musisz najpierw upewnić się, że pakiety xbindkeys są zainstalowane.

Następnie musisz uruchomić następujące polecenie, tylko raz, aby utworzyć szablonowy plik konfiguracyjny xbindkeys.

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

Po utworzeniu pliku możesz go otworzyć w edytorze tekstu i dodać następującą regułę:

"xterm"
  b:3

Ta reguła mówi, że chcemy uruchomić program xtermpo naciśnięciu przycisku 3. „Przycisk 3” to mój prawy przycisk myszy.

Po wprowadzeniu powyższej zmiany musimy zabić xbindkeys, jeśli jest już uruchomiony, a następnie uruchomić go ponownie.

$ killall xbindkeys
$ xbindkeys

Teraz z tym działaniem za każdym razem, gdy kliknę prawym przyciskiem myszy, xtermzostanie wykonane.

Bibliografia

slm
źródło
2
Ale to działa tylko dla utworzonego okna. Jak mogę złapać to wydarzenie na całym świecie?
MartinP
4

jeśli chcesz po prostu uruchomić polecenie bash w xterm po kliknięciu myszą (lub zdarzeniu koła), możesz wypróbować ten przykład:

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

to jest dla zdarzenia koła (zamiast zestawu kliknięć 12)

Ivan M.
źródło
Czy możesz to wyjaśnić?
lucaswxp
2

Nie możesz mieć wydarzenia z wciśnięciem przycisku ciasta i zjeść. Jeśli chcesz, aby skrypt odbierał zdarzenie myszy, zdarzenie myszy zostanie wysłane do skryptu zamiast do dowolnej innej aplikacji - oznacza to, że skrypt musi pobrać zdarzenie myszy. Jeśli skrypt nie odbiera zdarzenia, pobiera je okno, które powinno je pobrać.

Jeśli chcesz, możesz ponownie wysłać zdarzenie myszy do wybranego okna lub okna o podanych współrzędnych ( xdotool click).

Możesz użyć XBindKeys do wykonania skryptu dla określonych zdarzeń myszy lub klawiatury.

Gilles „SO- przestań być zły”
źródło