Os layouts XKB são definidos em um modelo chamado RMLVO
: Regras, Modelo, Layout, Variante, Opções. O banco de dados do sistema XKB geralmente está em /usr/share/X11/xkb
:
/usr/share/X11/xkb/
├── compat # ??? dark magic here, avoid
├── geometry # as in physical, eg for generating layout maps
├── keycodes # helpful for translating keycodes (from xev) to <FOO>
├── rules # "evdev" is the important one; *.lst & *.xml are descriptions
├── symbols # main layouts, variants, optional overrides
└── types # ??? dark magic here, avoid
O diretório keycodes
irá definir keynames como <CAPS>
ou <AC01>
dos scancodes que as chaves estão gerando. setxkbmap -query -verbose 10
mostrará exatamente quais arquivos são acessados para criar seu mapa de chaves atual; quando ele diz keycodes: evdev+aliases(qwerty)
, ele está carregando o arquivo ../keycodes/evdev
e a sub-rotina qwerty
do arquivo ../keycodes/aliases
. Se você usar ferramentas como xev
para determinar qual código-chave uma chave está gerando, esses arquivos mostrarão qual nome-chave está mapeado para esse código.
Sua pergunta sobre modificadores é mais difícil. Eu só vi referências a 8 níveis ISO , e não tenho certeza se isso é uma limitação XKB ou simplesmente que nenhum layout comum usa mais do que isso. (Depois de examinar isso mais, tenho certeza que você teria que alterar o código XKB para adicionar mais
symbol press this
level 1 a key
level 2 A shift+key
level 3 á <level3>+key
level 4 Á <level3>+shift+key
level 5 ?? <level5>+key
level 6 ?? <level5>+shift+key
level 7 ?? <level5>+<level3>+key
level 8 ?? <level5>+<level3>+shift+key
Como você pode ver, em um layout de 8 níveis, há apenas 2 teclas que atuam como chaves de "novo modificador". Veja /usr/share/X11/xkb/compat/level5
e /usr/share/X11/xkb/types/level5
, onde os comportamentos de deslocamento, trava e bloqueio de nível 5 são definidos; estes são então anexados às chaves por opções de símbolos definidas em /usr/share/X11/xkb/symbols/level5
.
Se você definiu seu próprio modificador level9
, a combinação com os níveis existentes fornecerá mais 8 níveis antes que você precise de outro modificador de nível:
symbol press this
level 9 ?? <level9>+key
level 10 ?? <level9>+shift+key
level 11 ?? <level9>+<level3>+key
level 12 ?? <level9>+<level3>+shift+key
level 13 ?? <level9>+<level5>+key
level 14 ?? <level9>+<level5>+shift+key
level 15 ?? <level9>+<level5>+<level3>+key
level 16 ?? <level9>+<level5>+<level3>+shift+key
Como você pode ver, isso está começando a ser um monte de teclas pressionadas de uma só vez. O uso de bloqueios e trincos em vez de turnos reduziria isso, mas isso seria um layout muito complicado, e imaginamos apenas adicionar um selecionador de nível. Cada seletor adicional dobraria os níveis existentes.
Os "modificadores" que você imagina provavelmente estão selecionando um nível específico, e é por isso que você acha que precisa de tantos. Você pode definir ações de seleção como essa e colocá-las em, digamos, level3 dessas chaves, então level3+key9
te dá uma level14_latch
action, e então qualquer tecla que você apertar em seguida te dará o 14º nível daquele chave.
Editar : Outra pergunta perguntada especificamente sobre como fazer um ISO_Level4_{Shift,Latch,Lock}
e Eu demonstrei um falso ISO_Level4_Latch
usando keyyms e ações XKB existentes. Esse método deve ser efetivo para os níveis 4, 6, 7 e 8.