Keyboard input (Português)
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
xev
para 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)