重新映射 XKB 的密钥

Bob*_*obi 4 keyboard xkb

我正在尝试重新映射 Scroll Lock 键,以便它生成任何 Windows 键的键码。

首先,我转储当前的键盘映射:

xkbcomp $DISPLAY original-dump

然后找到我感兴趣的按键的键码:

cat original-dump | grep SCLK
 <SCLK> = 78;

 cat original-dump | grep LWIN
 <LWIN> = 133;
Run Code Online (Sandbox Code Playgroud)

现在我将组件名称打印到文件中:

setxkbmap -print > original-components
Run Code Online (Sandbox Code Playgroud)

编辑文件以添加我的密钥代码修改:

    xkb_keymap {
    xkb_keycodes  { 
        include "evdev+aliases(qwerty)" 
        // Remap Scroll-lock to the keycode of LWIN(133)
        <SCLK> = 133;
    };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+inet(evdev)" };
    xkb_geometry  { include "pc(pc105)" };
    };
Run Code Online (Sandbox Code Playgroud)

将上面的文件保存为modified-components并运行:

xkbcomp modified-components $DISPLAY
Run Code Online (Sandbox Code Playgroud)

再次转储:

xkbcomp $DISPLAY original-dump
Run Code Online (Sandbox Code Playgroud)

检查键码:

cat another-dump | grep SCLK
<SCLK> = 133;
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,但是当我运行时xev,Scroll Lock 键的键码仍然是78

如果我运行:

xmodmap -e "keycode 78 = Super_L"
Run Code Online (Sandbox Code Playgroud)

xev仍然显示78,但至少是我在 XFCE 中为 LWIN 和 RWIN 工作创建的快捷方式。

我想知道我对xkb做错了什么。谢谢。

Bob*_*obi 7

尝试了以下新方法(成功)

sclkfile在该目录下新建一个文件/usr/share/X11/xkb/symbols/,并添加以下内容:

 // Make the Scroll Lock key a left Super.
xkb_symbols "sclk_super" {
    replace key <SCLK> { [ Super_L ] };
    modifier_map  Mod4 { <SCLK> };
};
Run Code Online (Sandbox Code Playgroud)

添加了新规则/usr/share/X11/xkb/rules/evdev

sclkoption:sclk_super = +sclkfile(sclk_super)
Run Code Online (Sandbox Code Playgroud)

以及规则的描述/usr/share/X11/xkb/rules/evdev.lst

! option
sclkoption           Scroll Lock behaviour
sclkoption:sclk_super Scroll Lock is Super
Run Code Online (Sandbox Code Playgroud)

这里也/usr/share/X11/xkb/rules/evdev.xml

<configItem>
        <name>sclkoption</name>
        <description>Scroll Lock behaviour</description>
</configItem>    
<option>
    <configItem>
        <name>sclkoption:sclk_super</name>
        <description>Scroll Lock is Super</description>
    </configItem>
</option>
Run Code Online (Sandbox Code Playgroud)

最后运行:

$ setxkbmap -option sclkoption:sclk_super
Run Code Online (Sandbox Code Playgroud)

没有错误,当我打印布局的组件时:

$ setxkbmap -print
xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "pc+us+inet(evdev)+sclkfile(sclk_super)"     };
        xkb_geometry  { include "pc(pc105)"     };
};
Run Code Online (Sandbox Code Playgroud)

新规则就在那里。

现在,如果我运行xev

keycode 78 (keysym 0xffeb, Super_R)
Run Code Online (Sandbox Code Playgroud)

键码仍然是 78,但键符号是 Super_R。成功