Como forçar a liberação de modificadores de teclado

18

Às vezes, quando uso sinergia entre minhas máquinas quando uma está usando o convidado do VirtualBox em tela cheia, fico com alguns modificadores de teclas estranhos ativados. Se eles existirem no meu teclado (como Shift_L), basta tocar nele e seu status é redefinido e posso continuar digitando letras minúsculas. Mas alguns deles não estão mapeados para o meu teclado (como ISO_Level3_Shift), então não tenho como desativá-los!

Como redefini-los? No momento, tudo o que posso fazer é reiniciar o computador, mas é uma solução bastante embaraçosa.

Tudo o que eu quero é um programa que possa "tocar" artificialmente todos os possíveis modificadores de teclado, para que seu status seja redefinido. Isso pode ser feito?

Eu uso o Mint 14 (um clone do Ubuntu 12.10 Quantal).

Adam Ryczkowski
fonte

Respostas:

22

Se você xdotoolinstalou, você pode simplesmente usar

xdotool keyup ISO_Level3_Shift

O qual envia um evento de liberação de chave (para ISO_Level3_Shift, é claro) ao servidor X.

Mas você queria um programa para liberar todas as chaves modificadoras. Alguém poderia usar o xdotool para conseguir isso facilmente, se não for por isso, não tenho idéia de quais conjuntos de teclas modificadores estão definidos. Um método possível para encontrá-los é analisar keysymdef.h:

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

O que retorna algumas academias de teclas que certamente são modificadores. Infelizmente, não consigo encontrar nenhuma definição precisa de uma chave modificadora no momento, então não sei se essa é uma lista completa.

Anexar | xargs xdotool keyupao pipeline acima liberará todas essas chaves. No meu sistema, ele executa o seguinte 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
fonte
11
Ótimo! Também descobri que chaves não atribuídas podem ser desatadas pelo código, por exemplo xdotool keyup 204.
Adam Spiers
11
@ Adam Spiers me deu uma dica. O código de acesso para o meu caso era um código xmodmap, por exemplo, 204, e o uso de keysymdef.h não ajudou. Para ver os códigos de chaves xmodmap, tente: DISAPLAY=:1 xmodmap -pk | grep -iP 'alt|meta|super|hyper'. Você precisará alterar o número de exibição para o número de exibição de VNC quebrado.
srking
Eu acho que você quis dizer DISPLAY=:1no comentário acima.
Adam Spiers
11
xdotoolsuporta uma --clearmodifiersopção para key/ keydown/ keyup- talvez não quando essa resposta foi escrita? Espero que xdotool keyup --clearmodifiers spacefuncione. ( xdotool keyuprequer que uma chave seja especificada; “espaço” é arbitrário.)
Rory O'Kane 18/17
6

Descobri que, para o meu sistema, a solução publicada que envolvia xdotoolmuitas vezes não cobria a chave que estava presa e a execução setxkbmapparecia não realizar nada no meu sistema.

A solução que eu descobri, que até agora funcionou sem falhas, é usar x11vnc. Especificamente, eu uso o seguinte comando:

x11vnc -deny_all -clear_keys -timeout 1

-clear_keysé a parte chave aqui. Ele instrui x11vnca limpar todas as teclas pressionadas quando sair. -timeout 1diz x11vncpara sair após 1 segundo sem conexões e -deny_allgarante que ninguém possa se conectar durante essa janela.

Às vezes, a chave que fica presa impede qualquer interação significativa com a área de trabalho; nesse caso, executarei o seguinte através do ssh:

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

Eu uso "setxkbmap" sem argumentos. Parece redefinir o teclado. Eu tenho um "atalho" no painel que posso usar com o mouse para quando o teclado estiver completamente inoperante.

mikevdg
fonte
0

A x11vncresposta é engenhosa, mas se a instalação x11vncapenas para a limpeza de modificadores parece um exagero, aqui está uma solução Bash que usa xmodmap -pma saída de para emitir um keyup para todos os modificadores conhecidos. A conversão de código-chave hexadecimal para decimal depende da expansão 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

Se você o estiver executando a partir de um atalho de teclado, é recomendável adicionar sleep 1no início (para permitir tempo para que as teclas físicas sejam liberadas). O echoto stderr não é necessário, é claro; Eu só gostaria de poder verificar meu ~/.xsession-errorsarquivo para obter resultados como este.

lkrms
fonte