*NIX GUI如何工作?

dmk*_*mkc 6 unix linux user-interface kde gnome

我想了解更多关于什么使*NIX系统上的GUI工作,但不太确定从哪里开始研究.根据我的理解,X服务器是使所有视觉效果成为可能的原因,并且有各种UI环境,如KDE,Gnome等.

但是,例如,我一直认为在某些UI环境下运行会限制您使用该环境的程序,直到我意识到我能够在Gnome下使用KDE实用程序和软件,反之亦然,这保留了他们原生的外观环境.

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

War*_*rbo 7

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

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

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

App --OpenGL--> Driver --> Hardware --VGA--> Screen
Run Code Online (Sandbox Code Playgroud)

当然,像大多数标准一样,实际上有很多不同的标准!大多数操作系统上的大多数驱动程序都支持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 --+
Run Code Online (Sandbox Code Playgroud)

X往往可以直接访问驱动程序,因为它比OpenGL更长,但这并不重要.

X11协议所进行的工作应用程序创建的窗口,他们正允许绘制,X可以在屏幕上排列这些窗口,包括重叠他们.使用OpenGL的应用程序可以让他们的命令直接"通过"X到驱动程序,而X仍然会像其他任何一样安排窗口(这不会在网络上工作,因为它绕过了X11的网络功能).

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

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

xterm --+
        |
        +--X11--> X --> Driver --> ...
        |
twm   --+
Run Code Online (Sandbox Code Playgroud)

然而,大多数现代应用程序发现原始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   --+
Run Code Online (Sandbox Code Playgroud)

有些工具包提供的功能之上他人的; 例如wxWidgets让Qt进行绘图(在Linux上; Windows和OSX是"本机"),XUL由Firefox使用并使用GTK +进行绘图:

Audacity --> wxWidgets --> Qt   --+
                                  |
Firefox  --> XUL       --> GTK+ --+--X11--> X --> Driver --> ...
                                  |
GIMP     ----------------> GTK+ --+
Run Code Online (Sandbox Code Playgroud)

值得一提的是,X11的形状和文本绘制命令实际上并没有被使用,因为它们非常原始.许多工具包实际上将其小部件渲染为图像,然后让X绘制这些图像.新的Wayland系统试图通过丢弃绘图命令并让应用程序和工具包直接使用OpenGL来替换X,这样可以使事情变得更快.

您提到了不同的桌面环境,如GNOME和KDE,以及它们是否协同工作.这些基本上是大量的应用程序集合,可以很好地协同工作.只是碰巧GNOME应用程序都是用GTK +编写的,而KDE应用程序都是用Qt编写的.

如果你看一下上图中的箭头,你会注意到每个Qt应用程序分别与X对话,每个GTK +应用程序分别与X对话,等等.Qt和GTK +应用程序不仅可以并行工作,只要X与两个Qt应用程序或两个GTK +应用程序相同即可!

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


Pau*_*lan 6

从本质上讲,GUI位是包含chrome(程序窗口周围的东西)的单独库,通常包括一些其他东西,如桌面工具栏等.GNOME和KDE是桌面环境的例子.

它们每个都包含一个窗口管理器,它可以告诉您的程序精确绘制的位置以及如何绘制chrome.

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

在您的窗口管理器上方,您已经拥有了实际的程序.每个人都会调用窗口管理器来执行诸如"给我一个带有关闭按钮的50x50窗口"之类的通用内容.

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

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