Comment forcer la libération d'un clavier modificateurs

18

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

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

Tout ce que je veux, c'est un programme qui puisse "toucher" artificiellement tous les modificateurs de clavier possibles, de sorte que leur état serait réinitialisé. Peut-on le faire?

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

Adam Ryczkowski
la source

Réponses:

22

Si vous avez xdotoolinstallé, vous pouvez simplement utiliser

xdotool keyup ISO_Level3_Shift

Qui envoie un événement de libération de clé (pour ISO_Level3_Shift, bien sûr) au serveur X.

Mais vous vouliez qu'un programme libère toutes les touches de modification. On pourrait utiliser xdotool pour y parvenir facilement, sinon je n'ai aucune idée des touches de modification définies. Une méthode possible pour les trouver consiste à analyser keysymdef.h:

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

Ce qui renvoie des keyymes qui sont sûrement des modificateurs. Malheureusement, je ne trouve pas de définition précise d'une touche de modification pour le moment, donc je ne sais pas si c'est une liste complète.

L'ajout | xargs xdotool keyupau pipeline ci-dessus libérera toutes ces clés. Sur mon système, il exécute la commande 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
Mewp
la source
1
Génial! J'ai également constaté que les clés non attribuées pouvaient être décollées via le code de clé, par exemple xdotool keyup 204.
Adam Spires
1
@Adam Spires m'a fait comprendre. Le code de saisie pour mon cas était un code xmodmap, par exemple 204, et l'utilisation de keysymdef.h n'a pas aidé. Pour voir les codes clés xmodmap, essayez: DISAPLAY=:1 xmodmap -pk | grep -iP 'alt|meta|super|hyper'. Vous devrez changer le numéro d'affichage en votre numéro d'affichage VNC cassé.
srking
Je pense que vous vouliez dire DISPLAY=:1dans le commentaire ci-dessus.
Adam Spires
1
xdotoolprend en charge une --clearmodifiersoption pour key/ keydown/ keyup- peut-être que ce n'était pas le cas lorsque cette réponse a été écrite? J'espère que xdotool keyup --clearmodifiers spacecela fonctionnerait. ( xdotool keyupnécessite une clé à spécifier; «espace» est arbitraire.)
Rory O'Kane
6

J'ai découvert que pour mon système, la solution publiée impliquant xdotoolsouvent ne couvrait pas la clé qui était bloquée, et l'exécution setxkbmapne semblait rien accomplir sur mon système.

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

x11vnc -deny_all -clear_keys -timeout 1

-clear_keysest l'élément clé, ici. Il demande x11vncd'effacer toutes les touches enfoncées à sa sortie. -timeout 1indique x11vncde quitter après 1 seconde sans connexion et -deny_alls'assure que personne ne peut se connecter pendant cette fenêtre.

Parfois, la clé bloquée empêche toute interaction significative avec le bureau, auquel cas je vais exécuter ce qui suit via ssh:

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

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

mikevdg
la source
0

La x11vncréponse est ingénieuse, mais si l'installation x11vncjuste pour effacer les modificateurs semble exagérée, voici une solution Bash qui utilise xmodmap -pmla sortie de pour émettre une clé pour tous les modificateurs connus. La conversion du code clé hexadécimal en code décimal repose sur l'expansion arithmétique de 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

Si vous l'exécutez à partir d'un raccourci clavier, l'ajout sleep 1au début (pour laisser le temps aux touches physiques d'être relâchées) serait bien conseillé. Le echoto stderr n'est pas nécessaire, bien sûr; J'aime juste pouvoir vérifier mon ~/.xsession-errorsfichier pour une sortie comme celle-ci.

lkrms
la source