对于上下文,我试图追踪我在 Wayland 上使用 GNOME 在 Fedora 39 上遇到的 Compose 键处理中的错误,讨论了这里和这里。然而,我的问题更为笼统。我试图了解 Linux 桌面上键盘输入的宏伟方案中所有的小部分是如何组合在一起的。
我听说过这些作品:
- Linux 内核
- 埃夫德夫
- (lib)xkbcommon
- 总线
- 韦兰
- GUI工具包:GTK、Qt
- 桌面环境:GNOME、KDE(及其配置机制,如 gsettings)
- 传统X11
我有点不知道哪个做什么。
这就是我的思考我明白,这可能是非常错误的——在这种情况下我想知道该怎么做。
- Linux 内核从键盘获取物理按键信号(通过 udev??)并将其转换为“按键代码”,
- evdev 是一个库层,它使来自内核的原始信息更容易检索(从它的文档,“libevdev 本质上是 /dev/input/eventX 设备的类固醇读取(2)”)
- libxkbcommon 是一个理解键盘描述的库,键盘描述是从“键代码”到“键符号”的美化映射。
- Wayland 协议(具体来说wl_键盘)提供带有键码的输入键盘事件,并且还提供了以 libxkbcommon 格式获取键盘描述的方法。
- X11 做了类似的事情,“xkbcommon”这个名字源于 xkbcommon 作为 X11 的一部分的历史,尽管它现在更通用,
- 桌面环境(在我的例子中:GNOME)使键盘布局可以通过其配置 GUI 进行配置。为了使布局生效,他们将其作为
wl_keyboard::keymap
Wayland 合成器(对于 GNOME 来说是 Mutter)的输出。 - GUI 工具包(如 GTK)从 Wayland 协议获取按键代码和键盘描述,使用 libxkbcommon 将其转换为按键符号……然后以某种方式(如何?)按键符号变成 Unicode 字符。
我不明白 IBus 在这张图中的位置。它是干什么用的?它与 libxkbcommon 有什么不同?它是否做了一些不同的事情,或者与之竞争?堆栈的哪些部分使用它?桌面环境?它的合成器具体是什么? GUI 工具包?
我也不明白~/.XCompose
文件在哪里读取。实际上,我什至不明白可能的关键符号列表是在哪里定义的。