teclas de remapeamento rígido do teclado?

19

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 no 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 for possível fazê-lo usando algum software.

Também tentei xkeycaps, xkbcomp, mas não tentei o loadkeys, pois está sendo executado no X.

Descobri aqui que poderia tentar "setkeycodes , porque depois de atribuir o código da chave do kernel, o botão deve funcionar no xorg" , mas também descobri que "você não pode usar 'setkeycodes' nos teclados USB" " , é o meu caso (estou interessado em alguém faz funcionar no ps2, pois acho que poderia usar um adaptador).

Isso parecia promissor "Mapear scancodes para códigos-chave" , mas após alguns testes nada mudou, eis aqui:
Encontrei o código-chave "36" (tecla "j") na vt1 com o showkey
scancode "7e" (teclado ".") Em vt1 comshowkey --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 .: também não funcionou com: KEYBOARD_KEY_7e=j

Algumas maneiras mais alternativas (por @ vinc17) de encontrar as chaves:
evtest /dev/input/by-id/... ou
input-kbd 3(coloque o índice de identificação encontrado em ls -l /dev/input/by-id/*ex. Event3)

PS .: * Se você estiver interessado em testar a si mesmo, o tópico relacionado ao aplicativo é o seguinte: http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/ Os problemas que têm são os mesmos: algumas chaves (KP_Decimal, DownArrow, UpArrow, RightArrow) são ignoradas e consideradas todas com o mesmo valor "0x00"

Aquarius Power
fonte
O arquivo atualizado deve ser /etc/udev/hwdb.bin, não /lib/udev/hwdb.bin. Mas, embora esse arquivo seja atualizado corretamente, isso também não funciona para mim, mesmo após uma reinicialização. Talvez algo esteja faltando na documentação. Sobre isso: bugs.freedesktop.org/show_bug.cgi?id=82311
vinc17
@ vinc17 que é realmente interessante, assim que puder eu tentarei novamente, acho que temos que encontrar o arquivo de configurações e tentar imitá-lo, thx!
Poder de Aquário
11
Meu problema foi devido ao fato de que as linhas KEYBOARD_KEY_ começaram com 2 espaços em vez de um único (isso não foi documentado e não recebi nenhuma mensagem de erro!). Não sei por você, mas com o meu teclado USB, showkey --scancodesnão dá os scancodes que o udev espera (os valores são diferentes); o input-kbdutilitário fornece os scancodes corretos.
vinc17
11
O evtestutilitário também deve fornecer os scancodes corretos: depois de digitar uma tecla, você deve obter 2 linhas e a primeira deve terminar com algo do formulário code 4 (MSC_SCAN), value xxx, onde xxxestá o scancode. Mas o driver do meu teclado é de buggy, e eu não entendo essa MSC_SCANlinha para algumas teclas que eu queria remapear. Foi por isso que usei input-kbd, que lista todos os códigos de escâner do dispositivo selecionado.
vinc17
11
Publiquei informações detalhadas em uma resposta. Agora, não tenho certeza de que 36 ou 7002c funcionem como um valor. Eu acho que você precisa do identificador de código-chave. Veja minha resposta.
vinc17

Respostas:

17

Primeiro, encontre o scancode da chave que precisa ser remapeada, por exemplo, com o evtestutilitário. Uma linha como a seguinte (com MSC_SCANela) deve ser impressa:

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

seguido por um segundo, fornecendo o código da chave atual. Se não MSC_SCANhouver saída de linha, isso ocorre devido a um bug no driver do kernel, mas o scancode ainda pode ser encontrado com o input-kbdutilitário; evtestdeve ter fornecido o código da chave, para que seja fácil encontrar a linha correspondente na input-kbdsaída (por exemplo, usando grep).

Depois que os scancodes das chaves a serem remapeadas forem determinados, crie um arquivo como o que /etc/udev/hwdb.d/98-custom-keyboard.hwdbcontém os remapeamentos. O início do arquivo /lib/udev/hwdb.d/60-keyboard.hwdbfornece algumas informações. No meu caso (que funciona), 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 evdev:sequência deve estar no início da linha. Observe que as letras no fornecedor e na ID do produto devem ser maiúsculas. Cada KEYBOARD_KEY_configuração 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 será ignorada silenciosamente nas versões antigas do udev). KEYBOARD_KEY_é seguido pelo scancode em hexadecimal (como o que tanto evteste input-kbddar). Valores válidos poderiam ser obtidos a partir da evtestsaída ou input-kbdsaída, ou mesmo do /usr/include/linux/input.harquivo: por exemplo, KEY_102NDdaria 102nd(removendo KEY_e convertendo para letras minúsculas), que usei acima.

Após o arquivo ser salvo, digite:

udevadm hwdb --update

para (re) criar o banco de dados /etc/udev/hwdb.bin(você pode verificar seu carimbo de data / hora). Então,

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

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

Em 2014, o udev lançado continha informações incompletas / com erros /lib/udev/hwdb.d/60-keyboard.hwdb, mas você pode ver a versão mais recente do arquivo e / ou meu relatório de erros e discussão sobre os problemas de documentação e espaçamento.

Se isso não funcionar, o problema poderá ser encontrado após aumentar temporariamente o nível de log de udevdcom udevadm control(consulte a página do manual udevadm (8) para obter detalhes).

Para udevversões antigas como 204, esse método ainda deve funcionar.

vinc17
fonte
Quando executo os comandos udevadm, o arquivo que é atualizado é /lib/udev/hwdb.bin: procurei blesse ele KEYBOARD_KEY_70085aparece no final. Eu acho que o ubuntu 14.04 está configurado (protegido?) Dessa maneira. Eu tentei udevadm control --log-priority=debug. com base em lsusb(045e: 0750), meu teclado fica assim keyboard:usb:v045ep0750*, mas eu tentei keyboard:usb:v*p*também. Meu palpite é que isso /etc/udev/hwdb.bindeve ser atualizado, mas nem existe.
Poder de Aquário
Enquanto eu lia aqui , poderia estar usando esse comando udevadm hwdb --usr --update, apesar de não estar.
Poder de Aquário
Depois udevadm hwdb --updateeu copiei /lib/udev/hwdb.binpara /etc/udev/hwdb.bine correu strace udevadm trigger --sysname-match="event*"eo arquivo hwdb.binparece não ter sido lido por ele (se é como funciona este).
Poder de Aquário
11
@AquariusPower Sim, pode haver um bug específico do Ubuntu (estou usando o Debian / unstable). Para ver se o banco de dados é lido durante a execução udevadm trigger ..., veja meu teste aqui . Observe que, antes da execução udevadm trigger ..., é necessário garantir que a hora da modificação do arquivo tenha sido atualizada; caso contrário, a hora do acesso não será atualizada quando o arquivo for lido.
vinc17
11
@AquariusPower udevadm --version: 215 (e versão do pacote udev: 215-7). Graças a udevadm trigger ..., você não precisa reiniciar (a menos que queira remover as configurações, AFAIK). Mas você pode tentar uma reinicialização para ver se há algum efeito.
vinc17