Manipulowanie klawiszem X i wskaźnikiem w linii poleceń

20

Jakie narzędzia wiersza polecenia istnieją do wyświetlania i zarządzania chwytaniami X server? (To jest chwytanie jak w przypadku chwytania klawiszy i wskaźników, tj. Ograniczanie użycia określonego klawisza lub przycisku myszy do określonej aplikacji, lub ograniczanie wskaźnika myszy do pozostawania w określonym obszarze ekranu.) Szukam hipotetycznego xgrabnarzędzia, które pokaż rzeczy jak

Key     0x00f00ba5  0x123   0
Button  0x00f00ba5  2       
Pointer 0x00abcdef  

co oznacza, że doszło do połączenia XGrabKey(display, 0x123, 0, 0x00f00ba5, ...)i tak dalej z XGrabButton, XGrabPointer, XGrabKeyboard, XGrabServer(jeśli to możliwe). Format wyświetlania nie ma znaczenia, to, co chcę, to sposób, aby zobaczyć, kto chwyta, i być może jakiś sposób na odwołanie tych chwytów (jeśli to możliwe, nie jestem pewien, czy interfejs API X11 na to pozwala).

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

Odpowiedzi:

21

Najnowsze wersje X (serwer X.org ≥1.11) obsługują kilka kluczy debugowania, wprowadzonych w tym zatwierdzeniu . Po uruchomieniu wykonują one czynności związane z chwytaniem.

Domyślnie ( przynajmniej w najnowszych wersjach ) są one wyłączone (nieobecne w domyślnej mapie klawiszy).

Jednakże, jeśli masz xdotoolzainstalowany, to jest możliwe, aby połączyć je, wykonując w wierszu poleceń:

xdotool key NameOfKey

gdzie NameOfKeyjest klawisz, który chcesz aktywować. Na przykład, aby wydrukować listę aktywnych grabów do dziennika serwera X, użyj xdotool key XF86LogGrabInfo.

Odpowiednie klucze to:

Zauważ, że XF86LogGrabInfowyświetla tylko aktywne chwytania, a nie pasywne chwytania, takie jak chwytanie klawisza, który nie jest aktualnie wciśnięty. Jeśli chcesz uzyskać informacje na temat pasywnego chwytania, musisz aktywować chwytanie: biegnij, xdotool key XF86LogGrabInfogdy jest naciśnięta kombinacja klawiszy akordów lub przycisków myszy, którą jesteś zainteresowany. Zrób coś takiego:

  1. Biegać sleep 1; xdotool key XF86LogGrabInfo
  2. W ciągu 1 sekundy naciśnij kombinację klawiszy lub przycisk myszy.
  3. Po 1 sekundzie zwolnij klawisz / przycisk.
  4. Sprawdź informacje „Active grab…” w dzienniku serwera X (często /var/log/Xorg.0.log).
Ślimak mechaniczny
źródło
2
Testowanie teraz na wheezy Debiana z Xorg 1.12.4, xdotool key XF86LogGrabInfowyzwala tylko dwa wpisy w dzienniku X: „Drukowanie wszystkich aktualnie aktywnych chwytów urządzeń:”, a następnie „Koniec listy aktywnych chwytów urządzeń”. Jednak mój menedżer okien chwyta pęk kluczy. Widziałeś już tę pracę z chwytanymi kluczami?
Gilles „SO- przestań być zły”
4
@Gilles - nie, nie uzyskasz żadnego wyjścia, jeśli uruchomisz go w ten sposób ... spróbuj go uruchomić sleep 2; xdotool key "XF86LogGrabInfo"i od razu zacznij bardzo szybko naciskać klawisz (np. Klawisz „Win”), a wtedy zobaczysz jakieś wyjście w Xorg.log. Lub xdotoolnaciśnij jednocześnie klawisze + XF86LogGrabInfo, tak jak tutaj
don_crissti
@don_crissti Ach, widzę, XF86LogGrabInfodrukuje tylko informacje o aktualnie wciśniętym klawiszu? To ogranicza jego przydatność. Chcę wymienić wszystkie chwytaki - wszystkie pasywne, jeśli dobrze rozumiem terminologię.
Gilles „SO- przestań być zły”
Prawdopodobnie istnieje sprytny sposób na połączenie tego z wyczerpującym skryptowym wyszukiwaniem kombinacji klawiszy, miejmy nadzieję bez wirtualnej klawiatury. Z pewnością poza moją wiedzą.
Adam Katz
Dzięki! Pomogło mi to odkryć, że xfsettingsdkradłem mój Win+ Lskrót.
Mikel
8

Nie wiem nic poza zasięgiem pasywnych chwytów 1 jednego klawisza lub przycisku, które mogą być obecne, ale istnieje kilka sposobów, aby wyświetlić listę aktywnych chwytów całej klawiatury lub myszy.

  1. Na wszystkich platformach, ale tylko z Xorg 1.11 i nowszymi (lub starszą wersją z zastosowaną łatką), mapuj skróty, aby zrzucić dane do dziennika, jak opisano w tych uwagach o poprawce .
  2. Solaris 11 (albo Solaris 11 ekspresowe 2010,11 lub rzeczywisty Solaris 11 release), za pomocą debugera skryptów takich jak /usr/demo/Xserver/mdb/list_Xserver_devicegrab_client, jak to opisano w chwytając Informacje z X Server . Jest tu także jeden do przechwytywania serwerów, którego obecnie nie obejmują skróty klawiszowe Xorg 1.11.

1 Zobacz http://tronche.com/gui/x/xlib/input/pointer-grabbing.html definicję chwytów aktywnych i pasywnych.

alanc
źródło
4

Jest to dodatek do odpowiedzi ślimaka mechanicznego -

Wpisy w dzienniku Xorg mogą być dość nieczytelne. Napisałem program, który analizuje je i przedstawia w formie możliwej do zrozumienia dla człowieka:

https://gist.github.com/CyberShadow/6412d11aea64144f8905cc0b8196f38e

Aby użyć, najpierw uruchom xdotool key XF86LogGrabInfo, jak opisano w odpowiedzi Mechanicznego ślimaka. Następnie uruchom powyższy program. Jeśli plik dziennika Xorg nie znajduje się w /var/log/Xorg.0.log, możesz określić jego lokalizację za pomocą --xorg-logopcji. Zobacz --helpszczegóły.

Vladimir Panteleev
źródło
1
Wspomniana tu gista jest programowana w języku D. Aby uzyskać plik wykonywalny, można zainstalować pakiety gdc(kompilator GNU D), a libx11-devnastępnie uruchomić gdc -o xorg-show-grabs xorg-show-grabs.d -lX11.
Stéphane Gourichon