Как заставить клавиши со стрелками ISO_Level5_Shift работать в графических интерфейсах Java Swing?

Как заставить клавиши со стрелками ISO_Level5_Shift работать в графических интерфейсах Java Swing?

У меня есть раскладка клавиатуры, которая использует ISO_Level5_Shiftдля предоставления клавиш со стрелками. Из моего файла символов раскладки:

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

Они работают в большинстве программ (Firefox, Eclipse, Vim, ...). К сожалению, они не работают ни в одном Java Swing GUI, который я когда-либо использовал. В частности, они не работают в IntelliJ IDEA, и это то, что меня особенно беспокоит.

Можно ли что-то изменить в моем макете, переменных среды Java или конфигурации IDEA, чтобы решить эту проблему?

решение1

Хорошо, я нашел решение. Оно не идеальное, но оно обеспечивает желаемое поведение.

Сначала я выбросилполное состояниемоей конфигурации клавиатуры с использованием

$ xkbcomp $DISPLAY - > now.xkb

Затем я нашел строки

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

и изменил его на

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

что предотвращает «залипание» модификатора, т.е. его применение только пока вы удерживаете клавишу.

Затем я взял клавишу, которая раньше была моей ISO_Level5_Shift:

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

и изменил его на Overlay1_Enable:

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

Затем для каждой клавиши, где я хотел, чтобы изменение вступило в силу, я добавил определение наложения:

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

Затем снова нанесли все это с помощью

$ xkbcomp now.xkb $DISPLAY

Полезная документация:

решение2

У меня тоже была эта проблема, вот мое решение с использованием клавиши Caps Lock в качестве переключателя наложения для включения навигации в стиле emacs/vim, надеюсь, это поможет тем, кто хочет сделать что-то подобное.

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

};

решение3

В частности, они не работают в IntelliJ IDEA, и именно это меня особенно раздражает.

Есть обходной путь — сопоставить нужные клавиши на стороне IntelliJ IDEA.

  1. Перейдите в Настройки ⇒ Раскладка клавиатуры.
  2. Найдите клавишу, которая не работает при нажатии комбинации клавиш «ISO Level Shift» (например, клавиша «Вверх»).
  3. Выберите «Добавить сочетание клавиш».
  4. Нажмите комбинацию клавиш «iso level shift», которая не работает как клавиша «Вверх» в IntelliJ.
  5. Применять.

Вуаля, комбинация клавиш «изоуровень сдвига» действует как клавиша «вверх»дажев IntelliJ IDEA.

решение4

Я нашел другое решение, которое требует немного больше работы, но в конечном итоге работает более надежно в большем количестве различного программного обеспечения.

Основная идея — пропустить XKB инапрямую подключайтесь к механизму обработки событий ядра.

Сделав это, вы сможете точно контролировать, какие коды клавиш видит все программное обеспечение.

Я закончил тем, что создалуниверсальный инструмент переназначения клавишчтобы этого добиться.

Связанный контент