Como posso fazer com que minhas teclas de seta ISO_Level5_Shift funcionem nas GUIs do Java Swing?

1

Eu tenho um layout de teclado que usa ISO_Level5_Shift para fornecer as teclas de seta. Do meu arquivo de símbolos de layout:

key <AC06> { type[Group1]="EIGHT_LEVEL", [ d, D, ampersand,  U2227, Home,  Home,  Greek_delta,   Greek_DELTA   ]};
key <AC07> { type[Group1]="EIGHT_LEVEL", [ h, H, parenright, U27E9, Left,  Left,  Greek_eta,     Greek_ETA,  U210F  ]};
key <AC08> { type[Group1]="EIGHT_LEVEL", [ t, T, parenleft,  U27E8, Down,  Down,  Greek_tau,     Greek_TAU     ]};
key <AC09> { type[Group1]="EIGHT_LEVEL", [ n, N, slash,      U2115, Right, Right, Greek_nu,      Greek_NU      ]};
key <AC10> { type[Group1]="EIGHT_LEVEL", [ s, S, underscore, U2237, End,   End,   Greek_sigma,   Greek_SIGMA   ]};

Estes funcionam na maioria dos programas (Firefox, Eclipse, Vim, ...). Infelizmente eles não funcionam em nenhuma GUI Java Swing que eu já usei. Em particular, eles não funcionam no IntelliJ IDEA, e é isso que tem me incomodado em particular.

Há algo que eu possa alterar no meu layout, ou variáveis de ambiente relacionadas ao Java ou configuração do IDEA, que possam corrigir esse problema?

    
por Owen 28.02.2013 / 05:39

3 respostas

6

OK, encontrei uma solução. Não é realmente ideal, mas obtém o comportamento desejado.

Primeiro, eu despejei o estado completo da configuração do teclado usando

$ xkbcomp $DISPLAY - > now.xkb

Então eu encontrei as linhas

interpret Overlay1_Enable+AnyOfOrNone(all) {
    action= LockControls(controls=Overlay1);
};

e alterou para

interpret Overlay1_Enable+AnyOfOrNone(all) {
    action= SetControls(controls=Overlay1);
};

que impede que o modificador seja "pegajoso", isto é, aplica-se apenas quando você está segurando a tecla.

Então peguei a chave que costumava ser minha ISO_Level5_Shift:

key  <TAB> {
    type= "ONE_LEVEL",
    symbols[Group1]= [ ISO_Level5_Shift ]
};

e alterou para Overlay1_Enable:

key  <TAB> {
    type= "ONE_LEVEL",
    symbols[Group1]= [ Overlay1_Enable ]
};

Em seguida, para cada chave em que eu queria que a alteração tivesse efeito, adicionei uma definição de sobreposição:

key <AD07> {
    type= "EIGHT_LEVEL",
    overlay1= <PGUP>,
    symbols[Group1]= [               g,               G,        asterisk,               G,           Prior,               G,     Greek_gamma,     Greek_GAMMA ]
};

Em seguida, reaplicou tudo com

$ xkbcomp now.xkb $DISPLAY

Documentação útil:

por 28.02.2013 / 07:57
0

Eu estava tendo problemas com isso também, aqui está a minha solução usando a tecla caps lock como o interruptor de sobreposição para ativar o emacs / vim como navegação, espero que ajude alguém a fazer algo semelhante.

// Emacs like keys with CAPS as overlay switch.

// Using ISO_Level3_Shift or ISO_Level5_Shift would also make
// most applications work and would have been more flexible,
// however they don't work in Java Swing apps (e.g. IntelliJ IDEA)
// but using overlay works

// To enable, save this file as /usr/share/X11/xkb/symbols/emacs and run:
//
//   setxkbmap -option '' "emacs"
//
// However it may not persist and can get reset back to the default by other things.
// Alternatively, insert the following into /usr/share/X11/xkb/rules/evdev.xml
// ...
// <layoutList>
//   ...
//   <layout>
//     <configItem>
//       <name>emacs</name>
//       <shortDescription>en</shortDescription>
//       <description>English (US, Emacs)</description>
//       <languageList>
//         <iso639Id>eng</iso639Id>
//       </languageList>
//     </configItem>
//   </layout>
//   ...
// </layoutList>
// ...
// Then you should be able to choose 'English (US, Emacs)' in a keyboard preference
// GUI such as fcitx and have it persist.

default partial alphanumeric_keys
xkb_symbols "basic" {

    // Base keyboard functionality, using 'us' here
    // See definitions in /usr/share/X11/xkb/symbols
    // e.g. 'include "us(intl)"' where 'intl' is defined inside the 'us' file
    include "us"

    // Press Shift_L + Shift_R together as an alternative way to toggle Caps_Lock,
    // then turn CAPS key to enable overlay1 mode when and only when holding down.
    include "shift(both_capslock)"
    key <CAPS> {actions[Group1]=[SetControls(controls=overlay1)]};

    // Emacs like navigation keys when holding down <CAPS>
    // e.g. caps + n to go down
    key <AB05> {overlay1=<LEFT>}; // b
    key <AC04> {overlay1=<RGHT>}; // f
    key <AD10> {overlay1=<UP>  }; // p
    key <AB06> {overlay1=<DOWN>}; // n
    key <AC01> {overlay1=<HOME>}; // a
    key <AD03> {overlay1=<END> }; // e
    key <AC05> {overlay1=<ESC> }; // g

    // Emacs like editing keys when holding down <CAPS>
    // Redo/Undo only work with applications that understand the them
    key <AB10> {overlay1=<UNDO>}; // /
    key <UNDO> {[Undo, Redo]};    // Shift + / -> Redo
    key <AC03> {overlay1=<DELE>}; // d

    // VIM like navigation keys when holding down <CAPS>
    key <AC06> {overlay1=<LEFT>}; // h
    key <AC09> {overlay1=<RGHT>}; // l
    key <AC08> {overlay1=<UP>  }; // k
    key <AC07> {overlay1=<DOWN>}; // j

};
    
por 06.06.2018 / 04:50
0

In particular, they do not work in IntelliJ IDEA, and this is what has been bugging me in particular.

Existe a solução alternativa - para mapear as chaves desejadas no lado do IntelliJ IDEA.

  1. Vá para Configurações ⇒ Mapa de Teclas.
  2. Procure uma tecla que não funcione quando a combinação de teclas "iso level shift" for pressionada (digamos, tecla "Up").
  3. Escolha "Adicionar atalho de teclado".
  4. Pressione a combinação de teclas “iso level shift” que não funciona como tecla “Up” no IntelliJ.
  5. Aplicar.

Voilà, a combinação de teclas “nível iso” se comporta como tecla “Up” mesmo no IntelliJ IDEA.

    
por 17.08.2018 / 15:49