* NIX GUI如何工作?

时间:2010-10-27 17:35:32

标签: linux unix user-interface gnome kde

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

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

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

当然,像大多数标准一样,实际上有很多不同的标准!大多数操作系统上的大多数驱动程序都支持OpenGL;它的" OpenGL ES"子集在手机上运行良好,并且有软件驱动程序和#34;它可以基于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协议的工作原理是让应用程序创建允许他们绘制的 windows .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 系统试图通过丢弃绘图命令来替换X,并让应用程序和工具包直接使用OpenGL,这样可以使事情变得更快。

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

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

混合桌面时唯一需要担心的是两个应用程序是否竞争执行相同的工作,例如,如果您尝试运行两个窗口管理器或两个桌面面板。请注意,这是图形,工具包等问题,因为如果我使用基于相同工具包构建的两个桌面(例如lxpanel和gnome-panel都是用GTK +编写的,但他们仍然会互相帮助!)

答案 1 :(得分:6)

基本上,GUI位是包含chrome(程序窗口周围的东西)的单个库,并且通常包括一些其他东西,如桌面工具栏等。 GNOME和KDE就是桌面环境的例子。

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

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

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

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

这里有一个很好的选择http://xwinman.org/