Jak wymusić zwolnienie modyfikatorów klawiatury

18

Czasami, gdy korzystam z synergii między moimi komputerami, gdy korzystam z pełnoekranowego gościa VirtualBox, utknąłem przy włączonych dziwnych modyfikatorach klawiszy. Jeśli istnieją na mojej klawiaturze (jak Shift_L), mogę po prostu stuknąć ją, a ich status zostanie zresetowany i mogę kontynuować pisanie małymi literami. Ale niektóre z nich w ogóle nie są mapowane na klawiaturę (jak ISO_Level3_Shift), więc nie mam możliwości ich wyłączenia!

Jak je zresetować? W tej chwili wszystko, co mogę zrobić, to zrestartować komputer, ale jest to raczej kłopotliwe rozwiązanie.

Wszystko czego chcę to jakiś program, który może sztucznie „stukać” wszystkie możliwe modyfikatory klawiatury, aby ich status został zresetowany. Czy da się to zrobić?

Używam Mint 14 (klon Ubuntu 12.10 Quantal).

Adam Ryczkowski
źródło

Odpowiedzi:

22

Jeśli masz xdotoolzainstalowany, możesz po prostu użyć

xdotool keyup ISO_Level3_Shift

Który wysyła zdarzenie wydania klucza (oczywiście dla ISO_Level3_Shift) do serwera X.

Ale chciałeś, aby program zwolnił wszystkie klawisze modyfikujące. Przy pomocy xdotool można to łatwo osiągnąć, gdyby nie to, nie mam pojęcia, jakie są zdefiniowane klawisze modyfikujące. Jedną z możliwych metod ich znalezienia jest parsowanie keysymdef.h:

grep '^#define' /usr/include/X11/keysymdef.h | sed -r 's/^#define XK_(\S*?).*$/\1/;' | grep -E '_(L|R|Level.*)$'

Co zwraca niektóre klawisze, które z pewnością są modyfikatorami. Niestety nie mogę teraz znaleźć dokładnej definicji klawisza modyfikującego, więc nie wiem, czy to pełna lista.

Dołączenie | xargs xdotool keyupdo powyższego potoku spowoduje zwolnienie wszystkich tych kluczy. W moim systemie wykonuje następujące polecenie:

xdotool keyup Shift_L Shift_R Control_L Control_R Meta_L Meta_R Alt_L Alt_R Super_L Super_R Hyper_L Hyper_R ISO_Level2_Latch ISO_Level3_Shift ISO_Level3_Latch ISO_Level3_Lock ISO_Level5_Shift ISO_Level5_Latch ISO_Level5_Lock
Mewp
źródło
1
Świetny! Odkryłem również, że nieprzypisane klucze mogą zostać odblokowane za pomocą kodu, np xdotool keyup 204.
Adam Spiers,
1
@Adam Spiers wtrącił mnie. Kodem mojej sprawy był kod xmodmap, np. 204, i użycie keyymdef.h nie pomogło. Aby zobaczyć kody klawiszy xmodmap, spróbuj: DISAPLAY=:1 xmodmap -pk | grep -iP 'alt|meta|super|hyper'. Musisz zmienić numer wyświetlacza na zepsuty numer wyświetlacza VNC.
srk
Myślę, że miałeś na myśli DISPLAY=:1powyższy komentarz.
Adam Spiers,
1
xdotoolobsługuje --clearmodifiersopcję dla key/ keydown/ keyup- może nie zadziałało, kiedy ta odpowiedź została napisana? Spodziewam się, że xdotool keyup --clearmodifiers spaceto zadziała. ( xdotool keyupwymaga podania klucza; „spacja” jest dowolna).
Rory O'Kane
6

Odkryłem, że w moim systemie opublikowane rozwiązanie obejmujące xdotoolczęsto nie obejmowało zablokowanego klucza, a działanie setxkbmapnie wydawało się nic w moim systemie.

Rozwiązaniem, które odkryłem, które do tej pory działało bezbłędnie, jest zastosowanie x11vnc. W szczególności używam następującego polecenia:

x11vnc -deny_all -clear_keys -timeout 1

-clear_keysjest tutaj kluczową częścią. Poleca x11vncwyczyścić wszystkie naciśnięte klawisze po wyjściu. -timeout 1każe x11vncwyjść po 1 sekundzie bez połączeń i -deny_allupewnia się, że nikt nie może się połączyć w tym oknie.

Czasami klucz, który się blokuje, uniemożliwia jakąkolwiek znaczącą interakcję z pulpitem, w którym to przypadku wykonam następujące polecenie poprzez ssh:

env DISPLAY=:0 XAUTHORITY=/home/[username]/.Xauthority x11vnc -deny_all -clear_keys -timeout 1
rkjnsn
źródło
4

Używam „setxkbmap” bez argumentów. Wygląda na to, że resetuje klawiaturę. Mam w panelu „skrót”, którego mogę używać z myszą, gdy klawiatura jest całkowicie nieczynna.

mikevdg
źródło
0

x11vncOdpowiedź jest pomysłowy, ale w przypadku instalacji x11vnctylko dla modyfikatorów rozliczających wydaje się przesadą, oto rozwiązanie Bash że zastosowania xmodmap -pmwyjście „s wydać keyUp do wszystkich znanych modyfikatorów. Konwersja klucza szesnastkowego na dziesiętny zależy od rozszerzenia arytmetycznego Basha.

for KEYCODE in $(xmodmap -pm | grep -Pio '(?<=\b0x)[0-9a-f]+\b'); do

    echo -e "xdotool keyup $((16#$KEYCODE))\n" >&2
    xdotool keyup $((16#$KEYCODE))

done

Jeśli uruchamiasz go za pomocą skrótu klawiaturowego, sleep 1dobrze byłoby dodać dodanie na początku (aby zwolnić czas na zwolnienie fizycznych kluczy). echoNa stderr nie jest konieczne, oczywiście; Chciałbym po prostu sprawdzić, czy mój ~/.xsession-errorsplik ma takie dane wyjściowe.

lkrms
źródło