Para modificar o mapeamento de teclas, é essencial saber como uma tecla pressionada resulta em um símbolo:
- O teclado envia um scancode ao computador.
- O kernel Linux mapeia o scancode para um código-chave, veja Mapear scancodes a códigos-chave (Inglês).
- O leiaute de teclado mapeia o código-chave para um símbolo ou para um keysym, dependendo de quais teclas modificadoras (Inglês) forem pressionadas.
- Para o console Linux, veja Linux console
- Para Xorg e Wayland, veja Configuração Xorg/Teclado (Inglês)
A maioria de suas teclas já deve ter um código-chave, ou pelo menos um scancode. Teclas sem um scancode não são reconhecidas pelo kernel; como exemplo, teclas adicionais de teclados e mouses específicos para jogos.
No Xorg, alguns keysyms (por exemplo, XF86AudioPlay, XF86AudioRaiseVolume) podem ser ser mapeados para ações — lançar uma aplicação externa, i.e. Veja Keyboard shortcuts (Português)#Xorg para maiores detalhes.
No console Linux, alguns keysyms (e.g. F1 to F246) podem ser mapeados para certas ações, como, por exemplo, alternar para um console diferente ou imprimir alguma sequência de caracteres na tela. Veja Linux console (Português)/Keyboard configuration (Português)#Criando um mapa de teclado personalizado para maiores detalhes.
Identificando scancodes
Usando showkey
A maneira tradicional de se captar um scancode é por meio do utilitário showkey(1). showkey espera uma tecla ser pressionada ou, alternativamente, cancela a execução automaticamente caso nenhuma tecla seja pressionada em 10 segundos. Para que showkey funcione corretamente, há a necessidade de se estar em um console virtual (Inglês) e não em um ambiente gráfico ou logado por meio de uma conexão de rede. Dito isso, execute o seguinte comando:
# showkey --scancodes
e tente pressionar teclas no teclado; você deve ver scancodes sendo impressos no output.
Usando evtest
Para teclados USB, aparentemente é necessário usar o comando evtest(1) contido no pacote evtest em vez do comando showkey [1], vejamos:
# evtest /dev/input/event12
... Event: time 1434666536.001123, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70053 Event: time 1434666536.001123, type 1 (EV_KEY), code 69 (KEY_NUMLOCK), value 0 Event: time 1434666536.001123, -------------- EV_SYN ------------
evtest sem parâmetros e ele irá mostrar uma lista de dispositivos com seus respectivos números de evento e, com essa informação, você pode indicar o número necessário como parâmetro.Use o campo "value" de MSC_SCAN. Esse exemplo demonstra que Numlock possui scancode 70053 e código-chave 69.
Usando dmesg
Você pode capturar o scancode de uma tecla ao pressionar a tecla desejada e observar a saída de dmesg. Por exemplo, se resultar em:
Unknown key pressed (translated set 2, code 0xa0 on isa0060/serio0
então o scancode necessário é 0xa0.
Identificando códigos-chave
Os códigos-chave do Linux são definidos em /usr/include/linux/input-event-codes.h (veja as variáveis KEY_)
Identificando códigos-chave no console
Similarmente ao método de captação de scancode, os código-chaves para console virtual (Inglês) são indicados pelo utilitário showkey(1). showkey espera uma tecla ser pressionada ou, alternativamente, cancela a execução automaticamente caso nenhuma tecla seja pressionada em 10 segundos. Tal qual [[Mapeamento de Teclas (Português)#Usando showkey]], também há a necessidade de se estar num console virtual e não em um ambiente gráfico. Dito isso, execute o seguinte comando:
# showkey --keycodes
e tente pressionar teclas no teclado; você deve ver scancodes sendo impressos no output.
Identificando códigos-chave no Xorg
Os códigos-chave utilizados pelo Xorg são reportados pelo utilitário xev(1), incluído no pacote xorg-xev. Dito isso, para executar xev, há a necessidade de se estar em um ambiente gráfico e não no console virtual.
Com o seguinte comando você pode iniciar xev e demonstrar apenas as partes relevantes:
$ xev | awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
Aqui seria um exemplo de saída:
38 a 55 v 54 c 50 Shift_L 133 Super_L 135 Menu
Xbindkeys (Inglês) é outro wrapper para xev que reporta códigos-chave.
Se, ao pressionar uma tecla e nada aparecer no terminal, significa que ou a tecla pressionada não possui um scancode, o scancode não está mapeado a um código-chave, ou que algum outro processo está capturando o pressionar da tecla. Se você suspeita que um processo escutando o servidor X está capturando o pressionar da tela, você pode tentar executar xev em uma sessão X limpa:
$ xinit /usr/bin/xterm -- :1
Configuração de teclados compatíveis com VIA
VIA (Inglês) é um programa para remapear teclas diretamente em teclados compatíveis. Se o seu dispositivo for um desses, para que o teclado seja detectado pelo navegador e possibilite a configuração online, será necessário uma regra udev (Inglês) customizada, alterando a permissão dos dispositivos acessados por meio do driver hidraw.
Escreva esse texto em /etc/udev/rules.d/99-viia.rules em seu editor de texto de preferência:
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0666", TAG+="uaccess", TAG+="udev-acl"
E, finalmente, para que surja efeito com a mudança, é necessário recarregar udev com o seguinte comando:
# udevadm control --reload
Ver também
-
kbd-project - Website oficial do utilitário
showkeys(Inglês) -
wev - Visualizador de eventos para Wayland, similar ao
xevpara Xorg (Inglês) - interception-tools - conjunto de utilitários para controlar e customizar o comportamento de entrada dos mapeamentos de tecla (Inglês)
- kmonad - um daemon de remapeamento e revinculação avançada de teclas (Inglês)
- Hawck - outro daemon revinculador de teclas (Inglês)
- keyd - daemon simplista de revinculação de teclas (Inglês)
- Vial - programa independente para configuração de teclados com suporte a VIA (Inglês)