xkb 未加载 microsoft4000 配置

xkb 未加载 microsoft4000 配置

也许我遗漏了一些东西,但 xkb 似乎没有从 /usr/share/X11/xkb/symbols/inet 加载 microsoft4000 部分。

$ setxkbmap -print -verbose 10
Setting verbose level to 10
locale is C
Trying to load rules file ./rules/evdev...
Trying to load rules file /usr/share/X11/xkb/rules/evdev...
Success.
Applied rules from evdev:
rules:      evdev
model:      microsoft4000
layout:     us
options:    caps:escape
Trying to build keymap using the following components:
keycodes:   evdev+aliases(qwerty)
types:      complete
compat:     complete
symbols:    pc+us+inet(evdev)+capslock(escape)
geometry:   microsoft(natural)
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+inet(evdev)+capslock(escape)"    };
    xkb_geometry  { include "microsoft(natural)"    };
};

现在,在 inet 中,有一个来自 microsoft4000 键盘的部分

// Microsoft Natural Ergonomic Keyboard 4000 
partial alphanumeric_keys
xkb_symbols "microsoft4000" {
    include "inet(media_nav_common)"
    key <I192>  {       [ XF86Launch1           ]       };
    key <I193>  {       [ XF86Launch2           ]       };
    key <I194>  {       [ XF86Launch3           ]       };
    key <I195>  {       [ XF86Launch4           ]       };
    key <I196>  {       [ XF86Launch5           ]       };
//  Missing because of lack of support from kbd driver: Zoom in and
//  slider.
};

但它似乎被忽略了。如果我用 xev end press launch keys 1-5 监控按键,我会得到以下结果:

$ xev | awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
192 XF86Launch5
193 XF86Launch6
194 XF86Launch7
195 XF86Launch8
196 XF86Launch9

应该类似于 XF86Launch1-5?这是错误还是我遗漏了什么?

我在 Ubuntu 16.04 上运行。

答案1

真正的问题是,你能用这些钥匙做你想做的事吗?

重启或重新登录后,它们是否始终是相同的键?您可以将它们设置为快捷键(带或不带修饰符)吗?XKB 是否认为该键与以下键一样重要XF86Launch1XF86Launch5不那么重要:

  • 它始终是那么关键吗?
  • 你能告诉软件X执行函数Y按下该键时?(启动媒体播放器、最大化当前窗口或您希望该键执行的任何其他功能)

这是一个错误吗?

  • 也许。它肯定不会加载inet(microsoft4000)符号(这是您引用microsoft4000的部分/usr/share/X11/xkb/symbols/inet)。看起来这可以从模型定义中包含或作为单独的选项,但没有规则(在/usr/share/X11/xkb/rules/evdev*)。更改为microsoft7000模型可能会更接近您的预期。

  • ...但可能不是。这些键的确切定义并不重要——只要它们被定义为可识别的、彼此不同的事物,XKB 就完成了它的工作。为此,您的键似乎工作得很好。我怀疑符号inet(microsoft4000)日期从 2006 年起但后来被更广泛的部分取代inet(evdev)

您之所以看到XF86Launch5等等,是因为该inet(evdev)部分定义了这些键:

    // Evdev Standardized Keycodes
    partial alphanumeric_keys
    xkb_symbols "evdev" {
        ...
        key <FK14>   {      [ XF86Launch5       ]       };
        key <FK15>   {      [ XF86Launch6       ]       };
        key <FK16>   {      [ XF86Launch7       ]       };
        key <FK17>   {      [ XF86Launch8       ]       };
        key <FK18>   {      [ XF86Launch9       ]       };
    };

...并/usr/share/X11/xkb/keycodes/evdev确认它们被翻译为键码192-196

    default xkb_keycodes "evdev" {
        ...
        <FK14> = 192;
        <FK15> = 193;
        <FK16> = 194;
        <FK17> = 195;
        <FK18> = 196;
        ...

无论如何,我们还是加载它吧!

首先,告诉 GNOME 设置不要动键盘:

gsettings set org.gnome.settings-daemon.plugins.keyboard active false
# change false to true to reenable

然后运行此测试:

setxkbmap -print | 
  sed -e '/xkb_symbols/s/"[[:space:]]/+inet(microsoft4000)&/' | 
  xkbcomp - $DISPLAY

该管道转储您的setxkbmap -print输出,并将定义sed添加inet(microsoft4000)到符号行中:

    xkb_symbols   { include "pc+us+inet(evdev)+capslock(escape)+inet(microsoft4000)"    };

...然后将其通过管道传输xkbcomp到 Xserver 进行编译和安装。现在xev应该向您显示XF86Launch1-5密钥。

如果可行,您可以通过几种方式使其成为永久性的改变。

  • 您可以保留gsettings禁用状态,并将setxkbmap ... | sed ... | xkbcomp ...管道添加到将在登录时运行的脚本中$HOME/.xprofile。(或者,将 sed 输出重定向到$HOME/.config/my-xkb-map,您只需要xkbcomp在登录时使用该命令。)

  • 您可以编辑/usr/share/X11/xkb/rules/evdev*以将符号文件添加为官方选项。 evdev是选项到文件的转换;evdev.lst列出每个选项的描述;evdev.xml是描述的 XML 版本。我相信您需要正确输入evdev.xmlGUI 工具才能显示新选项,但只evdev.lst需要setxkbmap理解它。但是,这些系统文件的更改可能会被未来的更新覆盖,因此请制作备份或sed脚本或patch文件以在必要时将它们重新添加。


XKB 很棒!让我们让这些键做些完全不同的事情!

哇哦,牛仔。你当然可以创建您自己的定制如果需要的话。将该inet(microsoft4000)符号子句复制到另一个文件并按您喜欢的方式定义这些键 。F13?? XF86AudioMicMute

请参阅超级用户答案末尾的资源以获取更多 XKB 兔子洞。

相关内容