Posso dar dois layouts diferentes para teclados?

6

Eu prefiro um layout Dvorak, então eu tenho um bom teclado USB Das e eu tenho um layout que funciona para mim no Virtual Console e no X11. Eu usei loadkeys e install-keymap para fazer com que ele tenha efeito desde o início, e estou muito feliz com isso.

No entanto, a maioria dos meus colegas prefere o layout Qwerty, e isso é um impedimento para parear a programação. Eu tenho uma seleção de teclados usáveis USB que eu poderia anexar para esta tarefa, mas todos eles pegam o meu layout Dvorak quando estão conectados.

Existe uma maneira que eu possa dizer ao udev (ou mesmo apenas ao X11) usar um layout Qwerty para meus teclados adicionais? Eles têm diferentes identificadores de fornecedores e dispositivos USB que eu posso usar para distingui-los.

Meu sistema é o Debian Testing, com a versão 232. do udev. Ele foi infectado pelo systemd quando eu reinstalei após uma falha no disco, então as abordagens padrão (estilo SysV) que estou acostumado não funcionam.

A pergunta semelhante Layout de teclado diferente para cada teclado não forneceu nenhuma ajuda para mim.

    
por Toby Speight 13.02.2017 / 11:28

1 resposta

5

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.

    
por 13.02.2017 / 14:58