在上一篇文章 干得漂亮,Ubuntu 终于干掉了 X11 写到 Linux 界一哥终于下定决心彻底移除多年来统治 Linux 桌面的 X 系统。但 Wayland 彻底取代 X 系统,不仅仅是操作系统和硬件厂商的事情,应用软件也得跟上。当然如果是使用 Qt、GTK 等 GUI 框架应用,没有直接使用 X11 API,就可以自动适应,不需要修改应用程序。但是在应用开发过程中,不可避免的会使用 X11 API。比如我之前开发的 AiOffice 应用,为了处理按键消息,就跳过了 Qt,直接使用 X11 的按键处理 API。此外,还有些应用,并不会使用 Qt、GTK 之类的重量级框架,比如 Wine,为了高效模拟 Windows API,就直接使用了 X11 的 API。像这类应用,就需要专门针对 Wayland 做适配。
在搜索 Wayland 开发资料,特别是 Wayland 客户端应用开发资料时,发现资料太少了。当然 X 系统的开发资料一样少,可以看出 Linux 在桌面端的地位,很是尴尬。在搜遍全网之后,发现有两个教程还算不错:
前面的教程托管在 gitbook 上,但很可惜的是,部分章节无法访问。这个问题原作者还在网上吐槽过,估计作者也没有保存原稿。同时太过冷门,网上都没有找到搬运的。
第二本是一本参考手册,内容比较全面,作为手册很不错,但是作为开发教程,不是那么友好。
Writing Wayland clients 这份教程结构清晰,通俗易懂,有实例辅助,比较适合作为开发入门资料。虽然现在有 AI,这种入门的 Demo 交给 AI 就可以完成得很好。但是要处理比较复杂的问题,比如 Wine 中的 Wayland 移植,不对 Wayland 有深入的理解,就很难去解决窗口显示、输入法等深层次问题。这部分工作交给 AI 去完成,目前还没有达到所需的智能程度,所以从基础开始入门,逐步深入 Wayland 协议是非常有必要的。
这里以 Writing Wayland clients 这份教程为基础,通过翻译大部分章节,补充缺失的章节,根据最新 Wayland 协议添加一些实例,希望给大家呈现一个比较完整的 Wayland 客户端开发教程。
本指南是对 Wayland 协议的入门介绍。
在学习本指南的过程中,你将了解 Wayland 的基础知识,并创建几个客户端:从最简单的客户端(一个黑色方块),到一个玩具级的工具包库,它将处理许多高级功能,比如更换光标、处理鼠标点击以及渲染客户端窗口装饰。等我自己理清 EGL 后,我们还会进一步探索它。
Wayland 是一种用于在屏幕上显示图形的现代协议。它的设计目的是弥补前任 X11 的不足。例如,它速度更快、安全性更高,并且支持完善的触控、HiDPI 和多显示器。
你可以在维基百科的相关文章以及官方网站上阅读更多关于 Wayland 的内容。
在开始编写 Wayland 客户端之前,你可能会想:我是否必须深入了解 Wayland 协议?
答案是:不一定。
你完全可以在不了解 Wayland 内部细节的情况下开始编写客户端程序。Wayland 提供的 wayland-client 库封装了大部分底层细节,使你可以专注于创建窗口、处理输入和渲染图形,而不必立即理解协议的每一个部分。
当然,如果你希望开发更复杂的客户端,或者想深入优化性能,那么理解 Wayland 的工作原理会非常有帮助。例如,了解 Wayland 的事件循环、缓冲区管理以及与显示服务器的通信方式,会让你在处理输入、渲染和同步时更加高效。
总的来说:
wayland-client 编写简单客户端。在你开始阅读本指南之前,有必要明确一点:本指南并不是一本全面的 Wayland 客户端开发参考手册。
具体来说,本指南不包含以下内容:
wayland-client 库开发客户端,而不是 GTK、Qt 或其他高级 GUI 工具包。本指南主要面向以下读者群体:
注意:
本指南的内容设计为循序渐进,你可以根据自己的需求选择阅读方式:
作者感谢以下人士和资源对本教程的帮助:
作者表示,这本指南虽然尽力覆盖实际开发中常见的场景,但仍可能存在错误和不完善的地方。欢迎读者反馈问题,共同完善内容。