* NIX GUI如何工作?

我想知道更多关于* NIX系统的GUI是如何工作的,但是不知道从哪里开始研究。 从我的理解来看,X服务器就是让所有的视觉效果成为可能,而且还有像KDE,Gnome等等的各种UI环境。

但是,例如,我一直认为,在特定的UI环境下运行,将您限制在使用该环境的程序中,直到我意识到我能够在Gnome下使用KDE实用程序和软件,反之亦然,它们保留了本机的外观环境。

什么是开始学习这个话题的好地方?

Solutions Collecting From Web of "* NIX GUI如何工作?"

本质上,GUI位是个别的库,包括铬(围绕程序的窗口),通常还包括一些其他的东西,如桌面工具栏等等。 GNOME和KDE是这个的桌面环境示例。

它们每个都包含一个窗口管理器,这个窗口管理器可以精确地告诉你的程序在哪里绘制,以及如何绘制铬。

在他们的下面,你已经有了X框架,它提供了窗口管理器用来在屏幕上绘制的API。 所以X取决于你的图形驱动程序,它告诉它如何与你的硬件进行交互。

在你的窗口经理的上方,你已经有了你的实际程序。 其中每一个都会调用窗口管理器来做一些通用的事情,比如“给我一个关闭按钮的50×50窗口”。

程序绘制的实际小部件通常使用GNOME附带的图形工具包。 KDE包含Qt工具包。

这里有很多wm的选择http://xwinman.org/

我觉得保罗的答案可能会有点行话,所以这是我的尝试。

大量的显示设备(VGA显示器,复合视频,HDMI等),这些往往是直接在硬件上处理,例如。 在专用图形处理器(GPU)中。

我们使用的是驱动程序 (位于操作系统内核中 ),而不是直接与硬件对话。 不同的硬件需要不同的驱动程序,但所有的驱动程序都可以使用相同的接口给出指令,例如OpenGL:

App --OpenGL--> Driver --> Hardware --VGA--> Screen 

当然,像大多数标准一样,实际上有很多不同的标准! 大多数操作系统上的大多数驱动程序都支持OpenGL; 其“OpenGL ES”子集在手机上运行良好,并且有“软件驱动程序”可以创建基于OpenGL指令的图像( 所有驱动程序都可以绘制图像,虽然这比真正的OpenGL支持要慢很多)。 OpenGL的一大竞争对手是DirectX,但只能在Windows和XBox上运行。

渲染到OpenGL对于像全屏3D游戏是很好的,但是* 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仍然会像其他任何一个一样排列窗口(这不会在网络上运行,因为它绕开了X11的网络功能)。

我们通常有一个专门为我们安排,隐藏/显示和关闭窗口的应用程序,称为窗口管理器 。 可选地,窗口管理器可以在其他边缘周围创建一些薄窗口,以便可以绘制标题栏,调整手柄大小等。

X11协议包括用于绘制形状,渲染字体等的命令,并且有直接使用这些命令的应用程序,例如xterm程序和twm窗口管理器:

 xterm --+ | +--X11--> X --> Driver --> ... | twm --+ 

然而,大多数现代应用程序发现原始的X11太乏味了; 而不是绘制线条和形状,我们宁愿绘制整个小部件 (按钮,菜单,图标等)。 要做到这一点, 工具包已经创建。 最着名的两个叫做QtGTK + (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系统正试图通过丢弃绘图命令来取代X,并让应用程序和工具包直接使用OpenGL,这会使事情变得更快。

您提到了不同的桌面环境,如GNOME和KDE,以及它们是否一起工作。 这些基本上是大量的应用程序编写在一起工作。 恰好如此,GNOME应用程序全都是用GTK +编写的,而KDE应用程序都是用Qt编写的。

如果你看上面的图中的箭头,你会注意到每个Qt应用程序分别与X对话,每个GTK +应用程序分别和X对话。 不仅Q和GTK +应用程序并行工作,就X而言,它与两个Qt应用程序或两个GTK +应用程序相同!

混合桌面时唯一要担心的是两个应用程序是否在竞争同一个工作,例如,如果您尝试运行两个窗口管理器或两个桌面面板。 请注意,这不是图形,工具包等的问题,因为如果我使用两个建立在相同工具箱上的桌面,我会得到同样的问题(例如,lxpanel和gnome-panel都是用GTK +编写的,但是他们仍然会得到在彼此的方式!)