Como fazer um ISO_Level4_Shift e Bloquear no xkb?

3

Gostaria de saber se é possível definir uma chave como um modificador ou bloqueador de nível 4 no xkb em vez de usar: Shift + ISO_Level3_Shift (a.k.a AltGr).

Mesma pergunta com os níveis 6, 7 e 8 (usando "EIGHT_LEVEL" ou variantes).

Como é possível com os níveis 3 e 5, então por que não com os outros?

    
por Yahyalexandre 09.08.2016 / 02:56

1 resposta

2

É possível, mas um pouco hacky. Nenhum keyyms específico já está definido. ISO_Level3_{Shift,Latch,Lock} (e os mesmos três para level5) são definidos em cabeçalhos X11 e libxkbcommon em tempo de compilação.

No tempo de execução, eles são ativados no módulo compatibility via interpret stanzas e actions ; Por exemplo, examine seu mapa de chaves atual:

$ xkbcomp $DISPLAY - | less

//....
xkb_compatibility "complete+ledcaps(shift_lock)" {
    //....
    interpret ISO_Level3_Shift+AnyOf(all) {
        virtualModifier= LevelThree;
        useModMapMods=level1;
        action= SetMods(modifiers=LevelThree,clearLocks);
    };
    interpret ISO_Level3_Latch+AnyOf(all) {
        virtualModifier= LevelThree;
        useModMapMods=level1;
        action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
    };
    interpret ISO_Level3_Lock+AnyOf(all) {
        virtualModifier= LevelThree;
        useModMapMods=level1;
        action= LockMods(modifiers=LevelThree);
    };
    //....
    interpret ISO_Level3_Shift+AnyOfOrNone(all) {
        action= SetMods(modifiers=LevelThree,clearLocks);
    };
    interpret ISO_Level3_Latch+AnyOfOrNone(all) {
        action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
    };
    interpret ISO_Level3_Lock+AnyOfOrNone(all) {
        action= LockMods(modifiers=LevelThree);
    };
//....

Existe um ISO_Level2_Latch keysym existente. Ele não tem compatibilidade existente com interpret como o acima, mas se você adicioná-los, ele opera conforme o esperado. ( Shift já está lá, então ISO_Level2_Shift é desnecessário; Shift_Lock ou Caps_Lock toma o lugar de ISO_Level2_Lock .) Portanto, se você quiser uma chave Shift_Latch , use o ISO_Level2_Shift keysym e adicione-as a seu mapa de teclado:

    interpret ISO_Level2_Latch+AnyOf(all) {
        useModMapMods=level1;
        action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
    };
    interpret ISO_Level2_Latch+AnyOfOrNone(all) {
        action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
    };

Podemos usar esse tipo de abordagem para os níveis 4, 6, 7 e 8, mas não há keyyms pré-definidos para ISO_Level4_Shift et al. Você poderia adicioná-los ao código e recompilar, ou poderia redirecionar alguns keysym não usados e interpretá-los como se fossem um deslocamento de nível 4 (ou trava ou bloqueio). Examinando os arquivos de cabeçalho em libxkbcommon , encontramos todos os nomes de keysym que o XKB conhece; parece que eles servem para nossos propósitos:

//....in xkbcommon/xkbcommon-keysyms.h:
//....
#define XKB_KEY_ISO_Fast_Cursor_Left          0xfe2c
#define XKB_KEY_ISO_Fast_Cursor_Right         0xfe2d
#define XKB_KEY_ISO_Fast_Cursor_Up            0xfe2e
#define XKB_KEY_ISO_Fast_Cursor_Down          0xfe2f

Remova o prefixo XKB_KEY_ para obter os nomes do keysym que podemos referenciar nas regras do XKB. Vamos usar ISO_Fast_Cursor_Left para falsificar ISO_Level4_Latch .

Primeiro, gere um mapa de teclado básico, com setxkbmap -print ; então editaremos esse arquivo e adicionaremos substituições a ele e, finalmente, carregaremos o mapa de chaves alterado com xkbcomp [file] $DISPLAY :

$ setxkbmap -print > mykeymap.xkb
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us(altgr-intl)+inet(evdev)" };
    xkb_geometry  { include "pc(pc105)" };
};

Agora edite esse arquivo e insira as substituições necessárias:

// Attempting to define and use a key as Level4 Shift/Latch/Lock.
// Plan: * activate lv5 shift on rctrl.
//       * place latches on lv5 of keys 2,3,4,5 for corresponding level.
//       * replace keys ASDF with 8-level versions and define symbols for test.
//       * pressing RCtrl+4 then A should result in Á

// starting point: setxkbmap -layout us -variant altgr-intl -option '' -print
// load this file: xkbcomp myfile.xkb $DISPLAY
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"      };
    xkb_compat    { 
        include "complete"      

        // add in interpretations
        // ISO_Level3_Latch includes a +AnyOf stanza and a +AnyOfOrNone stanza (same for ISO_Level5_Latch)
        // assume each additional latch needs both
        interpret ISO_Level2_Latch+AnyOf(all) {
            useModMapMods=level1;
            action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
        };
        interpret ISO_Level2_Latch+AnyOfOrNone(all) {
            action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
        };
        interpret ISO_Fast_Cursor_Left+AnyOf(all) {
            // Level4 needs both Shift and LevelThree
            useModMapMods=level1;
            action= LatchMods(modifiers=Shift+LevelThree,clearLocks,latchToLock);
        };
        interpret ISO_Fast_Cursor_Left+AnyOfOrNone(all) {
            // Level4 needs both Shift and LevelThree
            action= LatchMods(modifiers=Shift+LevelThree,clearLocks,latchToLock);
        };
    };
    xkb_symbols   { 
        include "pc"
        include "us(altgr-intl)"
        include "inet(evdev)"

        // latch keys
        key <AE02> {
            type= "EIGHT_LEVEL",
            symbols[Group1]= [ 2, at, twosuperior, dead_doubleacute, ISO_Level2_Latch, X, z, Z ]
        };
        key <AE03> {
            type= "EIGHT_LEVEL",
            symbols[Group1]= [ 3, numbersign, threesuperior, dead_macron, ISO_Level3_Latch, X, z, Z ]
        };
        // no ISO_Level4_Latch so use ISO_Fast_Cursor_Left
        key <AE04> {
            type= "EIGHT_LEVEL",
            symbols[Group1]= [ 4, dollar, currency, sterling, ISO_Fast_Cursor_Left, X, z, Z ]
        };
        key <AE05> {
            type= "EIGHT_LEVEL",
            symbols[Group1]= [ 5, percent, EuroSign, dead_cedilla, ISO_Level5_Latch, X, z, Z ]
        };
        // no ISO_Level6_Latch so use ISO_Fast_Cursor_Right
        // no ISO_Level7_Latch so use ISO_Fast_Cursor_Up
        // no ISO_Level8_Latch so use ISO_Fast_Cursor_Down

        // eight-level keys ASDF for testing
        key <AC01> {
            type= "EIGHT_LEVEL_SEMIALPHABETIC",
            symbols[Group1]= [ a, A, aacute, Aacute, agrave, Agrave, aring, Aring ]
        };
        key <AC02> {
            type= "EIGHT_LEVEL_SEMIALPHABETIC",
            symbols[Group1]= [ s, S, ssharp, section, ccedilla, Ccedilla, ntilde, Ntilde ]
        };
        key <AC03> {
            type= "EIGHT_LEVEL_SEMIALPHABETIC",
            symbols[Group1]= [ d, D, eth, ETH, thorn, THORN, t, T ]
        };
        key <AC04> {
            type= "EIGHT_LEVEL_SEMIALPHABETIC",
            symbols[Group1]= [ f, F, eacute, Eacute, x, X, z, Z ]
        };

        // ISO_Level3_Shift on Right Alt
        include "level3(ralt_switch)"
        // ISO_Level5_Shift on Right Ctrl
        include "level5(rctrl_switch)"  
    };
    xkb_geometry  { include "pc(pc105)"     };
};

Agora você pode testar as travas (no exemplo acima, ISO_Level5_Shift deve ser a tecla Right Ctrl ; execute novamente o comando xkbcomp , se não estiver):

  • ISO_Level5_Shift+2 then a deve imprimir A
  • ISO_Level5_Shift+3 then a deve imprimir á
  • ISO_Level5_Shift+4 then a deve imprimir Á
  • ISO_Level5_Shift+5 then a deve imprimir à

Em testes, notei que o deslocamento de RCtrl-como-level5 é um pouco escasso e nem sempre é aplicado corretamente. Geralmente, executar novamente o comando xkbcomp uma ou duas vezes fará com que ele funcione corretamente. Teste com as teclas A ou F ; Ctrl + D provavelmente sairá do seu shell.

Algumas aplicações não reconhecem nosso keysym emprestado e podem fazer coisas estranhas. Por exemplo, o Firefox imprimirá o 4 mesmo ao ativar as travas adequadas, portanto, a seqüência de teclas rctrl+4 then a resultará em ; isto não acontece para os teclados reais em 3 e 5, então talvez emprestar um keysym diferente permitirá ao Firefox reconhecer que nada deve ser impresso. Até agora, a maioria dos aplicativos de terminal está operando conforme o esperado.

    
por 22.12.2017 / 22:42