Como as chaves ou os códigos de tecla são mapeados para os símbolos-chave do X?

3

Estou tentando mapear uma combinação de teclas de função para um símbolo de chave XF86. A combinação de teclas é Fn + F1 , que eu pude usar showkey para obter o código-chave bruto.

jason@io ~ $ showkey
kb mode was RAW
[ if you are trying this under X, it might not work
since the X server is also reading /dev/console ]

press any key (program terminates 10s after last keypress)...
keycode  28 release
keycode 466 press
keycode 466 release
keycode 113 press
keycode 113 release
keycode 114 press
keycode 114 release

A adição de 8 ao código de tecla showkey , conforme mencionado em outra pergunta , fornece um código-chave X de 474 Embora, a execução de xev pareça não capturar a tecla pressionada ou liberada. Ele captura as próximas duas combinações de teclas de função ( Fn + F2 , Fn + F3 ).

jason@io ~ $ xev -root

FocusIn event, serial 18, synthetic NO, window 0x71,
    mode NotifyGrab, detail NotifyInferior

KeymapNotify event, serial 18, synthetic NO, window 0x0,
    keys:  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   2
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

FocusOut event, serial 18, synthetic NO, window 0x71,
    mode NotifyUngrab, detail NotifyInferior

FocusIn event, serial 18, synthetic NO, window 0x71,
    mode NotifyGrab, detail NotifyInferior

KeymapNotify event, serial 18, synthetic NO, window 0x0,
    keys:  1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   4
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

FocusOut event, serial 18, synthetic NO, window 0x71,
    mode NotifyUngrab, detail NotifyInferior

Estou tentando manipular a combinação de teclas no gerenciador de janelas, onde tenho várias outras ligações de trabalho, incluindo Fn + F2 e Fn + F3 . No entanto, parece que o X não está recebendo a tecla pressionada, ou talvez .Xmodmap não esteja vinculando o código de tecla corretamente.

Eu não estou fazendo algo certo? Existe outra maneira de fazer isso?

    
por Jason 07.04.2015 / 08:54

1 resposta

2

Após pesquisar, descobri que essa é uma limitação fundamental do protocolo X11. Especificamente, o tipo de dados usado para representar um código de acesso é um byte, que limita os valores entre 8 e 255 (+8 de polarização). É um problema que deve ser resolvido no protocolo X12 (consulte Limites de recursos).

Uma solução é remapear o código-chave para o intervalo válido usando um evdev corrigido no xorg. conf.

Section "InputDevice"
    Identifier     "keyboard"
    Driver         "evdev"
    Option         "event_key_remap" "474=247"
EndSection

O código de acesso também pode ser remapeado no kernel.

jason@io ~ $ sudo setkeycodes e0xx 266
    
por 21.07.2015 / 07:47