文章摘要
我研究了Linux和Wayland系统下多鼠标多光标支持的现状,发现结果令人惊喜。我发布了一些工具和补丁库来改进多席位支持,但许多功能仍不完整,希望找到对此感兴趣的人一起探索。
文章总结
好的,这是根据您的要求,对原文主要内容进行的中文重述,保留了关键细节,并删减了与主题无关的内容(如个人致谢、Recurse Center介绍等)。
标题:Wayland 多席位(多人协作)现状
核心发现: 作者对在 Linux 和 Wayland 系统上实现“多人共用一台电脑”的想法进行了为期三周的深入调研。调研结果令人惊喜:Wayland 核心协议对多席位(多鼠标、多键盘)有极佳的内置支持,但整个生态系统的支持程度参差不齐。
为什么需要这个功能? * 结对编程: 一人调试,另一人查阅文档。 * 多人游戏: 就像支持多个手柄一样,支持多个鼠标。 * 自然协作: 允许多人直接在同一个应用内协作,无需复杂的同步算法。
各软件支持情况概览:
* 核心 wayland 协议: 5星。深度集成,每个输入事件都关联到特定的“席位”(seat)。
* Weston 合成器: 3星。支持多光标和独立窗口焦点,但动态配置席位较麻烦。
* sway 合成器: 4星。支持良好,包括独立窗口焦点。但存在一个已知问题:无法将设备从一个席位中分离(只能添加)。
* niri 合成器: 1星。尚无官方支持,但有社区请求和作者的实验性分支。
* River 合成器: 4星。支持良好,有专门的协议管理席位,但缺少对 ext-transient-seat-v1 协议的支持。
* GTK 图形库: 4星。概念上支持良好,事件可区分来源席位。但存在一个bug:程序运行时新接入的席位不会被识别。
* SDL 图形库: 3星。从 v3.3.4 开始支持,事件可区分来源席位。但存在一个限制:在默认的绝对鼠标模式下,席位信息会丢失,需要启用相对模式或打补丁。
* wayvnc (VNC 服务器): 5星。完美支持 ext-transient-seat-v1 协议,可为每个远程连接创建独立的虚拟席位。
关键术语澄清: * 逻辑席位: 本文核心。指多人在同一台电脑前,各自使用自己的鼠标键盘,但共同操作同一个桌面环境(例如,桌面上有多个鼠标光标)。 * 物理席位: 指多人各自拥有独立的屏幕、键盘、鼠标,共用一台主机但互不干扰。这不是本文讨论的重点。
各层级的支持现状:
- Wayland 协议: 核心协议已深度集成多席位支持,每个输入事件都关联到特定的
wl_seat。 - Wayland 合成器:
- Weston: 支持多光标和独立窗口焦点,但配置席位需通过复杂的 udev 规则。
- sway: 支持良好,可通过
swaymsg命令动态分配设备到席位。作者提供了一个补丁来解决设备无法从席位分离的问题,并开发了一个 TUI 工具来快速配置。 - River: 支持良好,有专门的协议管理席位。作者开发了一个 Rust 工具来动态分配设备。
- niri: 作者提供了一个实验性分支,但功能有限,仅支持两个席位且设备名硬编码。
- 图形库:
- GTK: 事件可区分席位,但大多数标准控件(如文本输入框)不响应多席位输入。作者开发了一个实验性的多席位文本控件。
- SDL: 事件可区分席位,但绝对鼠标模式下席位信息丢失,需要打补丁。作者提供了补丁方法。
- LÖVE 游戏引擎: 基于 SDL,作者制作了补丁版本,将席位信息传递到 Lua 脚本中,并开发了一个多人物理沙盒游戏作为示例。
- 应用程序:
- 目前几乎没有现成的终端用户应用支持多席位。
- 终端模拟器: Kitty 只响应第一个席位的输入;Alacritty 接受所有席位的输入。
- 浏览器: Firefox 只响应程序启动时已存在的席位;Chromium 完全不响应额外席位的输入。
- 远程协作(VNC 设置):
- 使用
wayvnc的--transient-seat和--render-cursor参数,可以为每个远程连接创建独立的虚拟席位。 - 结合
novnc和自签名证书,可以搭建一个基于浏览器的远程协作环境,让远程用户获得独立的鼠标和键盘。
- 使用
总结与展望:
* sway 合成器配合 wayvnc 是目前实现多人协作最成熟的方案。
* 当前最大的机会在于开发支持多席位的应用程序,例如使用 LÖVE 引擎开发多人游戏。
* 文中用 📝 标记了多个待解决的开放问题,例如:修复 GTK 无法识别新席位的问题、为 River 添加 ext-transient-seat-v1 支持、编写一个原生支持多席位的窗口管理器等。
评论总结
根据评论内容,总结如下:
主要观点与论据:
支持多用户/多指针的潜力(评分:无,但多数评论持积极态度)
- 评论1认为这是“酷想法”,Wayland协议开发者早有考虑("I've always thought this was a cool idea. It's obviously been on the minds of Wayland protocol developers since the beginning")。
- 评论3指出原标题“多玩家Wayland”更准确,强调涉及键盘等多设备协作("the author is very explicit about that: 'I think there could be a term that’s describing this concept even better – in the title of this post, I picked “multi-player”'")。
技术挑战与现有假设的冲突(评分:无,但多位评论者指出问题)
- 评论2指出多指针会破坏GUI工具包的焦点假设,如
gtk_application_get_active_window和QApplication::activeWindow("This also breaks assumptions GUI toolkit and applications make about only one of their windows being focused at a time")。 - 评论9强调焦点控制是难点,需要“每个座位独立的焦点版本”("Focus of controls is the hard part. You end up needing a Per-seat version of focus in an application")。
- 评论6提到构建合成器时支持多座位“比想象中更复杂”("It's actually a lot more work than you'd think to support this")。
- 评论2指出多指针会破坏GUI工具包的焦点假设,如
实际应用场景(评分:无,但评论者列举多种用例)
- 评论4、13提到触摸屏、绘图板等设备需要独立光标("laptops may have touchscreens... X.org can't really handle such cases cleanly";"You don't necessarily want a touch/drawing tablet input to move your actual 'main' mouse cursor")。
- 评论5提出混合现实/VR显示中同时使用鼠标和眼动追踪("mixed reality/VR displays, for simultaneous mouse cursor + eye tracking/control")。
- 评论19、20提到多人游戏(如《工人物语II》分屏模式)和双光标协作("two cursors and two keyboards... for multiplayer games on the same computer")。
扩展讨论:物理座位与远程会话(评分:无,评论7详细阐述)
- 评论7深入探讨了Linux中“快速用户切换”的局限性,指出当前系统无法在物理和远程会话间无缝切换("you can't just remove the seat from a running logind session and then make it remote")。作者尝试通过创建新会话实现,但面临
$XDG_SESSION_ID、合成器后端切换等问题("compositors need to be redesigned to handle this")。
- 评论7深入探讨了Linux中“快速用户切换”的局限性,指出当前系统无法在物理和远程会话间无缝切换("you can't just remove the seat from a running logind session and then make it remote")。作者尝试通过创建新会话实现,但面临
平衡性总结: - 支持方:认为多指针/多用户是创新方向,能解决触摸屏、VR、多人协作等实际需求,且Wayland协议已为此预留可能性。 - 质疑方:指出实现复杂,会破坏现有GUI工具包和应用的焦点假设,且合成器、会话管理等底层支持不足。 - 中立/扩展:部分评论者提出更广泛的应用场景(如远程会话、物理座位切换),并强调需要重新设计系统架构。