我想了解更多关于 *NIX 系统上的 GUI 工作的原因,但不太确定从哪里开始研究。据我了解,X 服务器使所有的视觉效果都成为可能,在此之上还有各种 UI 环境,如 KDE、Gnome 等。
但是,例如,我一直认为在某些 UI 环境下运行会限制您使用使用该环境的程序,直到我意识到我能够在 Gnome 下使用 KDE 实用程序和软件,反之亦然,它们保留了它们本机的外观环境。
什么是开始学习这个主题的好地方?
我想了解更多关于 *NIX 系统上的 GUI 工作的原因,但不太确定从哪里开始研究。据我了解,X 服务器使所有的视觉效果都成为可能,在此之上还有各种 UI 环境,如 KDE、Gnome 等。
但是,例如,我一直认为在某些 UI 环境下运行会限制您使用使用该环境的程序,直到我意识到我能够在 Gnome 下使用 KDE 实用程序和软件,反之亦然,它们保留了它们本机的外观环境。
什么是开始学习这个主题的好地方?
我觉得保罗的回答可能有点专业术语,所以这是我的尝试。
有很多显示设备(VGA 监视器、复合视频、HDMI 等),这些设备往往直接在硬件中处理,例如。在专用图形处理器 (GPU) 中。
我们不是让我们的应用程序直接与这个硬件对话,而是使用驱动程序(位于我们的操作系统内核中)。不同的硬件需要不同的驱动程序,但是所有的驱动程序都可以使用相同的接口给出指令,例如OpenGL:
App --OpenGL--> Driver --> Hardware --VGA--> Screen
当然,像大多数标准一样,实际上有一大堆不同的标准!大多数操作系统上的大多数驱动程序都支持 OpenGL;它的“OpenGL ES”子集在手机上运行良好,并且有“软件驱动程序”可以根据 OpenGL 指令创建图像(所有驱动程序都可以绘制图像,尽管这比真正的 OpenGL 支持慢得多)。OpenGL 的一大竞争对手是 DirectX,但它只适用于 Windows 和 XBox。
对于像全屏 3D 游戏这样的东西,渲染到 OpenGL 是很好的,但 *NIX 图形系统(称为“X”)在此之上提供了两个主要功能:在同一屏幕上绘制多个应用程序和通过网络绘制。为此,服务器进程绘制到屏幕上,应用程序(“客户端”)使用“X11 协议”(“11”只是版本号)与该服务器通信:
App A ----------OpenGL-------+
|
App B --+ |
| |
+--X11--> X server --+----> Driver --> Hardware --> Screen
|
App C --+
|
...network ...
|
App D --+
X 倾向于直接访问驱动程序,因为它比 OpenGL 存在的时间更长,但这并不是太重要。
X11 协议通过让应用程序创建允许它们绘制的窗口来工作。X 可以在屏幕上排列这些窗口,包括重叠它们。使用 OpenGL 的应用程序可以让它们的命令直接“通过”X 到驱动程序,并且 X 仍然会像其他任何窗口一样排列窗口(这在网络上不起作用,因为它绕过了 X11 的网络功能)。
我们通常有一个专门为我们安排、隐藏/显示和关闭窗口的应用程序,称为窗口管理器。可选地,窗口管理器可能会在其他窗口的边缘创建一些薄窗口,以便它可以绘制标题栏、调整手柄大小等。
X11 协议包括用于绘制形状、渲染字体等的命令,并且有一些应用程序直接使用这些命令,例如xterm
程序和twm
窗口管理器:
xterm --+
|
+--X11--> X --> Driver --> ...
|
twm --+
然而,大多数现代应用程序发现原始 X11 太乏味了。我们宁愿绘制整个小部件(按钮、菜单、图标等),而不是绘制线条和形状。为此,已经创建了工具包。最著名的两个称为Qt和GTK+(GIMP 工具包,因为它最初是为 GIMP 创建的);其他包括 Motif、Lesstif、ETK、Tk 和 FLTK。我们可以让工具包绘制一个按钮,它会发送所有必要的 X11 命令来绘制一个按钮,另外它会处理大小和位置,如果有东西覆盖它然后移开,则刷新绘图,告诉我们的代码何时该按钮已被单击,一些工具包甚至允许更改小部件的外观主题。一些工具包也是跨平台的,所以它们会在 Linux 上发送 X11 命令,在 Windows、OSX 等上发送不同的命令。
Rhythmbox --> GTK+ --+
|
GIMP --> GTK+ --+
|
Amarok --> Qt --+--X11--> X --> Driver --> ...
|
Skype --> Qt --+
|
aMSN --> Tk --+
一些工具包提供了超越其他工具包的功能;例如wxWidgets
让 Qt 进行绘图(在 Linux 上;Windows 和 OSX 是“本地的”),XUL
由 Firefox 使用并使用 GTK+ 进行绘图:
Audacity --> wxWidgets --> Qt --+
|
Firefox --> XUL --> GTK+ --+--X11--> X --> Driver --> ...
|
GIMP ----------------> GTK+ --+
需要提到的重要一点是,X11 的形状和文本绘制命令实际上并没有太多使用,因为它们非常原始。许多工具包实际上将它们的小部件渲染为图像,然后让 X 绘制这些图像。新的Wayland系统试图通过丢弃绘图命令并让应用程序和工具包直接使用 OpenGL 来取代 X,这应该会使事情变得更快。
您提到了不同的桌面环境,例如 GNOME 和 KDE,以及它们是否一起工作。这些基本上是大量编写的应用程序,可以很好地协同工作。碰巧的是,GNOME 应用程序都是用 GTK+ 编写的,而 KDE 应用程序都是用 Qt 编写的。
如果您查看我上面图表中的箭头,您会注意到每个 Qt 应用程序单独与 X 通信,每个 GTK+ 应用程序单独与 X 通信,等等;不仅 Qt 和 GTK+ 应用程序可以并行工作,就 X 而言,这与两个 Qt 应用程序或两个 GTK+ 应用程序相同!
混合桌面时唯一需要担心的是两个应用程序是否在竞争执行相同的工作,例如,如果您尝试运行两个窗口管理器或两个桌面面板。请注意,这不是图形、工具包等的问题,因为如果我使用基于同一个工具包构建的两个桌面,我会遇到同样的问题(例如,lxpanel 和 gnome-panel 都是用 GTK+ 编写的,但它们仍然会得到以彼此的方式!)
从本质上讲,GUI 位是包含 chrome(程序窗口周围的东西)的单独库,通常包括一堆其他东西,如桌面工具栏等。GNOME 和 KDE 就是这方面的桌面环境示例。
它们每个都包含一个窗口管理器,它可以准确地告诉您的程序在哪里绘制,以及如何绘制镶边。
在它们下面,您有 X 框架,它提供了窗口管理器用来在屏幕上绘制的 API。所以 X 取决于你的图形驱动程序,它告诉它如何与你的硬件交互。
在您的窗口管理器上方,您拥有实际的程序。其中的每一个都会调用窗口管理器来做一些通用的事情,比如“给我一个带有关闭按钮的 50x50 窗口”。
程序绘制的实际小部件通常使用图形工具包,例如 GNOME 中包含的工具包。KDE 包括 Qt 工具包。
这里有很多 wm 的选择http://xwinman.org/