Comment forcer la libération d'un keyboard modificateurs

Parfois, lorsque j'utilise la synergie entre mes machines lorsque j'utilise un invité VirtualBox en plein écran, je rest coincé avec d'étranges modificateurs de keys activés. S'ils existent sur mon keyboard (comme Shift_L), je peux juste appuyer dessus et leur statut est réinitialisé et je peux continuer à taper en petites lettres. Mais certains d'entre eux ne sont pas mappés sur mon keyboard (comme ISO_Level3_Shift), donc je n'ai aucun moyen de les désactiver du tout!

Comment les réinitialiser? En ce moment, tout ce que je peux faire est de redémarrer l'ordinateur, mais c'est une solution plutôt embarrassante.

Tout ce que je veux, c'est un programme qui peut artificiellement «toucher» tous les modificateurs de keyboard possibles, afin que leur statut soit réinitialisé. Peut-on le faire?

J'utilise Mint 14 (un clone d'Ubuntu 12.10 Quantal).

Si xdotool installé, vous pouvez simplement utiliser

 xdotool keyup ISO_Level3_Shift 

Ce qui envoie un communiqué de key (pour ISO_Level3_Shift, bien sûr) au server X.

Mais vous vouliez un programme pour libérer toutes les touches de modification. On pourrait utiliser xdotool pour réaliser cela facilement, sinon pour ça je n'ai aucune idée de ce que les keysyms de modificateur sont définis. Une méthode possible pour les find est d'parsingr keysymdef.h :

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

Ce qui renvoie certains keysyms qui sont sûrement des modificateurs. Malheureusement, je ne trouve pas de définition précise d'une key de modification en ce moment, alors je ne sais pas si c'est une list complète.

Ajouter | xargs xdotool keyup | xargs xdotool keyup au pipeline ci-dessus va libérer toutes ces keys. Sur mon système, il exécute la command suivante:

 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 

J'ai découvert que pour mon système, la solution postée impliquant xdotool ne couvrait pas souvent la key qui était bloquée, et setxkbmap ne semblait rien accomplir sur mon système.

La solution que j'ai découverte, qui a jusqu'ici fonctionné sans x11vnc , est d'utiliser x11vnc . Plus précisément, j'utilise la command suivante:

 x11vnc -deny_all -clear_keys -timeout 1 

-clear_keys est la partie key, ici. Il request à x11vnc d'effacer toutes les touches enfoncées lorsqu'il quitte. -timeout 1 indique à x11vnc de quitter après 1 seconde sans connection, et -deny_all s'assure que personne ne peut se connecter pendant cette window.

Parfois, la key qui se coince empêche toute interaction significative avec le bureau, auquel cas j'exécuterai ce qui suit via ssh:

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

J'utilise "setxkbmap" sans arguments. Il semble réinitialiser le keyboard. J'ai un "raccourci" dans mon panneau que je peux utiliser avec une souris pour quand le keyboard est complètement inutilisable.