Fundo geral: As teclas são atribuídas a três conjuntos diferentes de "códigos", primeiro o scancode (número dependente de hardware arbitrário representa a tecla no teclado), então o código-chave (número mais abstrato que representa uma chave particular, por exemplo, shift ou 1 /! ), e finalmente o keysym (símbolo da chave, o real símbolo como á
produzido por uma chave ou combinação de chaves).
Recentemente aprendi que cada dispositivo /dev/input/event*
possui seu próprio mapeamento scancode-to-keycode. Esses mapeamentos podem ser lidos e alterados por iotcls ( EVIOCGKEYCODE_V2
, EVIOCSKEYCODE_V2
), mas curiosamente, não parece haver ferramentas gerais disponíveis para acessar esses mapeamentos (eu rapidamente escrevi um programa simples em C, estava curioso).
O kernel Linux e o X, então, mapeiam códigos-chave para keyyms. Para o kernel, há apenas um mapeamento global, o manipulador kbd
(ou pelo menos um mapeamento global para o console muito virtual, não tenho certeza se diferentes consoles virtuais podem ter diferentes mapeamentos). X mantém um mapeamento para cada dispositivo.
Portanto, se você quiser diferenças entre teclados no console virtual, a única opção é usar o mapeamento scancode-to-keycode. Para Dvorak vs. Qwerty isto pode funcionar desde que você apenas remapeie as teclas das letras, e não queira remapear os símbolos em estados deslocados ou não-deslocados de maneira diferente.
Versões mais recentes do udev usam um banco de dados de hardware ( /etc/udev/hwdb.d
) para inicializar mapeamentos especiais scancode-to-keycode, e você pode adicionar seu próprio versões personalizadas .
A alternativa é viver com Dvorak ou Qwerty no console virtual, mas configure o X para usar diferentes mapeamentos keycode-to-keysym para cada um, conforme descrito na resposta que você vinculou que não o ajudou (provavelmente porque você não quero essa variante). A vantagem deste método é que você também pode mapear símbolos, chaves mortas, composições etc. de maneira diferente.