彻底理解类 Unix 系统的 GUI(转载)

本文最后更新于 2021年9月9日 凌晨

本文转载自微信公众号“编程之路从0到1”的同名文章,喜欢本文请关注原公众号以表支持

Unix/Linux 这类系统本身没有图形界面,图形界面的实现只是系统中的一个应用程序而已。换言之,图形界面并不是操作系统本身的一部分,Unix/Linux 就是一个基于 shell 命令行的操作系统。

Windows 系统则不同,从 Windows95 开始,系统内核中就已经包含了图形系统,也就是说,图形界面是操作系统本身的一部分。因此,Windows 这样的系统,在图形桌面上的表现远远超过 Unix/Linux,由此才占据了 PC 市场的主要份额。

随着时代发展,类 Unix 系统也产生了图形界面的需求,为了解决这个问题,出现了 X Window System[1]

X Window 系统(X11,或简称 X)是一个位图显示的窗口系统,常见于类似 Unix 的操作系统。

X 提供了 GUI 环境的基本框架:在显示设备上绘制和移动窗口,并与鼠标和键盘进行交互。X 并没有规定用户界面,这是由各个程序处理的。因此,基于 X 环境的视觉风格差异很大;不同的程序可能呈现出完全不同的界面外观。

X 起源于 1984 年麻省理工学院 (MIT) 的雅典娜项目(Project Athena),自 1987 年 9 月以来,X 协议一直处于第 11 版(因此称为 “X11”)。X.Org基金会领导着 X 项目,目前的参考实现X.Org服务器,以 MIT 许可和类似的许可方式作为免费和开源软件提供。

X 已变成 UNIX、类 UNIX、以及 OpenVMS 等操作系统所一致适用的标准化软件工具包及显示架构的运作协定。X 窗口系统通过软件工具及架构协定来创建操作系统所用的图形用户界面,此后则逐渐扩展适用到各形各色的其他操作系统上。现在几乎所有的操作系统都能支持与使用 X。更重要的是,今日知名的桌面环境——GNOME 和 KDE 也都是以 X 窗口系统为基础建构成的。

X 的历史

X 起源于 1984 年的麻省理工学院。它是 “Project Athena” 的一部分,这是一个全校范围的跨平台系统,它大致是基于斯坦福大学的 W Window 系统。

不久之后,Unix 厂商开始对 X 产生了兴趣。他们意识到,X 将使图形应用程序更容易移植到新的硬件上,这反过来又会吸引独立软件厂商(ISV)-- 软件越多,系统的销量就越大。

在经历了短暂的限制性许可之后,1987 年,X Window 系统的第 11 版在 MIT 许可下发布,并成立了一个名为 “X 联盟” 的厂商中立组织来管理开发。这是最早的开源项目的例子之一。事实上,它比开源一词早了十几年。每个厂商都以 X 联盟的样本代码为出发点,实现了一个针对其特定显示硬件和操作系统的服务器。

X 的控制权从一个小组传到另一个小组,直到 1999 年,开放集团成立了 X.org 来管理这项技术。不幸的是,当时 X 的官方工作几乎已经停滞不前。

然而,1992 年,一个名为 X386 的 X for PC 的特殊实现引起了许多开发者的兴趣。当 X386 的商业版本开始发行时,这个开源版本被改名为 XFree86。最终,大多数 X 创新都是在 XFree86 项目内部进行的,而不是来自 X 标准的官方守护者。

但是,内部政治和僵化的组织结构给 XFree86 项目公司带来了损失,在 2003 年的一场许可纠纷之后,一些关键的开发者决定他们已经受够了。他们将开发工作搬回了几乎不存在的 X.org,成立了 X.org 基金会,并将工作推向了高潮。2004 年,大多数开源操作系统发行版都采用了 X.org 服务器。

最终,活跃的 X 开发在原地结束,XFree86 项目的后续项目取代了 X 技术的样本实现,一个重新焕发活力的开发者社区开始再次稳步推进技术的发展。

X 的其他名字

X 窗口系统有许多不同的名称,有时这是造成混乱的原因。应使用以下名称之一来引用 X:

  • X
  • X Window System
  • X Version 11
  • X Window System, Version 11
  • X11

请注意,“X Windows” 并不在该名单上;这一遗漏最初是由于担心与微软的 Windows 产品系列相混淆。多年来,这一直被用作一种遮羞布;任何提到 “X Windows” 的人都被认为是局外人或初学者,你可能应该避免说 “X Windows”。

版本号在现代的使用中几乎从未被提及,因为之前的版本都是实验性的,而 11 版本已经使用了近二十年(虽然版本号一直在上升)。

由于 X.org 实现的主导地位,导致不少人将 X 本身称为 Xorg 或 X 点 org。

如何理解 X

X 图形用户接口,并不是一个软件,而「是一个协议」(protocal),这个协议定义一个系统成品所必需的功能(如同 TCP/IP、HTTP 这些协议一样,它只是一组规范)。任何系统能满足此协议及符合X协会其他的规范,便可称为 X。

由于 X 只是架构规范,并不是一个具体软件,所以必须有人依据此协议规范开发出具体实现软件。X 有许多具体实现,其中较为知名的有:

  • Xfree86
  • Xorg

其中,「Xorg」 是使用最为广泛的实现软件。此外,在微软 Windows 系统上的实现有 「Xming」 ,苹果 MacOS 上的实现有「XQuartz」。

X 的架构原理

X Window 系统是基于 C/S 架构,由 「X server」,「X client」,「X 协议」三部分组成。

  • X server 和 X client 通过 X 协议进行通信
  • X server 接收 X client 的显示请求,并输出到显示设备上,同时,会把输入设备的输入事件,转递给相应的 X client
  • X 协议是网络透明(network-transparently)的,也就是说,server 和 client 可以位于同一台机器上的同一个操作系统中,也可以位于不同机器上的不同操作系统中(X 是跨平台的),这为远程 GUI 登录提供了便利。
  • X 将协议封装为命令原语(X command primitives),以库的形式(「xlib」「xcb」)向 client 提供接口。X client(即应用程序)利用这些 API,可以向 X server 发起 2D(或 3D,通过 GLX 等扩展)绘图请求
  • X client 是与硬件无关的,它并不关心你使用的显卡、显示器、键盘或鼠标,这些只与 X server 相关
  • 在大多数情况下,客户端是指在你的桌面电脑上运行的程序,而服务器是指远程机房中的电脑。但在 X 术语中,这是反过来的,你面前的电脑运行的是服务器,而客户端程序可能位于远程的计算机上。因为 X server 管理的具体资源包括显卡和显示器、指向设备(如鼠标、轨迹板和触摸屏)和键盘,这些资源分别位于运行 X server 的物理机上

X server 与 X client

简单的例子:X 服务器接收来自本地键盘和鼠标的输入并显示到屏幕上。在用户的工作站上运行一个 Web 浏览器和一个终端仿真器,终端仿真器在远程计算机上运行,但在用户的机器上进行控制和监视(远程登录)。

打个更好理解的比方,假设我们现在有一台建站用的远程 Linux 服务器,它只有命令行界面。但我们想要在 Linux 服务器上运行图形界面,如果直接给这台服务器安装 GUI 组件很可能引起服务器不稳定,而且安装 GUI 组也会很麻烦。实际上我们根本不需要给 Linux 服务器安装任何软件,只需要利用 X Window 系统即可。

根据 X Window 系统的架构,这台远程 Linux 主机是做为 X client 存在的,将界面数据发送到 X Window 服务器上显示。而 X Window 服务器是可以运行到我们本地的任何一台有界面的 windows、Linux 或者 mac 操作系统上的。

基于 X 的 GUI 的七个层次

Unix 的传统是将许多小程序组合成解决方案,而不是使用单一的整体程序。这种方法提供了更多的灵活性,因为这些较小的构件可以以不同的方式组合起来以满足不同的需求。

基于 X 窗口系统的 GUI 也遵循同样的理念,它们是以层的形式构建的,可以根据需要进行混合和匹配。

下图显示了大多数基于 X 的 GUI 中的七个层的简单模型:

基于X的GUI中的七层模型

图中顶部的元素对用户来说是最可见的,也是最重要的,而图中底部的组件是最不可见的。从下往上,这些层级是:

  • 网络传输」使其他层能够进行通信。这一层几乎总是由 TCP/IP 加上本地客户机的快速连接方案组成,但也可以使用许多旧的或专有的网络传输,包括 IPX/SPX 和 DecNET。
  • X Window 服务器」由管理显示器(通常由键盘、显示屏幕和鼠标组成)的软件组成,并在连接到显示器硬件的计算机上运行。X 服务器以上的所有层都被认为是该服务器的客户端,并且可以位于本地网络上的任何位置,甚至可以位于互联网上。
  • 显示管理器」使用户能够以图形方式登录系统。大多数显示管理器要求用户键入他的用户 ID 和密码,但也可以使用几乎任何认证方案,包括生物识别扫描。
  • 会话管理器」追踪整个登录会话的应用程序状态,启动标准客户端,如窗口管理器和桌面环境组件,重启上一个会话结束时处于活动状态的应用程序,并在应用程序崩溃时选择性地重启它们。
  • 窗口和合成管理器」管理窗口的位置并提供窗口装饰。这包括窗口标题栏、边框以及用于调整大小、最大化、最小化、移动和关闭窗口等常用操作的控件。当 COMPOSITE 扩展可用时,窗口管理器也作为合成管理器。X 开发者尝试着将它们分开,但为了真正发挥好作用,合成管理器需要访问只有窗口管理器才知道的窗口信息。窗口管理器被认为是一类特殊的客户端,而且一次只能在一个显示器上激活一个。
  • 桌面环境」为用户提供桌面模式的一个或多个程序。这可能包括启动程序的菜单,指示当前正在运行的程序的托盘或面板,代表桌面背景上的文件或程序的图标,停靠的小程序,以及其他有用的工具和实用程序。
  • 应用程序客户端」能够使用户进行有用工作的程序。它们是电子表格、文字处理器、网络浏览器、媒体播放器、视频编辑器等。
  • 工具包」编程库,用于简化编写与 X 服务器通信的客户端的任务。工具包本身不是一个层,但它们确实支持并简化了客户端层的构造。

任何一层中使用的软件都可以改变,而不影响其他层。例如,你可以从 XDM 显示管理器切换到 GDM 显示管理器,而无需对其他层进行任何更改。

最下面的两层(网络传输和 X 服务器)是必须的,其他层是可选的。这为 GUI 的操作方式提供了很大的灵活性。

例如,自动柜员机的用户不需要使用用户 ID 登录,不需要移动或调整窗口大小,也不需要管理文件和启动程序,因此不需要显示管理器、窗口管理器和桌面环境层,ATM 应用程序可以直接控制整个显示空间。或者,如果 X 是在用户登录后启动的,用户已经通过了身份验证,所以不需要显示管理器,可以不使用。

加入窗口管理器的 X Window 系统示意图

Linux 系统的桌面环境

桌面环境就是将各种组件捆绑在一起,以提供常见的图形用户界面元素,如图标、工具栏、壁纸和桌面小部件。此外,大多数桌面环境都包含一组集成的应用程序和实用程序。最重要的是,桌面环境提供了它们自己的窗口管理器,但是通常可以用另一个兼容的窗口管理器代替。

桌面环境可能仅仅是一个简单的窗口管理器, 也可能是一个像 KDE 或者 GNOME 这样的完整桌面应用程序套件。

重量级桌面环境

通常图形化界面都是比较吃资源的,内存占用率以及 CPU 的使用都是相对比较高的,重量级的桌面系统对电脑配置要求更高一点。

  • 「Gnome」
  • 「KDE」
  • 「Cinnamon」
  • 「Zorin」
  • 「Unity」

其中 Gnome 和 KDE 是两个较为重要的桌面环境。

KDE」是一个国际性的自由软件社区,开发运行在 Linux、BSD、Solaris、Microsoft Windows 与 macOS 等平台上的一系列跨平台应用程序。它最著名的产品是 Plasma 桌面,是许多 Linux 发行版的默认桌面环境,例如 openSUSE、Mageia、Linux Mint(19 版开始不再支持)、Kubuntu、PCLinuxOS 与 Chakra GNU/Linux。

社区的目标是开发基本的桌面功能和日常必需的应用程序,以及提供开发者编写独立的应用程序的工具和文档。许多独立应用程序和规模较小的项目是基于 KDE 的技术,这些软件包括 Calligra Suite、digiKam、Rekonq、K3b 和许多其他应用程序。KDE 软件是基于 Qt 框架所开发。多个国家的政府部门使用 KDE 软件,兴建于瑞士的大型强子对撞机也使用 KDE 软件。

KDE 是由德国人 Matthias Ettrich 于 1996 年就读于蒂宾根大学开始的一个计划。当时,他忧心于 Unix 桌面没有一个应用程序外观、感受或工作方式和其他程序一样。他建议不仅是创建一套应用程序,而是一个桌面环境,用户可以得到统一的外观和工作方式。他还希望这个桌面易于使用及更人性化;他当时对桌面应用的抱怨之一是对最终用户来说太复杂了。他在 Usenet 发表的文章引发了很大的回响,意味着 KDE 项目就此诞生了

GNOME」是一个完全由自由软件组成的桌面环境。它的目标操作系统是 Linux,但是大部分的 BSD 系统亦支持 GNOME。

GNOME 是由志愿贡献者和受雇贡献者组成的 GNOME 计划开发,其最大的公司贡献者为红帽公司。它是一个为开发软件框架、基于这些框架来开发客户端软件及协调软件翻译和开发无障碍软件的项目。GNOME 最初是 GNU 网络对象模型环境(GNU Network Object Model Environment)的缩写,但是已经被废弃了。是 GNU 计划的一部分,并且是由志愿者开发的。

GNOME 1」1996 年 KDE 发布,但 KDE 所依赖的 Qt 当时并未使用 GPL 许可。出于这种考虑,两个项目在 1997 年 8 月发起:一个是作为 Qt 库替代品的 “Harmony”,另外一个就是创建一个基于非 Qt 库的桌面系统,即 GNOME 项目。GNOME 的发起者为米格尔 · 德伊卡萨和费德里科 · 梅纳。

GIMP Toolkit(GTK+)被选中做为 Qt toolkit 的替代,担当 GNOME 桌面的基础。GTK + 使用 LGPL,允许链接到此库的软件(例如 GNOME 的应用程序)使用任意的许可协议。GNOME 计划的应用程序通常使用 GPL 许可证。

在 GNOME 变得普及后,1999 年 Qt 加入 GPL 许可。Troll Tech 在 GNU GPL 和 QPL 双重许可证下发布了 Unix 版的 Qt 库。Qt 加入 GPL 许可后,在 2000 年年底 Harmony 项目停止了开发,而 KDE 不再依赖非 GPL 的软件。2009 年 3 月,Qt 4.5 发布,加入了 LGPL 许可作为第三选择。

“GNOME”这个名称最初是 “GNU Network Object Model Environment” 的缩写,以反映最初为了开发类似微软对象链接与嵌入的框架。但这个缩写最后被放弃,因为它不再反映 GNOME 项目的远景。

加州初创企业 Eazel 公司于 1999 至 2001 年开发 Nautilus 文件浏览器。米格尔 · 德伊卡萨和纳特 · 弗里德曼于 1999 年创立后来成为 Ximian 的 Helix Code 公司。该公司开发了 GNOME 的基础设施和软件,2003 年被 Novell 收购。

GNOME 2」GNOME 2 与传统桌面界面十分相似,拥有一个用户可以与不同例如窗口、图标、文件等虚拟对象交互的桌面环境。GNOME 2 使用 Metacity 为它的默认窗口管理器。GNOME 2 的窗口、程序和文件管理和一般的桌面操作系统十分相似。在默认的设置中,桌面有一个启动菜单,可以用以开启已安装的程序及文件;己存在的窗口在下方的任务栏列出;而在右上角则有一个通知区以显示在背景运行的程序。不过,这些功能可以随用户喜好而更改位置、取代或甚至移除。

GNOME 3」在 GNOME 3 之前,GNOME 是根据传统的桌面比拟而设计,但在 GNOME 3 便被 GNOME Shell 所取代,所有转换窗口及虚拟桌面都在 “活动” 画面中进行。此外,因为 Mutter 取代了 Metacity 成为默认的窗口管理器,最小化及放大按钮不再默认在名称列中。Adwaita 取代了 Clearlooks 成为默认主题。很多 GNOME 核心程序都重新设计以提供更连贯的用户体验。

这些重大的改变最初引来了广泛的批评。MATE 桌面环境项目由 GNOME 2 的源始码派生,目标为保留 GNOME 2 的传统界面,同时支持最新的 Linux 技术,例如 GTK+ 3。Linux Mint 团队则以开发 “Mint GNOME Shell Extensions” 一系列于 GNOME 3 上运行之插件解决此问题,这些插件使 GNOME 3 的界面变回传统比拟界面。最后,Linux Mint 决定从 GNOME 3 的源代码派生另外一个桌面环境“Cinnamon”。

截至 2015 年,对 GNOME 3 的整体评价已大致转为正面。Linux 发行版 Debian 于 GNOME 3 发布时把 XFCE 改成默认的桌面环境,但在 Debian 8 己改回默认使用 GNOME 3。Linux 创始者林纳斯 · 托瓦兹于 2013 年已改回使用 GNOME 3。

轻量级桌面环境

轻量级的桌面需要较少的资源,所以可以运行在大多数的硬件上,同样,包括任务栏、菜单、图标。

轻量级的桌面环境有:「MATE」、「XFCE」、「LXDE」、「Enlightenment」、「Fluxbox」、「JWM」、「IceWM」、「RazorQT」等等

其他系统

MacOS(及其移动对应的 iOS)实现了自己的窗口系统,即「Quartz」。当苹果公司收购 NeXT,并使用 NeXTSTEP 构建 Mac OS X 时,它用 Quartz 取代了 Display PostScript。Quartz 的作者之一 Mike Paquette 解释说,如果苹果公司在 X11 中加入了对所有它想加入的功能的支持,那么无论如何它都不会与 X11 有太多相似之处,也不会与其他服务器兼容。

苹果的图形界面系统也是基于 X 协议,但它做了一些修改,并将图形界面系统集成到了内核中,而不是 Unix/Linux 那样仅仅作为一个应用程序,因此苹果的系统在图形界面的表现上,也远远超过了 Unix/Linux,这也是苹果能占据微软之外的另一部分 PC 市场份额的原因。

运行在 Linux 内核上的 Android 系统则使用自己的图形系统来绘制用户界面,称为「SurfaceFlinger」。3D 渲染由 EGL 处理。

如何理解工具包、窗口管理器、桌面环境的关系

目前使用的工具包主要有三种,桌面环境也是基于每一种工具包的。

这些桌面环境中的大多数都是与显示管理器、窗口管理器和一些应用程序客户端一起发布的,但是你可以混合和匹配来自不同环境的组件。使用一种桌面环境并不妨碍你使用由另一种工具包构建的应用程序或与另一种桌面环境一起发布的应用程序,所以你可以将 KDE 与 GTK + 应用程序一起使用,或者将 Xfce 与 Motif 应用程序一起使用。

现在几乎所有的新开发都是基于 GTK + 和 Qt 工具包,主要是因为它们是开源的,因此更容易被开发者使用。

然而,Motif 仍然是传统应用的重要工具包,特别是在一些金融和科学利基市场。Motif 和 OpenMotif 本质上是相同的产品,在不同的许可证下发布。虽然 Open Group Public License 允许 OpenMotif 自由发布,但这只适用于 FreeBSD 或 Linux 等开源操作系统,因此该许可证不符合开源定义 [2] 或 Debian 自由软件指南 (DFSG[3],)。因此,Motif 并不包含在大多数开源操作系统中。Open Group 曾表示打算改用更开放的许可证,但进展缓慢;与此同时,LessTif 项目 [4] 在 GPL 下重新实现了 Motif 的大部分功能。

Motif 是最后一个被广泛使用的工具包,它基于 X Intrinsics Toolkit(Xt),一个用 C 语言编写的面向对象的库。除了 Motif 之外,还有 Athena 项目的 widget(用户界面对象)集(Xaw),Athena widgets 的 3D 版本(Xaw3d),Sun 的 OpenLook(Olit),Motif-OpenLook 交叉 widget(Moolit)等。所有这些都已经被废弃,但你可能会在旧程序中不时遇到它们。

窗口管理器负责控制应用程序窗口的布局和外观,使每个应用程序窗口尽量以统一、一致的方式呈现给用户,如针对 X 的最简单的窗口管理程序——twm(Tab Window Manager[5])。

工具包是进一步的封装。以 X 为例,它通过「xlib」提供给应用程序的 API,仅仅可以绘制基本的图形单元(点、线、面等),这些基本的图形单元,要组合成复杂的应用程序,还有很多很多细碎、繁杂的任务要做。因此,一些特定的操作系统,会在 X 的基础上,封装出一些更为便利的 GUI 接口,方便应用程序使用,如 GTK+、QT 等等。

桌面环境是应用程序级别的封装,通过提供一系列界面一致、操作方式一致的应用程序,使系统以更为友好的方式向用户提供服务。而 Linux 系统比较主流的桌面环境主要包括 GNOME、KDE 等。

X 协议

为什么窗口的外观和行为各不相同

访问和使用显示资源的程序就是 X 客户端。它们可能与 X 服务器在同一台计算机上,也可能位于大厅的另一端,或者在地球的另一端。

X Window 开发者的早期宗旨之一是,X 应该提供一种实现 GUI 的机制,但不应该对 GUI 的操作方式施加任何政策。在 X 的历史上,这既是福也是祸。由于 X 没有定义策略,应用程序的外观一直由应用程序和工具包开发人员决定,程序之间存在巨大的差异。优点是可以自由尝试和创新,缺点是给用户带来困惑。

在一个系统中,会有三个不同的计算器:xcalc、kcalc 和 gnome-calculator,如图所示:

三种计算器界面

从这个屏幕截图中可以看出,每个计算器看起来都不一样:字体、颜色、按钮大小、菜单选项、图标和状态栏都因程序而异。当按钮被按下时,它们也使用不同的视觉效果。

幸运的是,工具包的开发者已经承担了许多政策问题的责任,基于同一工具包的程序一般都能以一致的方式运行。使用不同工具包的程序仍然会有不同的行为,但最流行的工具包在外观和感觉上已经趋于一致;注意 3D 按钮和 kcalc(中间)和 gnome-calculator(右)使用的字体之间的相似之处。

图中还有一点要注意:每个窗口的标题栏,边框和窗口控件都是相同的,因为它们是由窗口管理器而不是单个应用程序绘制的。

X 的优点和缺点

首先看优点:

  • 让显示输出更加灵活

    客户端可以在远程服务器上执行计算任务,而 X Server 仅负责图形显示。既可以充分利用服务器的强大性能进行运算,还不用给服务器安装桌面环境或连接显示器就能看到图像输出,这种场景在集群环境下非常常见。

  • 让 GUI 变得可移植

    只有 X Server 服务端与硬件打交道,所有的客户端都与硬件无关,这让不同的平台上的移植变得很容易。

  • 风格可自定义

    X 系统只负责显示图形,并不限制显示和操作的风格,因此不同的 X Window 的风格并不相同,用户可以根据自己的喜好进行选择。

缺点也很明显:

  • 性能

X Window 的 C/S 体系(C/S 架构)设计在应用程序和显示硬件之间多加了一层软件,导致绘图效率下降,所以引起了一些批评。因此开发了若干扩展,在设备和客户机在同一个系统上时,通过在获取适当许可的情况下,以直接访问设备来改善这一问题。而在 Linux 上,一些显驱动已经部分移入内核以提高效率。

  • 稳定性

另一方面,X 也被批评为需要(或者提供)了过多的对硬件的直接访问,从而影响了系统稳定性。行为不良的显卡驱动(有时也可能是应用程序)甚至能够导致整个系统崩溃或者重启;有时即使操作系统仍在工作,它也不能继续渲染其显示(这时除了重启,缺乏好的恢复手段)。目前所有的桌面 GUI 操作系统都提供某种对硬件的直接访问,支持者认为市场已经证明为了提供图形性能牺牲一点稳定性是值得的。或许将来随着技术和用户的演化这一平衡会有所变化。

  • 不规范的用户界面

X 刻意不去规范用户界面和程序之间大多数的通信,导致出现了许多非常不同的界面,同时造成程序之间协同的困难;而客户机之间的互操作规范 ICCCM 以难以正确实现而闻名。后来的标准化尝试,如 Motif 和 CDE,也于事无补。长久以来这已经成为用户和程序员的噩梦。

类 Unix 系统图形界面的新架构

Redhat 的一个大牛不满 X 架构的严重老化,另起炉灶设计一个全新的 X server,称为 Wayland。

Wayland」是一个通信协议,规定了显示服务器与其客户机之间的通信方式,而使用这个协议的显示服务器称为 Wayland Compositor。它由 Kristian Høgsberg 于 2008 年发起,目标是用更简单的现代化视窗系统取代 X Window System。Wayland 协议的参考实现称为 Weston,由 Wayland 项目组使用 C 语言开发。

Wayland 与 X Window System 的最大不同在于,它规定由客户机自身负责窗口边框和装饰的绘制,并且客户机能够通过 EGL[6] 以及一些 Wayland 特定的 EGL 扩展组件直接在显示存储器中算绘自己的缓冲器。窗口管理器简化成显示管理服务,专门负责算绘那些屏幕上的程序。这比 X Window System 中的窗口管理器要更简单、高效。

Wayland 项目的源码使用 MIT 许可证发布。现有的 Compositor 例如 Compiz[7],KWin[8] 和 Mutter[9] 对 Wayland 都有着不同程度的支持。

Wayland 和 X server 的区别

在 X 架构中」:

  1. 内核捕获鼠标点击事件并发送给 X server。
  2. X server 会计算该把这一事件发送给哪个窗口(事实上,窗口位置是由 Compositor 控制的,X server 并不能够正确的计算 Compositor 做过特效变化之后的按钮的正确位置)。
  3. 应用程序对此事件进行处理(将引发按钮更新动作)。但是,在此之前它得向 X server 发送绘制请求。
  4. X server 接收到这条绘制请求,然后把它发给视频驱动来渲染。X 还计算了更新区域,并且这条 “垃圾信息” 发送给了 Compositor。
  5. 这时,Compositor 知道它必须要重新合成屏幕上的一块区域。当然,这还是要向 X server 发送绘制请求的。
  6. 开始绘制。但是 X server 还会去做一些不必要的本职工作(窗口重叠计算、窗口剪裁计算等)。

X-architecture

在 Wayland 架构中」:

  1. 内核捕获鼠标点击事件并发送给 Wayland Compositor。
  2. 由于是直接发给 Wayland Compositor 的,所以 Wayland Compositor 会正确地计算出按钮的位置。同时它会把这一事件发送给按钮所在的应用程序来处理。
  3. 应用程序直接渲染,无需向 Wayland Compositor 请求。只需在绘制完成之后向 Wayland Compositor 发送一条信息表明这块区域被更新了。
  4. Wayland Compositor 收到这条信息后,立即重新合成整个桌面。

Wayland-architecture

目前,Wayland 使用 OpenGL ES 而不是传统的 OpenGL。“从长远来看,我们需要完整的 OpenGL 支持,但问题是 libGL 会带来 X 的依赖性…” 另一方面,使用 OpenGL ES 会使得 Wayland 更容易支持移动设备。Wayland 目前并不支持网络透明性,但未来可能会支持。

Reference


彻底理解类 Unix 系统的 GUI(转载)
https://muzing.top/posts/5360db82/
作者
Muzing
发布于
2021年9月8日
更新于
2021年9月9日
许可协议