Cómo forzar la liberación de modificadores de teclado

18

A veces, cuando uso la sinergia entre mis máquinas cuando una está usando el invitado VirtualBox a pantalla completa, me quedo atascado con algunos modificadores de teclas extraños encendidos. Si existen en mi teclado (como Shift_L), solo puedo tocarlo y su estado se restablece y puedo seguir escribiendo letras minúsculas. Pero algunos de ellos no están asignados a mi teclado (como ISO_Level3_Shift), ¡así que no tengo forma de desactivarlos en absoluto!

¿Cómo restablecerlos? En este momento, todo lo que puedo hacer es reiniciar la computadora, pero es una solución bastante embarazosa.

Todo lo que quiero es algún programa que pueda "tocar" artificialmente todos los modificadores de teclado posibles, para que su estado se restablezca. Se puede hacer?

Yo uso Mint 14 (un clon de Ubuntu 12.10 Quantal).

Adam Ryczkowski
fuente

Respuestas:

22

Si ha xdotoolinstalado, simplemente puede usar

xdotool keyup ISO_Level3_Shift

Que envía un evento de liberación de clave (para ISO_Level3_Shift, por supuesto) al servidor X.

Pero quería un programa para liberar todas las teclas modificadoras. Uno podría usar xdotool para lograrlo fácilmente, si no fuera por eso no tengo idea de qué modificadores de teclas se definen. Un posible método para encontrarlos es analizar keysymdef.h:

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

Lo que devuelve algunos keyyms que seguramente son modificadores. Desafortunadamente, no puedo encontrar ninguna definición precisa de una tecla modificadora en este momento, así que no sé si es una lista completa.

Al agregar | xargs xdotool keyupa la tubería anterior, se liberarán todas esas claves. En mi sistema, ejecuta el siguiente 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
Mewp
fuente
1
¡Excelente! También descubrí que las claves no asignadas se pueden despegar a través del código clave, por ejemplo xdotool keyup 204.
Adam Spires
1
@ Adam Spires me dio una pista. El código de acceso para mi caso era un código xmodmap, por ejemplo 204, y usar keysymdef.h no ayudó. Para ver los otros códigos clave xmodmap, trate: DISAPLAY=:1 xmodmap -pk | grep -iP 'alt|meta|super|hyper'. Deberá cambiar el número de pantalla a su número de pantalla VNC roto.
2015
Creo que te refieres DISPLAY=:1al comentario anterior.
Adam Spires
1
xdotooladmite una --clearmodifiersopción para key/ keydown/ keyup- tal vez no lo hizo cuando se escribió esta respuesta? Espero que eso xdotool keyup --clearmodifiers spacefuncione. ( xdotool keyuprequiere que se especifique una clave; "espacio" es arbitrario.)
Rory O'Kane
6

Descubrí que para mi sistema, la solución publicada que involucraba a xdotoolmenudo no cubría la clave que estaba atascada, y la ejecución setxkbmapno parecía lograr nada en mi sistema.

La solución que descubrí, que hasta ahora ha funcionado sin fallar, es usar x11vnc. Específicamente, uso el siguiente comando:

x11vnc -deny_all -clear_keys -timeout 1

-clear_keysEs la parte clave, aquí. Da instrucciones x11vncpara borrar todas las teclas presionadas cuando sale. -timeout 1le dice x11vncque abandone después de 1 segundo sin conexiones, y -deny_allse asegura de que nadie pueda conectarse durante esa ventana.

A veces, la clave que se atasca evita cualquier interacción significativa con el escritorio, en cuyo caso ejecutaré lo siguiente a través de ssh:

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

Yo uso "setxkbmap" sin argumentos. Parece reiniciar el teclado. Tengo un "acceso directo" en mi panel que puedo usar con un mouse para cuando el teclado no funciona por completo.

mikevdg
fuente
0

La x11vncrespuesta es ingeniosa, pero si la instalación x11vncsolo para borrar los modificadores parece exagerada, aquí hay una solución Bash que usa xmodmap -pmla salida para emitir una clave para todos los modificadores conocidos. La conversión de código clave hexadecimal a decimal se basa en la expansión aritmética 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 lo está ejecutando desde un atajo de teclado, sleep 1sería aconsejable agregar al principio (para dar tiempo a que se suelten las teclas físicas). El echostderr no es necesario, por supuesto; Solo me gusta poder verificar mi ~/.xsession-errorsarchivo para obtener resultados como este.

lkrms
fuente