scancodes & códigos de teclas
Em geral, quando alguém diz isso, eles querem dizer que a função rotulada em uma chave não corresponde ao "código" que a chave está enviando ao kernel do Linux quando é pressionada. Você pode pensar nisso como a chave é rotulada Home , mas o kernel está recebendo o "código" para a tecla Ctrl .
Em um nível muito mais baixo, parte do que realmente está acontecendo é que cada tecla recebe um scancode.
trecho da página da Wikipédia em scancode
A scancode (or scan code) is the data that most computer keyboards send to a computer to report which keys have been pressed. A number, or sequence of numbers, is assigned to each key on the keyboard.
Esses scancodes são mapeados em códigos de tecla pelo kernel do Linux. São esses códigos de teclas que geralmente são comunicados aos aplicativos. Aqui está outro recurso de scancode se você quiser mais detalhes.
OBSERVAÇÃO: isso é uma simplificação, mas estou tentando apenas dar uma compreensão geral dessa camada. A principal vantagem é que as teclas são pressionadas, os scancodes são gerados, o kernel do Linux vê esses scancodes e emite códigos de teclas.
setkeycodes
Você pode alterar o mapeamento do código de tecla scancode usando uma ferramenta setkeycodes
:
setkeycodes scancode keycode ...
The setkeycodes command reads its arguments two at a time, each pair of arguments consisting of a scancode (given in hexadecimal) and a keycode (given in decimal). For each such pair, it tells the kernel keyboard driver to map the specified scancode to the specified keycode.
O mapeamento de código-chave é mantido em arquivos de mapa de chaves. No meu sistema Fedora, meu arquivo de mapa de teclado dos EUA estava localizado aqui, /lib/kbd/keymaps/i386/qwerty/us.map.gz
. Eu encontrei por investigar um pouco com este comando:
$ locate map.gz|grep us
/lib/kbd/keymaps/amiga/amiga-us.map.gz
/lib/kbd/keymaps/atari/atari-us.map.gz
/lib/kbd/keymaps/i386/qwerty/br-latin1-us.map.gz
/lib/kbd/keymaps/i386/qwerty/is-latin1-us.map.gz
/lib/kbd/keymaps/i386/qwerty/us-acentos.map.gz
/lib/kbd/keymaps/i386/qwerty/us.map.gz
/lib/kbd/keymaps/i386/qwertz/cz-us-qwertz.map.gz
/lib/kbd/keymaps/mac/all/mac-us.map.gz
/lib/kbd/keymaps/sun/sunt5-cz-us.map.gz
/lib/kbd/keymaps/sun/sunt5-us-cz.map.gz
Observe que esses arquivos estão compactados (.gz), portanto, você deve descompactá-los (não se incomode) ou usar zcat
ou zless
para pesquisá-los:
$ zless /lib/kbd/keymaps/i386/qwerty/us.map.gz
# us.map
keymaps 0-2,4-6,8-9,12
alt_is_meta
include "qwerty-layout"
include "linux-with-alt-and-altgr"
include "compose.latin1"
include "euro1.map"
strings as usual
keycode 1 = Escape
keycode 2 = one exclam
keycode 3 = two at at nul nul
keycode 4 = three numbersign
control keycode 4 = Escape
keycode 5 = four dollar dollar Control_backslash
keycode 6 = five percent
...
...
keycode 97 = Control
Portanto, se você quiser alterar a chave "Control" (código de acesso 97) e defini-la no código de controle da tecla "Left Control", (scancode 0x1d 0x9d), use o seguinte:
$ setkeycodes 1d9d 97 &
showkey
Você também pode ver em qual código uma tecla está mapeada usando o comando showkey
:
$ showkey -a
Press any keys - Ctrl-D will terminate this program
1 49 0061 0x31
2 50 0062 0x32
3 51 0063 0x33
a 97 0141 0x61
b 98 0142 0x62
c 99 0143 0x63
^[OH 27 0033 0x1b
79 0117 0x4f
72 0110 0x48
^D 4 0004 0x04
O "^ [OH" é eu pressionando minha tecla HOME .
NOTA 1: Quando em ascii' dump mode (
showkey -a '), showkey imprime na saída padrão os valores decimal, octal e hexadecimal da tecla pressionada, de acordo com o presente mapa de teclado .
NOTA2: Pode ser necessário usar sudo
ao executar showkey
.