如果 Gnome 使用 GTK+ 而 KDE 使用 Qt,那么 KDE 应用程序如何能在 Gnome 下运行?
答案1
GTK 和 Qt 都是工具包用于构建图形界面。每个 UI 工具包都提供自己的功能,供程序创建小部件(按钮、文本框……),并以以下形式提供:库图形程序链接的对象。为 GNOME 编写的程序将使用 GTK(libgdk
和libgtk
),而 KDE 程序使用 Qt(libQtCore
和libQtGui
),Enlightenment 程序使用 EFL,等等。
然而,所有这些工具包使用相同的X窗口系统& 相同X11 协议为了使内容出现在屏幕上,该工具包连接到正在运行的 X 服务器(通常是 Xorg,以前称为 XFree86),发送 X11 命令(创建窗口、在窗口中绘制某些内容),并接收 X11 输入事件(鼠标、键盘、窗口调整大小等)。
(大多数现代工具包,如 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)或微软的“远程桌面”,设计为此,他们有非常有效的方法来压缩窗口图像。
答案2
部分答案是,领先的桌面环境(Gnome、KDE、XFCE,也许还有其他)在http://freedesktop.org使这种互操作成为可能。FD.o 发布的规范之一是急性肺水肿,这确保了窗口管理器之间具有一定程度的兼容性(针对现代功能,而不仅仅是基本的窗口管理)。
答案3
在 GNOME 下运行时,KDE 应用程序仍会调用它们所依赖的共享 Qt 库。在任何其他桌面环境下运行任何应用程序时也是如此。它们对可调用和不可调用的内容没有任何限制。