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"
fonte
/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=82311showkey --scancodes
não dá os scancodes que o udev espera (os valores são diferentes); oinput-kbd
utilitário fornece os scancodes corretos.evtest
utilitá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áriocode 4 (MSC_SCAN), value xxx
, ondexxx
está o scancode. Mas o driver do meu teclado é de buggy, e eu não entendo essaMSC_SCAN
linha para algumas teclas que eu queria remapear. Foi por isso que useiinput-kbd
, que lista todos os códigos de escâner do dispositivo selecionado.Respostas:
Primeiro, encontre o scancode da chave que precisa ser remapeada, por exemplo, com o
evtest
utilitário. Uma linha como a seguinte (comMSC_SCAN
ela) deve ser impressa:seguido por um segundo, fornecendo o código da chave atual. Se não
MSC_SCAN
houver saída de linha, isso ocorre devido a um bug no driver do kernel, mas o scancode ainda pode ser encontrado com oinput-kbd
utilitário;evtest
deve ter fornecido o código da chave, para que seja fácil encontrar a linha correspondente nainput-kbd
saída (por exemplo, usandogrep
).Depois que os scancodes das chaves a serem remapeadas forem determinados, crie um arquivo como o que
/etc/udev/hwdb.d/98-custom-keyboard.hwdb
contém os remapeamentos. O início do arquivo/lib/udev/hwdb.d/60-keyboard.hwdb
fornece algumas informações. No meu caso (que funciona), tenho:(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. CadaKEYBOARD_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 tantoevtest
einput-kbd
dar). Valores válidos poderiam ser obtidos a partir daevtest
saída ouinput-kbd
saída, ou mesmo do/usr/include/linux/input.h
arquivo: por exemplo,KEY_102ND
daria102nd
(removendoKEY_
e convertendo para letras minúsculas), que usei acima.Após o arquivo ser salvo, digite:
para (re) criar o banco de dados
/etc/udev/hwdb.bin
(você pode verificar seu carimbo de data / hora). Então,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
udevd
comudevadm control
(consulte a página do manual udevadm (8) para obter detalhes).Para
udev
versões antigas como 204, esse método ainda deve funcionar.fonte
/lib/udev/hwdb.bin
: procureibless
e eleKEYBOARD_KEY_70085
aparece no final. Eu acho que o ubuntu 14.04 está configurado (protegido?) Dessa maneira. Eu tenteiudevadm control --log-priority=debug
. com base emlsusb
(045e: 0750), meu teclado fica assimkeyboard:usb:v045ep0750*
, mas eu tenteikeyboard:usb:v*p*
também. Meu palpite é que isso/etc/udev/hwdb.bin
deve ser atualizado, mas nem existe.udevadm hwdb --usr --update
, apesar de não estar.udevadm hwdb --update
eu copiei/lib/udev/hwdb.bin
para/etc/udev/hwdb.bin
e correustrace udevadm trigger --sysname-match="event*"
eo arquivohwdb.bin
parece não ter sido lido por ele (se é como funciona este).udevadm trigger ...
, veja meu teste aqui . Observe que, antes da execuçãoudevadm 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.udevadm --version
: 215 (e versão do pacote udev: 215-7). Graças audevadm 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.