如果 Gnome 使用 GTK+ 而 KDE 使用 Qt,那么 KDE 应用程序为什么可以在 Gnome 下运行?
use*_*686 32
GTK 和 Qt 都是用于构建图形界面的工具包。每个 UI 工具包都为程序提供自己的功能来创建小部件(按钮、文本框...),并以图形程序链接的库的形式出现。为 GNOME 编写的程序将使用 GTK(libgdk和libgtk),而 KDE 程序使用 Qt(libQtCore和libQtGui),Enlightenment 程序使用 EFL,等等。
但是,所有这些工具包都使用相同的X 窗口系统和相同的X11 协议。为了让东西出现在屏幕上,工具包连接到正在运行的 X 服务器(通常是 Xorg,以前称为 XFree86),发送 X11 命令(创建窗口,在窗口中绘制一些东西),并接收 X11 输入事件(鼠标、键盘、窗口大小调整) , &c) 回来。
(大多数现代工具包,如 GTK、Qt 或 EFL,自己执行花式绘图,只需使用 X11 发送整个窗口的完成图像,而 X 服务器仅将其放在屏幕上。较旧的工具包如 lXaw 或 Motif 改为使用X11 来绘制诸如线条、矩形或文本之类的图元,并且 X 服务器进行所有渲染。)
然后,X 服务器完成将所有内容放在一起、与您的图形卡通信等等的工作。通过这种方式,您可以运行使用不同工具包的各种不同版本的程序,因为最终它们只是使用相同的操作系统设施。
多工具包的情况并不是 X 独有的——例如,您会发现 Windows 程序使用标准comctl32但也使用 WPF、.NET WinForms、Chrome 的 Aura、Firefox 的 XUL,甚至相同的 GTK 或 Qt。大多数游戏使用自己风格的控件。实际上,这在任何允许您在整个窗口上绘制图像的图形系统上都是可能的。
然而,X的原则之一是“机制,而不是政策”。这意味着 X 服务器只为它的客户端(图形程序)提供了做各种事情的机制,但强加了尽可能少的规则。换句话说,X 比任何其他图形系统都更加重视这一点。
例如,图形系统的一个组成部分是窗口管理——在每个窗口周围绘制框架(又名装饰)、移动和调整窗口大小的能力等等。Windows 和 OS X 在系统中内置了一个窗口管理器,但在 X 中它作为一个单独的程序运行——X.Org 套件带有一个最小的twm,但几乎所有的桌面环境都带有自己的窗口管理器(GNOME 有 Sawfish、Metacity、 gnome-shell;KDE 具有 KWin)提供与相应桌面环境的集成。
(与工具包一样,现代“合成”窗口管理器实际上接管了 Xorg 将所有窗口合成到最终屏幕图像上的工作,允许添加阴影或效果等内容。)
对于现代桌面环境,这实际上也产生了问题。使用最常见的示例:热键使用相同的“抓取键盘”功能;弹出菜单;和屏幕保护程序,并且一次只能使用一个程序。这意味着您无法在弹出菜单打开时锁定屏幕,或在屏幕锁定时跳过歌曲。这是创建 Wayland 以替代 X11 的几个原因之一。
从技术上讲,这甚至意味着您可以在另一台计算机上运行 X 程序,通过网络与您机器上的 X 服务器通信。事实上,这是早期的主要用例,这也是“X服务器”这个名字的由来。可以在 Mac 上运行 X 服务器并让它显示由运行在 Linux、FreeBSD 甚至 OpenVMS 上的程序创建的窗口。
然而,如上所述,现代工具包在客户端执行所有绘图(花哨的图形和漂亮的字体很难用 X11 原语完成),并且只将最终图像推送到 X 服务器,这在本地非常快,但需要一个相当的网络带宽。
(其他协议,如 RFB(又名 VNC)或微软的“远程桌面”,就是为此而设计的,它们有非常有效的压缩窗口图像的方法。)
部分答案是领先的桌面环境(Gnome、KDE、XFCE,也许其他)在http://freedesktop.org下协同工作,使这种互操作成为可能。FD.o 发布的规范之一是EWMH,它确保了窗口管理器之间的一定程度的兼容性(针对现代功能,而不仅仅是基本的窗口管理)。