base 和 evdev xkb 规则有什么区别?

Jan*_*nar 6 xorg xkb libinput

我刚刚从 xf86-input-evdev 切换到 xf86-input-libinput,它破坏了我的键盘布局——带有右 alt 的箭头键、上下文菜单键、删除键、数字键盘输入等,所有这些都奇怪地交换了。libinput debug-events不过,显示了正确的密钥。检查后Xorg.conf,我注意到以下行:

Option "XkbRules" "base"
Run Code Online (Sandbox Code Playgroud)

将其更改为 后evdev,键盘工作正常。

我找到了“ XKB 配置指南”,其中提到了各种规则,但没有详细说明它们的区别。

这两种布局有什么区别?即使使用 libinput 也可以使用 evdev 规则吗?

qui*_*tic 6

tl;dr:在 Linux 上,您应该使用evdev规则。正如 XKB 指南中所说,您链接:

在 Linux 系统上,evdev规则最常用,在其他系统上使用基本规则。


这种差异主要是历史性的。 evdev是现代 Linux 内核输入子系统,在首次编写 XKB 时不存在。如果您查看xkeyboard-config的源代码,您会发现evdevbase规则都是从(大部分)相同的模板生成的。但是,将系统 XKB 数据库中生成的文件与diff. 您会看到许多条目,其中base规则加载inet特定键盘模型的符号,而evdev规则取消了大多数特定于模型的条目并加载了更通用的集合:

/usr/share/X11/xkb/rules/base:
[...]
! model         =       symbols
  a4techKB21    =       +inet(media_nav_common)
  asus_laptop   =       +inet(media_common)
  acer_tm_800   =       +inet(acer_laptop)
  benqx730      =       +inet(benqx)
  btc9116u      =       +inet(btc9019u)
  chromebook    =       +inet(chromebook)
  dellsk8125    =       +inet(dell)
// and about 50 more lines
// generated from xkeyboard-config/rules/base.m_s.part

/usr/share/X11/xkb/rules/evdev
[...]
! model         =       symbols
  $evdevkbds    =   +inet(evdev)+inet(%m)
  chromebook    =   +inet(evdev)+inet(chromebook)
  applealu_jis  =   +inet(evdev)+macintosh_vndr/jp(alujiskeys)
  *             =   +inet(evdev)
// ...that's all.
// generated from xkeyboard-config/rules/evdev.m_s.part
Run Code Online (Sandbox Code Playgroud)

不是真的,这是规则中的整个模型到符号部分evdev,而该base版本有 60 多行长。该evdev.m_s.part文件是该部分规则的源模板;这是一个模型到符号的映射(该!model = symbol部分开头的行;因此m_s在文件名中)。规则的唯一其他特定于 evdev 的部分来自evdev.m_k.part文件,它是模型到键码的映射(!model = keycodes规则部分),它们之间的差异是相似的。

有关更多详细信息,请查阅这些规则(尤其是和)引用的符号文件。您可能对XKB 规则格式的这篇文章感兴趣。/usr/share/X11/xkb/keycodes/evdev/usr/share/X11/xkb/symbols/inet