1.Wayland介绍

2023-11-28  本文已影响0人  夕月风

Wayland是Unix类系统的下一代显示服务器,由可敬的Xorg-Server的校友设计和建造,是将您的应用程序窗口放到用户屏幕上的最佳方式。过去使用过X11的读者将会对Wayland的改进感到惊喜,而那些在Unix上进行图形处理的新手将会发现它是一个构建图形应用程序和桌面的灵活且强大的系统。

这本书将帮助您对Wayland的概念、设计和实现有一个坚实的基础,并为您提供构建自己的Wayland客户端和服务端应用程序的工具。在您的阅读过程中,我们将建立一个对Wayland的心理模型,并建立其设计的理由。在书中的这些页面中,当您清楚地了解Wayland的直观设计选择时,您应该会发现许多“啊哈!”的时刻,这应该会帮助您继续阅读。欢迎来到开源图形的未来!

注意:这是一个草稿。第1-10章或多或少已经完成了,但可能会稍后更新。第11章及以后的部分大部分还有待编写。

待办事项:

关于本书

本作品采用知识共享署名-相同方式共享4.0国际许可协议进行许可。源代码可在此处获取。

https://creativecommons.org/licenses/by-sa/4.0/

关于作者

用Drew亲密合作者Preston Carpenter的话说:Drew DeVault通过构建sway进入了Wayland世界,这是流行的平铺窗口管理器i3的克隆。 如今,无论从任何方面衡量,它都是最受欢迎的平铺Wayland合成器:用户、提交次数、影响力。 在取得成功之后,Drew通过启动wlroots回报了Wayland社区:它是构建Wayland合成器的开放的、可组合的模块。 如今,它是数十个独立合成器的基础,Drew是Wayland最重要的专家之一。

1.1 高层设计

您的计算机具有输入和输出设备,它们各自负责从您接收信息并向您显示信息。 这些输入设备的形式如下:

您的输出设备通常采用显示器形式,不管是在桌面、笔记本电脑或移动设备上。 这些资源在您的所有应用程序之间共享,Wayland合成器的作用是将输入事件分派到适当的Wayland客户端,并在您的输出设备上适当的位置显示它们的窗口。 将您的所有应用程序窗口组合起来以便在输出设备上显示的过程称为合成 - 因此,我们将其称为合成器。

实操

桌面生态系统中有很多不同的软件组件。 有像Mesa这样的渲染工具(及其每个驱动程序),Linux KMS / DRM子系统,使用GBM进行缓冲区分配,用户空间的libdrm库,libinput和evdev等等。 不要担心-对于理解Wayland来说,大多数这些系统的专业知识都不是必需的,而且在任何情况下都超出了本书的范围。 事实上,Wayland协议非常保守和抽象,基于Wayland的桌面可以轻松构建和运行大多数应用程序,而不涉及任何这些软件。 话虽如此,对这些组件以及它们如何工作有一个表面的理解是有用的。 让我们从底层开始并逐步向上。

硬件

一台典型的计算机配备了一些重要的硬件。在箱子外面,我们有你的显示器、键盘、鼠标,也许还有一些扬声器和一个可爱的USB杯加热器。箱子里面有几个组件用于与这些设备接口。例如,你的键盘和鼠标可能插入USB端口,你的系统为此配备了专门的USB控制器。你的显示器插入到你的GPU。

这些系统有自己的工作和状态。例如,你的GPU以存储像素缓冲区的内存的形式存在状态,以及将这些缓冲区扫描到你的显示器等工作。你的GPU还提供了一个处理器,该处理器经过专门调整,非常擅长高度并行的工作(例如为1080p显示器上的2,073,600个像素计算正确的颜色),但在其他方面则表现不佳。USB控制器的任务是实现传奇般干燥的USB规范,以便从你的键盘接收输入事件,或者指示你的杯架温度经过仔细选择,以避免同时起诉和用冷咖啡让你感到沮丧。

在这个层面上,你的硬件对在你的系统上运行的应用程序几乎没有概念。硬件提供了一个接口,可以通过该接口命令它执行工作,并按照指示进行操作-无论谁告诉它这样做。因此,只允许一个组件与它通信。

内核

这一责任落到内核身上。 内核是一个复杂的野兽,因此我们将只关注与Wayland相关的部分。 Linux的工作是提供对硬件的抽象,以便可以由用户空间安全地访问 - Wayland合成器在其中运行。 对于图形,这被称为DRM或直接渲染管理器,它有效地将GPU与来自用户空间的工作任务分派。 DRM的一个重要子系统是KMS或内核模式设置,用于枚举您的显示器并设置属性,例如选择的分辨率(也称为它们的“模式”)。 输入设备通过称为evdev的接口进行抽象化。

大多数内核接口都通过/dev中的特殊文件提供给用户空间。 在DRM的情况下,这些文件位于/dev/dri/中,通常是主节点(例如card0)的形式,用于特权操作,如模式设置,以及渲染节点(例如renderD128),用于无特权操作,如渲染或视频解码。 对于evdev,这些“设备节点”是/dev/input/event*。

用户空间

现在,我们进入用户空间。在这里,应用程序与硬件隔离,必须通过内核提供的设备节点进行操作。

libdrm
大多数Linux接口都有一个用户空间的对应部分,为这些设备节点提供了一个舒适(的)C API。其中一个这样的库是libdrm,它是DRM子系统的用户空间部分。Wayland合成器使用libdrm进行模式设置和其他DRM操作,但通常不被Wayland客户端直接使用。

Mesa
Mesa是Linux图形堆栈最重要的部分之一。除了其他事物外,它还为Linux提供了供应商优化的OpenGL(和Vulkan)实现,以及GBM(通用缓冲区管理)库-这是libdrm上的一个抽象,用于在GPU上分配缓冲区。大多数Wayland合成器将通过Mesa使用GBM和OpenGL,而大多数Wayland客户端将使用至少其OpenGL或Vulkan实现。

libinput
与libdrm抽象DRM子系统一样,libinput提供了evdev的用户空间端。它负责从内核接收到来自您的各种输入设备的输入事件,解码它们为可用的形式,并将其传递给Wayland合成器。Wayland合成器需要特殊权限才能使用evdev文件,迫使Wayland客户端通过合成器接收输入事件-例如,这可以防止键盘记录。

(e)udev
处理来自内核的新设备的出现,配置/dev中相应设备节点的权限,并向系统上运行的应用程序发送这些更改的消息,这是落入用户空间的职责。大多数系统为此使用udev(或称为eudev,它是udev的一个分支)。您的Wayland合成器使用udev来枚举输入设备和GPU,并接收新设备出现或旧设备拔出时的通知。

xkbcommon
XKB代表X键盘,是Xorg服务器的原始键盘处理子系统。几年前,它从Xorg树中提取出来,并成为独立的键盘处理库,与X没有任何实际关系。Libinput(与Wayland合成器一起)以扫描码的形式传递键盘事件,其确切含义因键盘而异。xkbcommon的责任将这些扫描码翻译成有意义和通用的键“符号”-例如,将65转换为XKB_KEY_Space。它还包含一个状态机,知道按住Shift键时按下“1”会发出“!”。

Pixman
一个简单的库,供客户端和合成器使用,以有效地操纵像素缓冲区,进行与相交矩形的数学运算,并执行其他类似的像素操作任务。

libwayland
libwayland是Wayland协议最常用的实现,用C语言编写,处理低层次电缆协议的大部分内容。它还提供了一个工具,可以从Wayland协议定义(XML文件)生成高级代码。我们将在第1.3章和本书中详细讨论libwayland。

其他
到目前为止提到的每个部分在Linux桌面生态系统始终存在。除此之外,还有更多的组件。许多图形应用程序根本不知道Wayland,而是选择让GTK +、Qt、SDL和GLFW等库来处理它。许多合成器选择像wlroots这样的软件来抽象更多的职责,而其他合成器则自行实现所有功能。

1.2 目标与目标受众

我们的目标是让您通过阅读本书,了解Wayland协议及其高级用法。您应该对核心Wayland协议中的所有内容有充分了解,并具备评估和实施各种生产用途所需的协议扩展所需的知识。本书主要使用Wayland客户端的关注点来构建对Wayland的介绍。但是,它也应该为那些从事Wayland合成器工作的人提供一些实用性。

免费的桌面生态系统是复杂的,并且由许多独立的组件构成。我们在此讨论的这些组件非常少,您在此不会找到有关在Wayland合成器中利用libdrm的信息,也不会找到有关使用libinput处理evdev事件的信息。因此,本书不是构建Wayland合成器的全面指南。我们也不会讨论对Wayland客户端有用的绘图技术,例如Cairo、Pango、GTK+等等,因此本书也不是一个用于实际Wayland客户端实现的可靠指南。相反,我们只关注Wayland的特定部分。

本书只涵盖协议和libwayland。如果您正在编写客户端并且已经熟悉您最喜欢的用户界面渲染库,请带上您自己的像素,我们将帮助您在Wayland上显示它们。如果您已经了解操作显示和输入设备所需的技术,那么这本书将帮助您学习如何与客户端通信。

1.3 Wayland软件包中有什么

当你在Linux发行版中安装“wayland”时,你很有可能会安装libwayland-client、libwayland-server、wayland-scanner和wayland.xml的http://freedesktop.org发行版。它们分别位于/usr/lib & /usr/include、/usr/bin和/usr/share/wayland/。这个软件包代表了Wayland协议的最流行实现,但并不是唯一的实现。第3章详细介绍了这个Wayland实现;本书的其余部分同样适用于任何实现。

wayland.xml

Wayland协议由XML文件定义。如果你在你的最喜欢的文本编辑器中找到并打开“wayland.xml”,你会找到“核心”Wayland协议的XML规范。这是一个高级协议——建立在我们将在下一章讨论的线路协议之上。这本书的大部分内容都用来解释这个文件。

wayland-scanner

“wayland-scanner”工具用于处理这些XML文件并生成代码。最常见的实现是你现在正在查看的这个,它可以用于从像wayland.xml这样的XML文件生成C头和粘合代码。其他编程语言的扫描仪包括wayland-rs(Rust)和waymonad-scanner(Haskell)等等。

libwayland

libwayland-client和libwayland-server这两个库包括连接每个端口的线路协议的实现。提供了一些用于处理Wayland数据结构的常用工具,一个简单的事件循环等等。此外,这些库还包含由wayland-scanner生成的core Wayland协议的预编译副本。

上一篇下一篇

猜你喜欢

热点阅读