Gnome 无法识别带有 Level_3 键符号的快捷键

Gnome 无法识别带有 Level_3 键符号的快捷键

我使用以下方式修改了键盘布局xkb

  1. CapsLock 键已被重新分配为 Control_L。
replace key <CAPS> { [ Control_L ] };
modifier_map Control { <CAPS> };
  1. 左控制键 (<LCTL>) 已被重新分配为 3 级修饰符 (ISO_Level3_Shift)。
replace key <LCTL> {
  type[Group1] = "ONE_LEVEL",
  symbols[Group1] = [ ISO_Level3_Shift ]
};
include "level3(modifier_mapping)"
  1. 数字 2 键 (<AE02>) 的 3 级已分配给符号 F2。
key <AE02> {[2, at, F2]};

问题:

按下LCtrl+2键盘上的 时,xev显示F2正在注册该键符号。此外,Alt+F2已分配在 gnome 的键盘快捷键设置中打开迷你命令提示符。当我按下F2键盘上的实际键时,此快捷键有效。但它确实不是与之合作Alt+LCtrl+2,这是应该的。

我可以说 gnome 快捷方式确实部分识别了这些 xkb 更改,因为它CapsLock+Alt+t会打开终端。目前似乎只有具有 3 级修饰符的快捷方式有问题。

另一个例子:

;我已为PgDown(或)分配了 3 级符号Next

Super+PgDown应该移动到下一个桌面。当按下键盘上的 PgDown 键时,此功能有效,但无法与 配合使用Super+LCtrl+;。(xev确实显示LCtrl+;已注册为 PageDown)

答案1

测试后编辑

经过一番思考和测试,我意识到前两个步骤在这里不是必需的。它们只需要重新映射按键的功能,如拱门维基。这里仅使用进行actions重新映射就足够了。

...
    key <AE02> { symbols[Group1]= [               2,               NoSymbol,                                               FK02  ],
                 actions[Group1]= [      NoAction(),             NoAction(),   RedirectKey(keycode=<FK02>, clearmods=levelThree) ]
    };
...
    include "level3(ralt_switch)"

原始答案

适应这一点arch wiki 部分但使用Right Alt大写锁定似乎有效。

我需要修改3个文件:

    1. 包括以下内容/usr/share/X11/xkb/compat/complete(或者将您的修改写入新文件中并使用include "custom_file"可能是更好的主意。为了简单起见,我在同一个文件中进行了此操作)
default xkb_types "complete" {
    include "basic"
    include "mousekeys"
    include "pc"
    include "iso9995"
    include "level5"
    include "extra"
    include "numpad"

    type "CUST_ALT" {
        modifiers = Shift+LevelThree;
        map[None] = Level1;
        map[Shift] = Level2;
        map[LevelThree] = Level3;
        map[Shift+LevelThree] = Level3;
        level_name[Level1] = "Base";
        level_name[Level2] = "Shift";
        level_name[Level3] = "Level3";
   };


};
    1. 包括以下内容/usr/share/X11/xkb/compat/complete
default xkb_compatibility "complete" {
    include "basic"
    augment "iso9995"
    augment "mousekeys"
    augment "accessx(full)"
    augment "misc"
    augment "xfree86"
    augment "level5"
    augment "caps(caps_lock)"

   interpret ISO_Level3_Shift+Any {
        useModMapMods= level1;
        virtualModifier= LevelThree;
        action= SetMods(modifiers=LevelThree);
    };


};
    1. 最后将你的重新映射包含在你的符号文件中
...
...
    key <AE02> {
       type= "CUST_ALT",
       symbols[Group1]= [               2,               NoSymbol,               FK02  ],
       actions[Group1]= [      NoAction(),      NoAction(),   RedirectKey(keycode=<FK02>, clearmods=levelThree) ]
    };
...
...
    include "level3(ralt_switch)"
...
  • 注意:NoSymbol表示“不覆盖此键盘映射”,不同于 VoidSymbol 会用“VoidSymbol”覆盖键盘映射
  • 注意2:确保include "level3(ralt_switch)"还包含在您的符号文件中,以将 RightAlt 映射为第三级修饰符!

答案2

(编辑、修正、简化)

解释: 当使用修饰符在 xkb 中模拟某个键时 ISO_Level3_Shift,它将设置一个真正的修饰符位( ,如默认 xkb 配置文件中设置的那样)。为了让 Gnome 键盘快捷键识别这样的模拟键,需要手动清除额外的修饰符位,如的答案Mod5中所示 ,使用操作。@avilaclearModsRedirectKey

解决方案: 按照@avila编辑的答案,修改key <AE02> 部分如下(OP 的其余配置保持不变):

key <AE02> {
    type    =   "THREE_LEVEL",
    symbols =   [ NoSymbol, NoSymbol, NoSymbol ],
    actions =   [ NoAction(), NoAction(),
                    RedirectKey(
                        keycode = <FK02>,
                        clearmods = LevelThree
                    )
                ]
};

相关内容