Wie kann ich meine ISO_Level5_Shift-Pfeiltasten in Java Swing-GUIs zum Laufen bringen?

Wie kann ich meine ISO_Level5_Shift-Pfeiltasten in Java Swing-GUIs zum Laufen bringen?

Ich habe ein Tastaturlayout, das ISO_Level5_ShiftPfeiltasten bereitstellt. Aus meiner Layoutsymboldatei:

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   ]};

Diese funktionieren in den meisten Programmen (Firefox, Eclipse, Vim, ...). Leider funktionieren sie in keiner Java Swing-GUI, die ich je verwendet habe. Insbesondere funktionieren sie nicht in IntelliJ IDEA, und das ist es, was mich besonders gestört hat.

Kann ich etwas an meinem Layout, den Java-bezogenen Umgebungsvariablen oder der IDEA-Konfiguration ändern, um dieses Problem zu beheben?

Antwort1

OK, ich habe eine Lösung gefunden. Sie ist nicht ganz ideal, führt aber zum gewünschten Verhalten.

Zuerst habe ich dievollständiger Zustandmeiner Tastaturkonfiguration mit

$ xkbcomp $DISPLAY - > now.xkb

Dann fand ich die Zeilen

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

und änderte es in

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

Dadurch wird verhindert, dass der Modifikator „klebrig“ ist, d. h. er wird nur angewendet, während Sie die Taste gedrückt halten.

Dann habe ich den Schlüssel genommen, der früher mein ISO_Level5_Shift war:

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

und habe es in Overlay1_Enable geändert:

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

Dann habe ich für jede Taste, bei der die Änderung wirksam werden sollte, eine Overlay-Definition hinzugefügt:

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

Dann habe ich das Ganze nochmal aufgetragen mit

$ xkbcomp now.xkb $DISPLAY

Nützliche Dokumentation:

Antwort2

Ich hatte damit auch ein Problem. Hier ist meine Lösung, bei der ich die Feststelltaste als Overlay-Schalter verwende, um eine Emacs-/Vim-ähnliche Navigation zu ermöglichen. Hoffentlich hilft sie jedem, der etwas Ähnliches tun möchte.

// 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

};

Antwort3

Insbesondere funktionieren sie nicht in IntelliJ IDEA, und das ist es, was mich besonders gestört hat.

Es gibt einen Workaround: die gewünschten Schlüssel können auf der IntelliJ IDEA-Seite zugeordnet werden.

  1. Gehen Sie zu Einstellungen ⇒ Tastenbelegung.
  2. Suchen Sie nach einer Taste, die nicht funktioniert, wenn die Tastenkombination „Isolevel-Umschaltung“ gedrückt wird (zum Beispiel die Taste „Auf“).
  3. Wählen Sie „Tastaturkürzel hinzufügen“.
  4. Drücken Sie die Tastenkombination „Isolevel-Umschalt“, die in IntelliJ nicht als „Auf“-Taste funktioniert.
  5. Anwenden.

Voilà, die Tastenkombination „Iso Level Shift“ verhält sich wie die Taste „Auf“sogarin IntelliJ IDEA.

Antwort4

Ich habe eine andere Lösung gefunden, die etwas mehr Arbeit macht, aber letztendlich robuster und mit mehr unterschiedlicher Software funktioniert.

Die Grundidee besteht darin, XKB zu überspringen unddirekt auf den Ereignisbehandlungsmechanismus des Kernels zugreifen.

Sobald Sie dies getan haben, können Sie genau steuern, welche Tastencodes alle Software erkennt.

Am Ende erstellte ich einallgemeines Tastenneubelegungstoolum das zu erreichen.

verwandte Informationen