Come forzare il rilascio di un modificatore di tastiera


18

A volte, quando utilizzo la sinergia tra i miei computer quando si utilizza un guest VirtualBox a schermo intero, rimango bloccato con alcuni strani modificatori di tasti attivati. Se esistono sulla mia tastiera (come Shift_L) posso semplicemente toccarlo e il loro stato viene ripristinato e posso continuare a digitare in lettere minuscole. Ma alcuni di essi non sono mappati affatto sulla mia tastiera (come ISO_Level3_Shift), quindi non ho alcun modo di disattivarli!

Come resettarli? In questo momento, tutto ciò che posso fare è riavviare il computer, ma è una soluzione piuttosto imbarazzante.

Tutto quello che voglio è un programma in grado di "toccare" artificialmente tutti i possibili modificatori della tastiera, quindi il loro stato verrà ripristinato. Si può fare?

Uso Mint 14 (un clone di Ubuntu 12.10 Quantal).

Risposte:


22

Se hai xdotoolinstallato, potresti semplicemente usare

xdotool keyup ISO_Level3_Shift

Che invia un evento rilascio chiave (per ISO_Level3_Shift, ovviamente) al server X.

Ma volevi che un programma rilasciasse tutti i tasti modificatori. Si potrebbe usare xdotool per raggiungere questo obiettivo facilmente, se non per quello non ho idea di quali siano i tastierini modificatori definiti. Un possibile metodo per trovarli è analizzare keysymdef.h:

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

Il che restituisce alcune palestre che sono sicuramente modificatori. Sfortunatamente, non riesco a trovare una definizione precisa di un tasto modificatore in questo momento, quindi non so se sia un elenco completo.

L'aggiunta | xargs xdotool keyupalla pipeline sopra rilascerà tutte quelle chiavi. Sul mio sistema, esegue il seguente comando:

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

1
Grande! Ho anche scoperto che le chiavi non assegnate potevano essere sbloccate tramite il codice chiave, ad es xdotool keyup 204.
Adam Spires,

1
@Adam Spires mi ha fatto capire. Il codice di keyup per il mio caso era un codice xmodmap, ad esempio 204, e l'uso di keysymdef.h non ha aiutato. Per vedere i codici chiave xmodmap, provare: DISAPLAY=:1 xmodmap -pk | grep -iP 'alt|meta|super|hyper'. È necessario modificare il numero del display con il numero del display VNC rotto.
arrivo il

Penso che tu intendessi DISPLAY=:1nel commento sopra.
Adam Spires,

1
xdotoolsupporta --clearmodifiersun'opzione per key/ keydown/ keyup- forse no quando è stata scritta questa risposta? Mi aspetto che xdotool keyup --clearmodifiers spacefunzionerebbe. ( xdotool keyuprichiede una chiave da specificare; "spazio" è arbitrario.)
Rory O'Kane,

6

Ho scoperto che per il mio sistema, la soluzione pubblicata che comportava xdotoolspesso non copriva la chiave bloccata e l'esecuzione setxkbmapnon sembrava realizzare nulla sul mio sistema.

La soluzione che ho scoperto, che finora ha funzionato senza fallo, è quella di utilizzare x11vnc. In particolare, utilizzo il seguente comando:

x11vnc -deny_all -clear_keys -timeout 1

-clear_keysè la parte chiave, qui. Indica x11vncdi cancellare tutti i tasti premuti quando esce. -timeout 1dice x11vncdi uscire dopo 1 secondo senza connessioni e si -deny_allassicura che nessuno possa connettersi durante quella finestra.

A volte la chiave che si blocca impedisce qualsiasi interazione significativa con il desktop, nel qual caso eseguirò quanto segue tramite ssh:

env DISPLAY=:0 XAUTHORITY=/home/[username]/.Xauthority x11vnc -deny_all -clear_keys -timeout 1

4

Uso "setxkbmap" senza argomenti. Sembra ripristinare la tastiera. Ho una "scorciatoia" nel mio pannello che posso usare con un mouse per quando la tastiera è completamente inutilizzabile.


0

La x11vncrisposta è ingegnosa, ma se l'installazione x11vncsolo per cancellare i modificatori sembra eccessiva, ecco una soluzione Bash che utilizza xmodmap -pml'output per inviare un keyup a tutti i modificatori noti. La conversione da codice esadecimale a codice decimale si basa sull'espansione aritmetica di Bash.

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

Se lo stai eseguendo da una scorciatoia da tastiera, l'aggiunta sleep 1all'inizio (per consentire il rilascio dei tasti fisici) sarebbe consigliabile. Lo echostderr non è necessario, ovviamente; Mi piace solo essere in grado di controllare il mio ~/.xsession-errorsfile per l'output in questo modo.

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.