xkb: Atribui um novo nível de mudança para teclas de função

3

Estou tentando usar mais as minhas teclas de função. Eu gostaria que as chaves físicas F1 para F12 aparecessem como F21 a F32 , para que eu pudesse atribuir funções a F21 etc. em meu gerenciador de janelas ( por exemplo, mude para a janela de chat ativa sempre que eu pressionar F22 .)

No entanto, eu ainda quero acessar as teclas de função normais, então gostaria de poder segurar a tecla física Caps Lock e pressionar F1 para gerar uma F1 pressione o botão. No que diz respeito aos outros modificadores, seria bom se eles fossem deixados inalterados, então Shift + F1 produz Shift + F1 (não Shift + F21 ). Em resumo:

  • F1 - > %código%
  • Caps + F1 - > %código%
  • Deslocamento + F1 - > F21 (inalterado)
  • Alt + F1 - > F1 (inalterado)
  • etc.

Portanto, apenas os dois primeiros pontos exigem alterações do layout padrão.

Eu tentei começar com o seguinte trecho XKB, e enquanto ele produz Shift + F1 para F1 , ele não produz as teclas F originais quando Caps Lock é realizada:

partial
xkb_types "hyper" {
    virtual_modifiers Alt,Hyper;
    type "HYPER" {
        modifiers= Hyper+Control+Alt;
        map[Hyper]= Level2;
        map[Control+Alt]= Level3;
        level_name[Level1]= "Extra";
        level_name[Level2]= "Normal";
        level_name[Level3]= "Normal+Ctrl+Alt";
    };
};

partial function_keys
xkb_symbols "hyper_f21" {

    replace key <FK01> {
        type= "HYPER",
        symbols[Group1]= [           F21,             F1, XF86Switch_VT_1 ]
    };
    replace key <FK02> {
        type= "HYPER",
        symbols[Group1]= [           F22,             F2, XF86Switch_VT_2 ]
    };
    ...
};

partial modifier_keys
xkb_symbols "caps_hyper" {
    replace key <CAPS> {
        [ Hyper_L, Hyper_L ]
    };
    modifier_map Lock { <KPDL> };  # Not sure how to clear modifiers, so assign an unused key
    modifier_map Mod3 { <CAPS> };
};

Quando tento carregá-lo, recebo este aviso:

Warning:          Type "HYPER" has 3 levels, but <FK01> has 5 symbols
                  Ignoring extra symbols

Eu realmente não entendo porque recebo o erro, porque embora o padrão Alt + F1 tenha cinco níveis, o meu redefinido tem apenas três.

Quando eu testo esta configuração, com certeza eu recebo F21 ao pressionar a tecla física F1 , e eu recebo <FK01> (e F21 ) definido ao pressionar Bloquear . No entanto, pressionar Caps Lock + F1 produz Hyper_L em vez de Mod3 .

    
por Malvineous 16.09.2014 / 05:04

1 resposta

4

Como sempre, descobri isso momentos depois de postar a pergunta. O problema foi simplesmente que eu estava usando Hyper_L , que por padrão é atribuído a Mod4 . Ao mudar Caps Lock para Hyper_R , funcionou. Ele ainda precisava estar vinculado a Mod3 , embora ainda seja necessário um modificador real.

Aqui está a configuração atualizada, que agora produz o comportamento desejado:

partial
xkb_types "hyper" {
    virtual_modifiers Alt,Hyper;

    type "HYPER" {
        modifiers= Shift+Control+Alt+Hyper;

        map[Shift]= Level2;
        preserve[Shift]= Shift;

        map[Control]= Level2;
        preserve[Control]= Control;

        map[Shift+Control]= Level2;
        preserve[Shift+Control]= Shift+Control;

        map[Alt]= Level2;
        preserve[Alt]= Alt;

        map[Shift+Alt]= Level2;
        preserve[Shift+Alt]= Shift+Alt;

        map[Control+Alt]= Level3;
        preserve[Control+Alt]= Control+Alt;

        map[Shift+Control+Alt]= Level2;
        preserve[Shift+Control+Alt]= Shift+Alt;

        map[Hyper]= Level2;

        level_name[Level1]= "Extra";
        level_name[Level2]= "Normal";
        level_name[Level3]= "Ctrl+Alt";
    };
};


partial function_keys
xkb_symbols "hyper_f21" {

    replace key <FK01> {
        type= "HYPER",
        symbols[Group1]= [           F21,             F1, XF86Switch_VT_1 ]
    };
    replace key <FK02> {
        type= "HYPER",
        symbols[Group1]= [           F22,             F2, XF86Switch_VT_2 ]
    };
    ...
};

partial modifier_keys
xkb_symbols "caps_hyper" {
    replace key <CAPS> {
        [ Hyper_R ]
    };
    # Remove Hyper (Hyper_L/Hyper_R) from Mod4, was added by "pc" layout
    modifier_map none { <HYPR> };
    # Now make physical caps lock (mapped to Hyper_R above) control Mod3.  Mod3 is
    # associated with the virtual modifier "Hyper" because the existing XKB config
    # links Hyper_L and Hyper_R with this virtual modifier.  Therefore Mod3 becomes
    # the virtual modifier "Hyper" because they both share the same keysym Hyper_R.
    modifier_map Mod3 { <CAPS> };
};

Novamente, isso acontece:

  • F1 - > %código%
  • Caps + F1 - > %código%
  • Deslocamento + F1 - > F21 (inalterado)
  • Alt + F1 - > F1 (inalterado)
  • etc. - todos os outros inalterados
por 16.09.2014 / 05:40