Answers:
GTK和Qt都是用于构建图形界面的工具箱。每个UI工具箱都为程序提供了自己的功能来创建小部件(按钮,文本框...),并以图形程序链接到的库的形式提供。为GNOME编写的程序将使用GTK(libgdk
和libgtk
),而KDE程序使用Qt(libQtCore
和libQtGui
),启蒙程序使用EFL,依此类推。
但是,所有这些工具箱都使用相同的X窗口系统和相同的X11协议。为了使事物显示在屏幕上,该工具包连接到正在运行的X服务器(通常是Xorg,以前称为XFree86),发送X11命令(创建窗口,在窗口中绘制内容),并接收X11输入事件(鼠标,键盘,窗口大小调整) ,&c)返回。
(大多数现代工具箱,例如GTK,Qt或EFL,它们自己执行精美的绘图,仅使用X11发送完成的整个窗口的图像,而X服务器仅将其显示在屏幕上。老式的工具箱(例如lXaw或Motif)使用X11绘制线条,矩形或文本之类的图元,然后X服务器进行所有渲染。)
然后,X服务器完成将所有内容放在一起,与图形卡对话等工作。这样,您可以运行使用不同工具箱的各种不同版本的程序,因为最终它们仅使用相同的OS工具。
多重工具包的情况并非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(aka VNC)或Microsoft的“ Remote Desktop”,都是为此目的而设计的,它们具有压缩窗口图像的非常有效的方法。)
答案的一部分是领先的桌面环境(Gnome,KDE,XFCE,也许其他)可以在http://freedesktop.org下协同工作,以使这种互操作成为可能。FDMH发布的规范之一是EWMH,它可以确保窗口管理器之间有一定程度的兼容性(对于现代功能,而不仅仅是基本的窗口管理)。