libei 在 XDG RemoteDesktop 和 InputCapture 门户中的集成
摘要
libei(用于模拟输入的库)的最新进展:现已集成到 XDG Remote Desktop 和 Input Capture 门户中,为 Wayland 合成器和客户端提供标准化的输入传输。
<p><a href="https://lobste.rs/s/egdij3/libei_integrations_xdg_remotedesktop">评论</a></p>
查看缓存全文
缓存时间: 2026/07/22 10:20
# XDG RemoteDesktop 和 InputCapture 门户中的 libei 集成
来源:http://who-t.blogspot.com/2026/07/libei-integrations-in-xdg-remotedesktop.html
原来我谈论鸡蛋已经好几年了,所以让我们改变一下。libei 当然是用于模拟输入(Emulated Input)的库(https://who-t.blogspot.com/2020/08/libei-library-to-support-emulated-input.html)\[1\]。
这篇文章主要是个复习,因为太久没提了,同时简要总结一下我们目前完成的一些工作,为接下来几篇即将发布的文章做准备。
libei 是一个用于**逻辑**输入事件的传输层,而 libinput 是一个硬件抽象层。在 libinput 的情况下,设备的固件/内核传递的事件在某种程度的合理性范围内,libinput 尝试理解这些事件,然后将其转换为逻辑事件,供下一层(通常是 Wayland 合成器或 Xorg)消费。例如,这就是如何将“触摸按下位置 x1/y1,触摸抬起位置 x1/y2”转换为一个按钮点击事件(如果启用了触摸板点击)。或者,如果我们发现这是一次意外的掌触,则可能转换为无操作。
libei 纯粹在逻辑层面工作——作为 libei 客户端,你将逻辑事件传递给 EIS(模拟输入服务器)实现(通常是合成器)。没有猜测,你说按钮点击,EIS 就收到按钮点击。libei 支持“发送者”和“接收者”模式,取决于事件是发送给 EIS 实现(输入模拟)还是从 EIS 实现接收(输入捕获)。libei 是为 Wayland 栈设计的,但客户端或 EIS 实现都不要求使用 Wayland。
libei 设计的核心是 EIS 实现几乎控制一切,它决定哪些设备可供客户端使用,这些设备何时可以发送事件等等。就像合成器在物理设备方面负责一样——如果合成器决定某个物理设备不存在,Wayland 客户端就无法从中获取事件。
自最初提案(再次,\[1\]!)以来,我们一直像蜜蜂一样忙碌,现在 libei 已成为 XDG Remote Desktop 门户和 XDG Input Capture 的一部分(两者均从版本 1.17 开始,2023 年中期)。在这两种情况下,门户用于协商和初始协议,确定应该做什么,然后 libei 用作两个进程之间的传输层 \[2\]。
最近,我们还增加了会话持久性支持,这样你就不必在每次连接时都允许访问。实现这一功能的大部分工作由 Jonas Ådahl 完成,现在已包含在自 1.21.0 版本以来的门户中,并应出现在当前或下一版本的主要合成器中。
## 管道铺设
将所有这一切落实到位,需要在栈的多个部分进行大量工作。这并不令人兴奋,就像铺设管道并不特别令人兴奋一样,但就像常规管道一样:一旦安装到位,你就可以改变你的饮食习惯,而不会再次严重影响所有人。现在试着把那个比喻从脑海中赶出去。不客气。
对于 libei 来说,这意味着三件事:
- 如果你有一个使用 XDG 门户发送/接收事件的客户端,现在它们可以与任何实现该门户的合成器一起工作。无需 GNOME/KDE/... 特定的 API。
- 如果你有一个实现 EIS 的合成器,你就拥有了所有基础设施,可以在需要时与来自其他地方的 libei 客户端通信。这些用例尚未完全确定范围(辅助技术、虚拟键盘、触摸板等?),但管道已经就绪,可以(被滥用)使用。
- 由于实际的事件来回不影响中间的层,我们现在可以向 libei 添加新事件,而无需再次更改其他所有内容。
让我们看看这在实践中如何工作。
## XWayland XTEST 使用案例
我们现在可以利用管道的一个例子是 Xwayland 对 XTEST 的支持。XTEST 是每个人在 X 下用来模拟输入的协议,但在 Wayland 中,它没有与任何东西连接,因此这些 API 根本无法工作。
但我们在 Xwayland 中可以做的,是将 XTEST 转换为 libei 事件,并促进门户交互。这意味着我们的栈大致如下:
```
+--------------------+ +------------------+
| Wayland compositor |---wayland---| Wayland client B |
+--------------------+\ +------------------+
| libinput | EIS | \_wayland______
+----------+---------+ \
| | +-------+------------------+
/dev/input/ +-----------| libei | XWayland |
+-------+------------------+
|
| XTEST
|
+-----------+
| X client |
+-----------+
```
如果该 X 客户端使用 XTEST 尝试模拟设备,Xwayland 将请求 Remote Desktop 门户的权限并设置会话,然后将 XTEST 事件作为 libei 事件传递,瞧——你的 20 年历史的 X 客户端可以通过 XDG Portal 发送指针和键盘事件,而无需知晓(并且用户可以禁止此操作,甚至获得一些关于谁在发送事件的信息,这在普通 XTEST 中是完全不可能的)。自 Xwayland 23.2.0 以来,这一功能已得到支持。合成器无需额外支持。
## 下一步
因此,我们已经有了很多管道就位,或者换个比喻:我们有了锤子,让我们开始寻找钉子。而现在我们能看到的钉子包括发送文本、手势和平板支持。这些将是接下来几篇文章的主题。
\[1\]:6 年前?!哇…… \[2\]:在 Remote Desktop 的情况下,它取代了 DBus 模拟 API,后者是一个牛顿摆,每次事件至少会唤醒 4 个进程。
相似文章
多用户 Wayland 现状
对 Linux Wayland 合成器和库中多座位(多个鼠标/键盘)支持的深入调查,并提供了已发布的工具和补丁以改善多用户计算。
XLibre XServer 25.2 发布
社区管理的 X Window System 显示服务器 XLibre XServer 25.2 已发布,默认启用 TearFree 模式设置,支持 Nvidia 驱动程序,并通过 seatd 进行席位管理。
Xwayland 26.1.0 发布候选版1
Olivier Fourdan 宣布了 Xwayland 26.1.0 的首个发布候选版,包括更改如 EGLStream 移除、rootful 模式的剪贴板桥接、多座位支持以及各种错误修复,并请求进行测试。
在Wayland上追求永恒的停靠 - lambdock (C + GTK4 + Lisp GNU Guile Scheme)
lambdock是一款原生支持Wayland的、可修改的桌面停靠应用,使用C、GTK4和GNU Guile Scheme构建,具有流畅的物理动画和运行时REPL控制。
我的无障碍技术栈与 Wayland 上的未来
一篇个人记述,讲述 Linux 桌面即将全面转向 Wayland 的未来将如何破坏依赖 Talon Voice 等输入工具的无障碍用户体验,并指出输入无障碍相较于输出无障碍受到的关注严重不足。