如何让我的 ISO_Level5_Shift 箭头键在 Java Swing GUI 中工作?

Owe*_*wen 2 keyboard java keyboard-layout intellij-idea 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   ]};
Run Code Online (Sandbox Code Playgroud)

它们适用于大多数程序(Firefox、Eclipse、Vim 等)。不幸的是,它们在我使用过的任何 Java Swing GUI 中都不起作用。特别是,它们在 IntelliJ IDEA 中不起作用,这尤其困扰着我。

我是否可以更改布局、Java 相关环境变量或 IDEA 配置中的某些内容来解决此问题?

Owe*_*wen 6

好的,我找到了解决方案。这不是很理想,但它确实获得了所需的行为。

首先,我使用以下命令转储了键盘配置的完整状态

$ xkbcomp $DISPLAY - > now.xkb
Run Code Online (Sandbox Code Playgroud)

然后我找到了线条

interpret Overlay1_Enable+AnyOfOrNone(all) {
    action= LockControls(controls=Overlay1);
};
Run Code Online (Sandbox Code Playgroud)

并将其更改为

interpret Overlay1_Enable+AnyOfOrNone(all) {
    action= SetControls(controls=Overlay1);
};
Run Code Online (Sandbox Code Playgroud)

这可以防止修饰符“粘滞”,即它仅在您按住键时适用。

然后我拿了曾经是我的 ISO_Level5_Shift 的钥匙:

key  <TAB> {
    type= "ONE_LEVEL",
    symbols[Group1]= [ ISO_Level5_Shift ]
};
Run Code Online (Sandbox Code Playgroud)

并将其更改为 Overlay1_Enable:

key  <TAB> {
    type= "ONE_LEVEL",
    symbols[Group1]= [ Overlay1_Enable ]
};
Run Code Online (Sandbox Code Playgroud)

然后对于我希望更改生效的每个键,我添加了一个覆盖定义:

key <AD07> {
    type= "EIGHT_LEVEL",
    overlay1= <PGUP>,
    symbols[Group1]= [               g,               G,        asterisk,               G,           Prior,               G,     Greek_gamma,     Greek_GAMMA ]
};
Run Code Online (Sandbox Code Playgroud)

然后重新应用整个事情

$ xkbcomp now.xkb $DISPLAY
Run Code Online (Sandbox Code Playgroud)

有用的文档: