teclado remapear as teclas?

17

Estou tentando encontrar uma maneira de remapear as teclas do teclado com força.
Eu tentei usar xmodmap e setxkbmap, mas eles não funcionam para um aplicativo específico. Tais comandos funcionam para outros aplicativos / janelas normais em X tho.

Eu acho que o aplicativo pode estar lendo os dados brutos do teclado e ignorando a entrada X?

Então, como remapear chaves sem usar xmodmap e setxkbmap? se é possível fazer alguma coisa usando algum software.

Eu também tentei xkeycaps, xkbcomp, mas não tentei loadkeys, como ele está rodando no X.

Eu encontrei aqui que eu poderia experimentar setkeycodes , " porque depois de atribuir o código do kernel o botão deve funcionar no xorg ", mas também descobri que "you não pode usar 'setkeycodes' nos teclados USB ", esse é o meu caso (estou interessado em fazer com que alguém faça funcionar no ps2 como eu acho que eu poderia usar um adaptador).

Isso parecia promissor "Mapear scancodes para códigos de tecla" , mas depois de alguns testes nada mudou, aqui estão eles :
Eu encontrei o código "36" (tecla "j") em vt1 com showkey
Eu encontrei o scancode "7e" (keypad ".") Em vt1 com showkey --scancodes

$cat >/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
 KEYBOARD_KEY_7e=36
$udevadm hwdb --update #updates file: /lib/udev/hwdb.bin
$udevadm trigger #should apply the changes but nothing happened
$cat /lib/udev/hwdb.bin |egrep "KEYBOARD_KEY_7e.{10}" -ao
KEYBOARD_KEY_7eleftmeta
$#that cat on hwdb.bin did not change after the commands..

Obs .: não funcionou com: KEYBOARD_KEY_7e=j

Mais algumas formas alternativas (por @ vinc17) de encontrar as chaves:
evtest /dev/input/by-id/... ou input-kbd 3 (coloque o índice id encontrado em ls -l /dev/input/by-id/* do ex. event3)

PS .: * Se você estiver interessado em testar a si mesmo, o tópico relacionado para o aplicativo é este: link Os problemas que tenho são os mesmos: algumas chaves (KP_Decimal, DownArrow, UpArrow, RightArrow) são ignoradas e consideradas todas com o mesmo valor que há" 0x00 "

    
por Aquarius Power 23.09.2014 / 05:14

1 resposta

14

Primeiro, localize o scancode da chave que precisa ser remapeada, por exemplo, com o utilitário evtest . Uma linha como a seguinte (com MSC_SCAN nela) deve ser exibida:

Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068

seguido por um segundo dando o código chave atual. Se nenhuma linha MSC_SCAN for gerada, isso é devido a um bug do driver do kernel, mas o scancode ainda pode ser encontrado com o utilitário input-kbd ; evtest deveria ter dado o código da chave, para que seja fácil encontrar a linha correspondente na saída input-kbd (por exemplo, usando grep ).

Uma vez que os scancodes das chaves a serem remapeadas forem determinados, crie um arquivo como /etc/udev/hwdb.d/98-custom-keyboard.hwdb contendo os remapeamentos. O início do arquivo /lib/udev/hwdb.d/60-keyboard.hwdb fornece algumas informações. No meu caso (que funciona), eu tenho:

evdev:input:b0003v05ACp0221*
 KEYBOARD_KEY_70035=102nd       # Left to z: backslash bar
 KEYBOARD_KEY_70064=grave       # Left to 1: grave notsign
 KEYBOARD_KEY_70068=insert      # F13: Insert

(Antes do udev 220, eu tinha que usar keyboard:usb:v05ACp0221* para a primeira linha.)

A string evdev: deve estar no início da linha e cada configuração de KEYBOARD_KEY_ deve ter exatamente um espaço antes (nota: uma linha sem espaços exibirá uma mensagem de erro e uma linha com dois espaços silenciosamente ignorado com versões antigas do udev). KEYBOARD_KEY_ é seguido pelo scancode em hexadecimal (como o que evtest e input-kbd fornecem). Os valores válidos podem ser obtidos da saída evtest ou input-kbd , ou até mesmo do arquivo /usr/include/linux/input.h : por exemplo, KEY_102ND daria 102nd (removendo KEY_ e convertendo para minúscula ), que eu usei acima.

Após o arquivo ser salvo, digite:

udevadm hwdb --update

para (re) construir o banco de dados /etc/udev/hwdb.bin (você pode verificar o timestamp). Então,

udevadm trigger --sysname-match="event*"

terá as novas configurações em consideração. Você pode verificar com evtest .

Em 2014, o udev lançado tinha informações incompletas / com bugs em /lib/udev/hwdb.d/60-keyboard.hwdb , mas você pode consultar a última versão de desenvolvimento do arquivo e / ou meu relato de bug e discussão sobre as questões de documentação e espaçamento.

Se isso não funcionar, o problema pode ser encontrado depois de aumentar temporariamente o nível de log de udevd com udevadm control (consulte a página do manual do udevadm (8) para obter detalhes).

Para versões antigas de udev , como 204, esse método ainda deve funcionar.

    
por 28.11.2014 / 01:20