A solução a seguir é bárbara, mas funciona (desde que você esteja satisfeito com uma trava Level3 em vez de uma troca de Level3 - a diferença é que, com esta última, todas as teclas devem ser pressionadas ao mesmo tempo, enquanto ex você pressiona primeiro LeftCtrl + LeftAlt , libera isso e só então pressiona a tecla a ser deslocada) e não requer root.
setxkbmap -option grp:lctrl_lalt_toggle
xmodmap -e 'keycode 37 = Control_L ISO_Level3_Latch'
xmodmap -e 'keycode 64 = Alt_L ISO_Level3_Latch'
Explicação de como isso funciona:
A opção xkb grp: lctrl_lalt_toggle faz com que LeftCtrl mude LeftAlt para level2 e vice-versa (veja: /usr/share/X11/xkb/symbols/group
). Também faz com que o deslocamento de nível 2 de LeftCtrl e LeftAlt seja ISO_Next_Group, o que é indesejável, já que queremos que seja ISO_Level3_Latch, portanto usamos o xmodmap para mudar o level2 para ISO_Level3_Latch para ambos os LeftCtrl e LeftAlt (mantendo o nível 1 como Control_L e Alt_L). Os códigos de teclas (37 e 64) podem ser encontrados inspecionando a saída de xmodmap -pke
ou usando xev
.
Se apenas aplicássemos as redefinições do xmodmap (sem usar setxkbmap
primeiro), então a chave responsável pelo deslocamento do nível 2 seria Shift , como é para quase todas as chaves, então Shift + Ctrl Esquerda e Deslocamento + LeftAlt (mas não LeftCtrl + LeftAlt ) se tornaria Travas Level3.
Por que temos que usar uma trava de nível 3 em vez de uma troca de nível 3?
Se você fosse usar ISO_Level3_Shift ao invés de ISO_Level3_Latch, você teria que pressionar simultaneamente LeftCtrl + LeftAlt + YourDesiredKey , para o level3 mudar para ocorrer. Infelizmente, LeftCtrl e LeftAlt ainda permanecem modificadores, assim, além de YourDesiredKey ser corretamente alterado, ele também seria "modificado" por um dos Alt ou Ctrl (dependendo do que você pressionou primeiro). Com a trava, você não tem esse problema.