Estou tentando usar o xmodmap
remapeamento Alt/ Superteclas no teclado Dell L100 e tenho problemas para obter os códigos de teclas.
Por exemplo, usar xev
não me fornece o código-chave paraAlt
FocusOut event, serial 36, synthetic NO, window 0x4a00001,
mode NotifyGrab, detail NotifyAncestor
FocusIn event, serial 36, synthetic NO, window 0x4a00001,
mode NotifyUngrab, detail NotifyAncestor
KeymapNotify event, serial 36, synthetic NO, window 0x0,
keys: 122 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Para Right Superchave xev
e showkey
forneça códigos de chave diferentes - 134
e 126
respectivamente.
O que está acontecendo com esses códigos de chave?
Tentei obter códigos de chave showkey -k
e usar o xmodmap
arquivo abaixo, mas isso deu um mapa estranho que remapeava a bchave:
clear Mod1
clear Control
keycode 125 = Meta_L
keycode 126 = Meta_R
keycode 58 = Control_L
keycode 56 = Control_L
keycode 100 = Control_R
add Control = Control_L Control_R
add Mod1 = Meta_L Meta_R
Respostas:
Há muitos jogadores entre o teclado e o processo que finalmente lida com o evento do teclado. Entre as principais partes do cenário, está o fato de o sistema X possuir sua própria camada de manipulação de teclado, e o X associa diferentes "códigos de chave" a chaves que o sistema base Linux. O
showkey
comando está mostrando os códigos de chave no jargão do sistema básico do Linux. Paraxmodmap
você precisar dos códigos de teclas X, que são o quexev
está sendo exibido. Desde que você esteja planejando trabalhar no X e fazer a sua religação de chavexmodmap
, ignoreshowkeys
e ouça apenas o quexev
diz.O que você deseja procurar em sua
xev
saída são blocos como este:xev
tende a gerar muita saída, especialmente quando você move o mouse. Pode ser necessário voltar um pouco para encontrar a saída que você está procurando. Na saída anterior, vemos que okeysym Alt_L
está associado com o código de acesso X64
.fonte
xev -event keyboard
seria suficiente para livrar a maior parte do barulho.xev deve funcionar
Estranho, meu xev fornece um evento KeyPress e KeyRelease para alt (e para a chave do Windows, aqui chamada "super"):
E o da direita:
Eu posso ver duas possibilidades:
xinit -- :1
, o que deve lhe dar um servidor X com apenas um xterm - nem haverá um gerenciador de janelas em execução. Sair do xterm fechará a sessão).Uma maneira fácil, se você souber o nome da chave
Outra possibilidade: basta obter os códigos de chave no xmodmap:
Existem os 64 e 108 novamente.
xmodmap -pm
mostrará apenas o mapa modificador, que também fornece os números (embora, desta vez, em hexadecimal).fonte
Eu "detecto" três problemas na sua pergunta:
xev
eshowkey
relatar códigos de chave diferentes para uma chave?xev
não aparece Altsendo pressionado corretamente?Com relação à primeira pergunta: hoje em dia, onde o "driver" do teclado no X realmente não conduz o hardware, ele pode simplesmente passar os códigos de chave do kernel para o núcleo do X, mas não o faz. Ele adiciona 8 ao código-chave antes de transmiti-lo.
Segundo: Algo na sua sessão X está agarrando o Altevento. As outras respostas já cobrem isso. (Ou seja
xev
, não recebe o evento que você gostaria de ver). O culpado pode estar relacionado ao seu gerenciador de janelas. Tente uma sessão X mais nua.Terceiro: não use
xmodmap
. Está desatualizado há uma década. Os novos caras são o XKB e sua ferramentasetxkbmap
.Para troca Alte Winjá existe uma opção preparada no XKB. Basta adicioná-lo:
fonte
setxkbmap
mudança permanente?~/.xinitrc
.Como root, execute:
... para ver qual é o scancode da sua chave de mistério. Eu tenho algo parecido com isto:
Não sei por que parece que uma chave gera dois scancodes. Não é uma coisa de keydown / keyup, o mais próximo que pude perceber pelo padrão. Observe o aviso, portanto, você pode querer executá-lo no modo de usuário único.
Imaginei que 0x46 fosse o meu scancode.
Em seguida, encontre um código-chave não utilizado com:
Aqui você pode ver que o keycode 97 não é usado no meu sistema:
O código de chave X usa e o código de chave que o kernel usa é DESLIGADO POR 8 por "razões históricas". Portanto, pegue 97 - 8 = 89 e use 89 com o comando setkeycodes (novamente como root):
E você deve estar pronto. Confirme com xev que você está recebendo um evento Keypress com o código-chave 97. (embora uma vez eu tenha dito ao arquivo de chaves do Fluxbox para usar esse código-chave, não recebi mais eventos do KeyPress - talvez porque o Fluxbox os engula quando os usa?)
Observe que o 'setkeycodes' não sobreviverá a uma reinicialização, portanto você precisará adicioná-lo aos seus scripts de inicialização (por exemplo, em /etc/rc.local)
fonte
Eu estava tentando resolver isso sozinho e só descobri.
O principal problema é que você não está recebendo o evento para pressionar a tecla. Observando o log que você postou, o motivo é aparente.
Você pode ver os os
Focus{In,Out}
eventos têm ummode
dosNotify{Grab,Ungrab}
. Isso indica que uma chave foi manipulada por outro processo (provavelmente um aplicativo de atalho / combinação de teclas).No meu caso, eram xbindkeys, mas se você estiver usando um ambiente de área de trabalho, provavelmente eles têm um sistema de combinação de teclas. Para ver esses eventos é xev, você precisará parar / desativar o outro programa.
Se você não conseguir determinar qual programa está roubando os principais eventos, a melhor solução é iniciar outra sessão X sem ela ser executada. Execute o comando a seguir para iniciar outra sessão X em exibição
:1
, se já tiver sido tomada, apenas aumente o número no final. É claro que você pode alterar o terminal para o que preferir ou instalar em seu sistema.Então corra
xev
novamente. Isso deve fornecer o resultado sem que ele seja capturado por outros programas. Observe que o gerenciador de janelas que é iniciado é foco focalizado, portanto, você terá que colocar o cursor acima da janela xev para que as chaves sejam capturadas.Como foi dito nesta excelente resposta por dubiousjim , o código-chave é diferente porque há muitas camadas entre o xev e o kernel.
fonte
Eu tive o mesmo problema ao
Alt_L
desaparecer no XUbuntu 14.04 (Alt_R
estava bom). Depois de muito jogo, observei queshowkey
gravou o pressionamento de tecla, masxev
não - tinha que ser algo no sistema de janelas. Examinei todas as configurações do "Gerenciador de Janelas" e "Ajustes do Gerenciador de Janelas" e não encontrei nada. Por fim, encontrei um desvioAlt_L
na lista de atalhos de teclado (xfce4-keyboard-shortcuts
) no "Editor de configurações". Eu "redefino" isso e estou deAlt_L
costas! OAlt_L
atalho perdido não apareceu em nenhum outro lugar, exceto no "Editor de configurações".fonte