Relação de layout de teclado e xmodmap

12

Estou usando o Xubuntu. Antes do login, posso escolher um layout de teclado. Estou usando xmodmap para remapear algumas chaves.

Estou interessado em duas coisas:

  1. Como o estado do mapeamento do teclado muda (a) quando ligo o laptop, (b) durante o processo de inicialização e (c) efetuo login no sistema (nessas três fases) e ao trabalhar com o sistema (conectado ).
  2. O que causa quais símbolos serão exibidos na tela (e chaves de controle enviadas) durante as fases individuais. Quando eu pressiono alguma tecla, ela envia algum sinal para o driver do teclado (?) E então deve haver algum processo de decisão (aplicativos e arquivos de configuração) determinando quais símbolos serão exibidos. A resposta a essa pergunta deve ser a lista de aplicativos e caminhos para esses arquivos de configuração (estou especialmente interessado no Ubuntu (sistema baseado no Debian), mas você pode descrever algum outro sistema, mas o Ubuntu é o preferido).
por xralf 03.05.2011 / 11:17

1 resposta

22

Existem duas camadas aqui, mapeamento de KEYCODE para KEYSYM e KEYSYM para mapeamento de texto. Existem mais camadas se você contar o kernel, que tem que mapear os scancodes do AT Keyboard para um KEYCODE no estilo XT ou um código HID do teclado USB para um KEYCODE. Um KEYCODE é simplesmente um inteiro não assinado de 8 bits que o kernel de um Sistema Operacional passa para o servidor X11. Pode variar entre sistemas operacionais, como Linux e Solaris. No Linux, esses KEYCODEs são tipicamente o mesmo número usado em antigos teclados XT para PC. Computadores mais novos com teclados AT, PS / 2 ou USB normalmente mapeiam os teclados para o antigo código XT para a chave para manter a vida simples.

Códigos de teclado não processados, sejam eles XT, AT, PS / 2 ou USB, representam um local físico em um teclado. O teclado XT envia apenas um único número de 8 bits ao pressionar ou soltar uma tecla. A tecla q em um teclado XT dos EUA / British envia o número 16. Em um teclado francês, a mesma tecla física é rotulada a, mas ainda envia 16. São as camadas mais altas no sistema operacional que atribuem a ela um significado real. Quando uma tecla é liberada em um teclado XT, o mesmo código de tecla é enviado mais 128. Para este exemplo, quando q é pressionado, um 16 é enviado, mas no lançamento, o número 142 (16 + 128) é enviado. Os teclados usam scancodes, que são uma série de números e podem ficar bastante longos. Os principais lançamentos adicionam códigos adicionais. Por exemplo, o scancode para Pause é E1, 1D, 45, E1, 9D, C5. A maioria dos sistemas operacionais, incluindo DOS, Windows, Linux, FreeBSD e BIOS, mapeiam os scancodes em scancodes muito mais simples do estilo XT. Ele também facilita o suporte a teclados mais novos que usam códigos diferentes, como teclados USB que enviam códigos HID. Todos os códigos são mapeados para o mesmo conjunto consistente de códigos pelo sistema operacional antes do X11 ou o aplicativo os vê.

O X11 ignora essa parte do processo, apenas obtém o KEYCODE do kernel e aplica seu próprio mapeamento para converter esse KEYCODE em um KEYSYM. O Xmodmap é a ferramenta padrão para controlar esse mapeamento. Grande parte do comportamento do mapeamento do teclado é configurável, mas há vários casos especiais, como Num Lock, Mode Switch e Caps Lock / Shift Lock, que são codificados no X11. Outros aspectos como Shift são realmente configuráveis. Qualquer tecla pode ser mapeada para agir como shift, ao contrário de Mode Switch ou Num Lock.

KEYCODEs representam chaves físicas enviadas pelo kernel do sistema operacional. Cada KEYCODE pode mapear para 8 possíveis KEYSYMs. Apenas 4 são usados e às vezes são chamados de níveis 1-4. O nível 1 especifica o KEYSYM que é impresso quando nenhum modificador está ativo. Geralmente são letras minúsculas e dígitos. Os modificadores são KEYCODEs que modificam o KEYSYM gerado por outros KEYCODEs quando o modificador está ativo (pressionado ou ativado). Os códigos de teclas modificadoras também são controlados através do Xmodmap. O nível 2 especifica um KEYSYM a ser enviado quando o modificador de turno é pressionado. O nível 3 é ativado sempre que o interruptor de modo KEYSYM for pressionado. O nível 4 é ativado quando as teclas shift e Mode estão ativas.

Uma vez gerado um KEYSYM, isso pode ser interpretado diretamente, mas na maioria das vezes será convertido em texto. Nem todos os KEYSYMs se transformam em texto ou podem afetar somente um futuro KEYSYM. Um exemplo é Shift_L, é claro, que não tem representação textual, mas há também um número de KEYSYMs que são usados para compor outro caractere. Uma lista deles no meu sistema está em /usr/share/X11/locale/en_US.UTF-8/Compose . Um exemplo é o KEYSYM dead_acute que, quando pressionado, tentará converter o próximo KEYSYM em uma letra acentuada aguda. Existe um mapeamento padrão para transformar os KEYSYMs em Unicode.

Agora que tudo isso foi dito, note que o Xmodmap é obsoleto e substituído pelo XKB, que é muito mais sofisticado. Isso afeta como os KEYCODEs são mapeados para KEYSYMs, mas não como o kernel gera KEYCODEs nem como os KEYSYMs são convertidos em texto ou compostos que ainda são os mesmos. O XKB pode ser desativado restaurando o comportamento do Xmodmap. Ele também tem uma camada de compatibilidade para suportar o Xmodmap, mas pode ter problemas, pois não é totalmente compatível. As regras do XKB estão abaixo de /usr/share/X11/xkb/ e são muito mais sofisticadas. Há uma boa documentação em outros lugares sobre como ele gera layouts de teclado para mapear KEYCODEs para KEYSYMs.

Quanto ao console Linux, ele possui seus próprios layouts de teclado, que são armazenados em /usr/share/keymaps e carregados com o comando loadkeys . Quando estiver nos estágios da BIOS e do carregador de inicialização anterior, incluindo o GRUB2, o mapeamento do teclado é o número para o qual o BIOS decide mapear a chave.

    
por 03.05.2011 / 13:39