Como alterar corretamente o mapeamento do teclado?

4

Vou tentar descrever o problema em detalhes. Muitas vezes eu uso teclado externo com meu netbook. O teclado é "TK Stealth":


Clique para aumentar o zoom

Você pode ver que o numpad é muito parecido com o numpad clássico, mas as teclas de seta são realmente mapeadas de forma diferente - como as teclas de seta adicionais em teclados amplos.

Eu quero fazê-los serem mapeados como num numpad, ou seja, "8" == "Up", "2" == "Down", "4" == "Left", "6" == " Certo "e assim por diante.

Essas configurações só devem funcionar se esse tipo de teclado estiver conectado.

Eu tentei fazer isso usando xmodmap /home/johnfound/TKStelth com o seguinte arquivo de mapa "TKStelth":

keycode  79 = KP_Home KP_Home KP_Home KP_Home
keycode  80 = KP_Up KP_Up KP_Up KP_Up
keycode  81 = KP_Prior KP_Prior KP_Prior KP_Prior
keycode  83 = KP_Left KP_Left KP_Left KP_Left
keycode  84 = KP_Begin KP_Begin KP_Begin KP_Begin
keycode  85 = KP_Right KP_Right KP_Right KP_Right
keycode  87 = KP_End KP_End KP_End KP_End
keycode  88 = KP_Down KP_Down KP_Down KP_Down
keycode  89 = KP_Next KP_Next KP_Next KP_Next
keycode  90 = KP_Insert KP_Insert KP_Insert KP_Insert
keycode  91 = KP_Delete KP_Delete KP_Delete KP_Delete

Funciona na verdade, mas há efeitos colaterais desagradáveis. Por exemplo, às vezes, o layout é restaurado para o padrão e eu preciso executar o script acima manualmente. Incluir o script nos scripts de inicialização causou alguns conflitos / bloqueios que fizeram o sistema ficar travado por vários minutos depois de retomar a suspensão e alterar as resoluções da tela. Dessa forma, fui forçado a remover os scripts dos scripts de inicialização.

Eu li em algum lugar que o xmodmap é, na verdade, a maneira antiga de lidar com layouts de teclado.

Então, a pergunta: Como configurar o Linux para lidar com isso e somente com este teclado corretamente?

Informações adicionais: Manjaro Linux com XFCE. O teclado está configurado com dois layouts - EUA e Búlgaro e eles devem permanecer após as alterações de configuração acima.

    
por johnfound 03.06.2015 / 15:09

1 resposta

1

Desde que encontre a solução adequada, responderei a minha própria pergunta.

Existe um programa chamado keyfuzz que pode alterar os mapas de teclado usados pelo kernel, com base nos dispositivos de entrada - ou seja, separadamente para cada teclado conectado ao computador.

Existem dois problemas com este programa que não estão descritos corretamente na documentação:

  1. Os teclados USB geram códigos de verificação, além dos códigos de verificação dos teclados conectados à porta ps / 2. Dessa forma, se você precisar remapear o teclado USB, precisará de uma maneira de saber os códigos de verificação das teclas. A ferramenta "showkey", normalmente recomendada para testar scancode e keycode, não fará o trabalho, porque lê o formulário /dev/console que emite códigos de verificação "padrão", independentemente do teclado.

Para testar os códigos de verificação do teclado com base no seu endereço /dev/input/KEYBOARD , você precisa usar o programa chamado getscancodes . Observe que o arquivo baixado do link acima não está compactado corretamente. É denominado getscancodes.tar.gz , mas é compactado com o algoritmo ZIP. O pacote contém o código-fonte, assim como os binários pré-compilados.

No meu caso, o arquivo de configuração do keyfuzz parece assim:

### evdev 1.0.0., driver 'TK Stealth keyboard'
### Proper old-style numpad handling

0x70059    107
0x7005A    108
0x7005B    109
0x7005C    105
0x7005D    108
0x7005E    106
0x7005F    102
0x70060    103
0x70061    104

0x70062    110
0x70063    111
  1. O programa "keyfuzz" inicia como um serviço durante a inicialização, a fim de corrigir as tabelas o mais cedo possível. Infelizmente, os teclados USB são adicionados aos dispositivos mais tarde, portanto, quando o keyfuzz é iniciado, não há teclado a ser corrigido, mesmo se o teclado USB estiver conectado durante a inicialização.

A solução é usar os arquivos de regras udev e iniciar o keyfuzz ao adicionar o teclado necessário.

Para fazer isso, você precisa adicionar um arquivo /etc/udev/rules.d/mykeyboard.rules , contendo (no meu caso):

ACTION=="add", ATTRS{idVendor}=="2516", RUN+="/usr/lib/systemd/scripts/keyfuzz start"

Agora, depois de conectar o teclado, o script de início do keyfuzz iniciará e corrigirá as tabelas de decodificação do teclado.

    
por 11.06.2015 / 18:19