Como fazer com que o ISO_Level5_Shift funcione?

0

Eu queria adicionar mais níveis aos meus layouts de teclado, então decidi habilitar a chave level5. Já tive level3 em Menu e gostaria de mapear RAlt para ISO_Level5_Shift.

No entanto, setxkbmap não tem opção para isso. /usr/share/X11/xkb/rules/evdev.lst contém apenas as seguintes opções em relação ao switch lv5:

lv5:lsgt_switch_lock
lv5:ralt_switch_lock
lv5:lwin_switch_lock
lv5:rwin_switch_lock

Como se o mapeamento de uma chave simples não fosse possível. Isso já sugeriu problemas. Sabendo que setxkbmap faz internamente, é fácil criar uma opção para ativar o comutador lv5 e configurá-lo para a direita Alt :

-option "lv5:ralt_switch"

E, apesar de setxkbmap ter essa opção e retornar com sucesso, não há mapeamento.

Depois de encontrar uma resposta para uma pergunta semelhante aqui , construí um arquivo xkbcomp personalizado.

xkb_keymap {

    xkb_geometry {
        include "pc(pc104)"
    };


    xkb_keycodes {
        include "evdev"
        include "aliases(qwerty)"
    };


    xkb_types {
        include "complete"
    };


    xkb_compatibility {
        include "complete"
        include "ledscroll(group_lock)"
    };


    xkb_symbols {
        include "pc+us+ru:2+inet(evdev)"
        include "group(rctrl_rshift_toggle)"
        include "ctrl(swapcaps)"
        include "keypad(oss)"
        include "kpdl(dot)"
        include "terminate(ctrl_alt_bksp)"
        include "level3(modifier_mapping)"
        include "level3(menu_switch)"
        include "level5(modifier_mapping)"
        include "level5(ralt_switch)"

        key <AB06> {
            type= "EIGHT_LEVEL",
            symbols[Group1]= [               n,               N, n, n, u, i, o, p ],
            symbols[Group2]= [     Cyrillic_te,     Cyrillic_TE, n, n, u, i, o, p ]
        };

    };


};

Isso deve atribuir a tecla Menu para ser ISO_Level3_Shift e RAlt para ser ISO_Level5_Shift. E as chaves são atribuídas, mas há um erro:

$ xkbcomp  ~/new.xkbcomp.xkb :0
Error:            Key <MDSW> added to map for multiple modifiers
                  Using Mod3, ignoring Mod5.

xkbcomp retorna com o código 0, apesar de ter ocorrido um erro.

O mapeamento na chave N deveria ter feito os níveis 5 a 8 "u", "i", "o" e "p", mas a RAlt envia os habituais n e N nos oito níveis (se os níveis & gt ; 4 realmente funcionam).

Na tentativa de determinar como resolvo este erro, descobri que <MDSW> está definido em ... o próprio arquivo de regras para "pc".

/usr/share/X11/xkb/symbols/pc :

xkb_symbols "pc105" {
    …
    // Fake keys for virtual<->real modifiers mapping:
    key <LVL3> {    [ ISO_Level3_Shift  ]   };
    key <MDSW> {    [ Mode_switch       ]   };
    modifier_map Mod5   { <LVL3>, <MDSW> };
    …
};

E aqui está outra coisa estranha: eu incluo o modelo de teclado pc104, mas esse código se refere ao pc105 e não deve ser originado de forma alguma. No entanto… xkb_symbols "pc104" está longe de ser encontrado. E esse arquivo "symbols / pc" é o único outro arquivo em /usr/share/X11/xkb/ que define ou modifica a atribuição <MDSW> para as chaves Mod *. O outro arquivo é "symbols / level5", que faz isso em xkb_symbols "modifier_mapping" .

// Ensure a mapping to a real modifier for LevelFive.
partial modifier_keys
xkb_symbols "modifier_mapping" {
  replace key <MDSW> {
    type[Group1] = "ONE_LEVEL",
    symbols[Group1] = [ ISO_Level5_Shift ]
  };
  modifier_map Mod3 { <MDSW> };
};

Acho que esse conflito pode impedir que o switch lv3 e o lv5 funcionem ao mesmo tempo, mas não tenho certeza. É preocupante que em outra resposta , a chave Mode_switch esteja presente entre as teclas Mod *, e depois de carregar o meu new.xkbcomp.xkb don veja em qualquer lugar:

$  xmodmap -pm
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x25)
control     Control_L (0x42),  Control_R (0x69)
mod1        Alt_L (0x40),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3        ISO_Level5_Shift (0xcb)
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c)
    
por tijagi 05.08.2018 / 19:17

0 respostas

Tags