Linux的本地GUI API是什么?

487

Windows(Win32 API)和 OS X (Cocoa)都有自己处理窗口、事件和其他操作系统事项的 API。 我从来没有真正得到一个清晰的答案,关于 Linux 的等价物是什么?

我听说过有些人说 GTK +,但是GTK+是跨平台的,它怎么能算是本地的呢?


49
乔尼是正确的:"在Linux中,图形用户界面不是操作系统的一部分... X Window系统定义了一个用于GUI功能的网络协议。工具箱库(如Gnome使用的Gtk+和KDE使用的QT)是建立在Xlib之上的。" - paulsm4
36
相反,大卫,这是一个很好的问题。 - amphibient
8
我同意 - 我读过《Linux编程接口》和《系统级程序设计…Unix》这两本关于内核和API的圣经,但我从未想到过这个问题 :) 这些答案很有趣。 - John Humphreys
11
如果你包括Wine,Win32 API也是跨平台的。 - Brendan Long
2
顺便提一下,Windows拥有WIN32/WIN64子系统,这些子系统实现了许多与“Windows外观和感觉-也称为WIN32”等相关的功能。这些子系统在NT内核之上运行。它们的API是不同的。例如,C:是WIN32抽象,而不是NT内核的东西。某些窗口功能也是如此。Windows还拥有可用的Unix子系统(支持X11到某种程度)。 - Preet Sangha
显示剩余4条评论
11个回答

650
在Linux中,图形用户界面不是操作系统的一部分。大多数Linux桌面上的图形用户界面由名为X Window System的软件提供,它定义了一种处理屏幕、键盘和指针设备的设备无关方式。
X Window为通信定义了一种网络协议,任何知道如何“说话”这个协议的程序都可以使用它。有一个名为Xlib的C库使得使用该协议更容易,因此Xlib是本地GUI API。Xlib不是访问X Window服务器的唯一方法;还有XCB

工具包库,例如GTK+(由GNOME使用)和Qt(由KDE使用),建立在Xlib之上,因为它们更容易进行编程。例如,它们为您提供了跨应用程序的一致的外观和感觉,使拖放更容易使用,提供了现代桌面环境的标准组件等。

X在屏幕上内部绘制取决于实现方式。X.org有一个与设备无关的部分和一个与设备相关的部分。前者管理屏幕资源,例如窗口,而后者与图形卡驱动程序通信,通常是内核模块。通信可以通过直接内存访问或通过系统调用到内核中进行。驱动程序将命令转换为硬件所理解的形式。

截至2013年,一个名为Wayland的新窗口系统开始变得可用,并且许多发行版表示他们最终会迁移到该系统,尽管目前还没有明确的时间表。该系统基于OpenGL/ES API,这意味着在未来,OpenGL将成为Linux中的“本地GUI API”。正在进行将GTK+和QT移植到Wayland的工作,以便当前流行的应用程序和桌面系统需要最少的更改。无法移植的应用程序将通过X11服务器支持,类似于OS X通过Xquartz支持X11应用程序。预计GTK+端口将在一年内完成,而Qt 5已经完全支持Wayland。
进一步复杂化问题的是,Ubuntu宣布他们正在开发一个名为Mir的新系统,因为他们认为Wayland存在问题。这个窗口系统也基于OpenGL/ES API。

54
即使Windows最初只是在DOS操作系统之上运行的一个程序。 - dan04
3
+1 @DavidHammen 我不确定这是针对我说的还是其他人,但你说得完全正确。我的术语并不是非常准确。我应该说的是,它不像你通常想象的带有所有使其易于使用的其他组件的完整操作系统,而是来自不同供应商的组件的混合体等。 - Chris Thompson
3
@ChrisThompson - 嗯……也许是我太老了,但我从来没有将GUI视为操作系统的核心部分。而且,我也从来没有想过没有GUI的操作系统只是“来自不同供应商等组件的混合体”。但是,也许自从我形成对操作系统构成的看法以来,情况已经发生了变化 :) - George Hawkins
1
@VladLazarenko 你质疑X是否与驱动程序交流而非直接与显卡通信。如果只是后者,就不需要nvidia和ATI的驱动程序。DMA是用于数据,而不是用于控制。 - Jim Balter
2
除非答案是社区维基,否则我不会更改任何内容,除了改善语法/格式或添加链接。如果内容需要纠正或更新,则由与内容相关联的人负责。但我会给他们留言,让他们知道_我认为_需要纠正或更新的地方。 - Honest Abe
显示剩余12条评论

92

Linux是一个内核,而不是完整的操作系统。有不同的窗口管理系统和图形用户界面在Linux上运行,以提供窗口化。通常Linux发行版使用的窗口管理系统是X11


8
它们是建立在其上的。X11 是服务器,而 KDE、Gnome 等是桌面管理器,提供更高级别的 API、常见窗口布局等。 - Mark
8
X11是实际处理所有这些内容的低层级别,负责绘制屏���并与图形驱动程序通信。Gnome/KDE则控制X11。这就是一个高层次的概述,忽略了无数的细节。 - slugonamission
3
谢谢。还有一个问题:维基百科解释说X11“创建了一个硬件抽象层,在这个层上软件编写成使用一组通用的命令,从而实现设备独立性和在实现X的任何计算机上重用程序。”我的问题是:为什么X11提供硬件交互(HAL),难道Linux内核不应该提供这个功能,而X11在内核之上操作吗?换句话说,为什么X11要直接访问硬件设备,而不是使用内核作为代理?回答:X11提供硬件抽象层是为了支持跨平台的可移植性和兼容性。虽然内核可以提供某些硬件交互功能,但它们可能会因为特定硬件或驱动程序的不同而变得不兼容。X11创建了一个通用的硬件抽象层,使得软件可以编写一组通用的命令来与任何硬件设备进行交互,这样就能够保证程序在任何实现X11的计算机上都能正常工作,而不必担心底层硬件的差异性。因此,X11通过提供自己的硬件抽象层来增加跨平台的兼容性和可移植性。 - amphibient
1
在这种情况下,我认为“HAL”是一个错误使用的术语。实际上,他们所说的是X11提供了一种系统独立的显示窗口的方法。有用于Darwin(Mac OS-X Mountain Lion现在更加复杂...)、MS Windows和Linux的X11版本。 - Chris Thompson
4
X11是一种网络协议。抽象化涉及编写在平台A上的程序,可以通过某些网络设备在平台B上显示X11客户端(窗口、应用等)。您的应用程序可以本地运行,远程运行,在嵌套服务器中运行,在仅执行VNC的虚拟服务器中运行等。硬件抽象化(在本地平台上)是此功能的副作用,但它还模糊了X11和内核之间的界限(这就是在普通Unix系统上执行硬件抽象化的方式)。 - Alexios
显示剩余8条评论

64

Wayland 值得一提,因为它通常被称为“未来的X11杀手”。

此外,请注意,在某些移动操作系统(如Android)中,虽然它们使用Linux内核,但不包括X11,因此从这个意义上讲,X11并不是所有Linux系统的本地组件。

跨平台与本地化无关。Cocoa 也已通过GNUStep 移植到其他平台,但它仍然是OS X / macOS 的本地组件。


2
Wayland的高级架构图与X相同,只是在Wayland图中,“合成器”和“服务器”被合并了。缺少的是一个合理的解释,为什么这种集成不能在X中实现。 - Kaz
1
我认为改变一个20多年代码库的基本设计并不容易。此外,需要注意的是X11的另一个问题是它的大部分功能,如字体渲染,今天已经不再使用。此外,在服务器和超级计算机中仍然需要X11,因为网络透明度太好了,不能放弃。 - none
4
@gokcehan wayland并没有省略网络透明性,这是一个误解。它目前还没有被实现,就像Wayland中的许多其他功能一样。http://wayland.freedesktop.org/faq.html#heading_toc_j_8 http://blog.martin-graesslin.com/blog/2011/08/thoughts-about-network-trancparency/等。 - whitequark
10
提到Android缺乏X11,这使得它成为“x11是本地Linux GUI”的论点最有力的反例。展示了Linux可以采用X11或者Android作为其“本地”GUI,这向初学者阐明Linux仅仅是一个内核,并不总是有GUI。 - Trevor Boyd Smith
“跨平台与本地化无关”是一个很好的观点。在我多年的跨平台移植经验中,我经常使用这种模式。尤其是在90年代,我销售了一个框架,可以让你交叉编译使用MFC作为底层的Metrowerks PowerPlant框架的代码。(在任何人嘲笑之前,一旦你深入宏定义以下,MFC是相当合理的。)我还有过多个移植工作,其中Win32或Mac Toolbox API是我们编译的规范,并在其他平台上重新实现了必要的内容。” - Andy Dent
显示剩余2条评论

26

严格来说,Linux的API由其系统调用组成。这些是内核函数,可以被用户模式(非内核)程序调用。这是一种非常低级别的接口,允许程序执行诸如打开和读取文件之类的操作。详见http://en.wikipedia.org/wiki/System_call进行概括介绍。

真正的Linux系统还将有整个软件“堆栈”运行在其上,以提供图形用户界面和其他功能。该堆栈的每个元素都会提供自己的API。


5
当问题是"What is linux's native API?"(现在问题已插入“GUI”),此答案已经被编写。Linux的本机API是其内核向用户空间提供服务的接口,包括系统调用、文件系统和网络协议栈等。它允许应用程序直接与内核进行交互,从而实现对计算机硬件的控制和访问。 - nibot
1
这仍然是正确的答案,尽管现在的问题已经变得不连贯,因为Linux上运行的所有系统,包括GNU和X11,在任何有意义的意义上都不是“本地”的。 - Jim Balter

21
为了帮助之前已经提到的内容,这篇博客对Linux图形堆栈有一个非常好的概述:http://blog.mecheye.net/2012/06/the-linux-graphics-stack/ 这解释了X11/Wayland等内容以及它们如何组合在一起。除了已经提到的内容外,我认为值得补充一些有关在Linux中用于图形的以下API: Mesa - "Mesa是许多东西,但它最著名的贡献之一就是OpenGL实现。它是OpenGL API的开源实现。" Cairo - "cairo是一个绘图库,直接被应用程序(如Firefox)或通过像GTK+这样的库使用,用于绘制矢量形状。" DRM(Direct Rendering Manager) - 我了解得最少,但基本上它是内核驱动程序,可以让您直接将图形写入帧缓冲区,而不需要通过X。

如果有人需要,这是那篇俄语文章的翻译。 - Boris Burkov

11

6

XWindows可能是最接近所谓“本地”的东西 :)


3
这是与X11相同的东西吗? - DavidColson
2
但是如果你直接使用它,你会发现它并不完全是一个GUI API... Linux没有一个本地的GUI API。但几乎所有这些GUI API(至少是今天在桌面Linux上常见的那些)都运行在X之上。如果你今天开始使用纯粹的X编写应用程序,它看起来会完全不适合任何现代发行版,所以我会说本地GUI取决于发行版 - 对于Ubuntu来说是gtk/gnome,对于其他发行版来说是kde。 - Axel

1

Wayland

你可能已经听说过,Wayland 是如今许多发行版的首选,因为它的协议比 X 更简单。

Wayland 的工具包

Wayland 建议使用的工具包或 GUI 库有:

  • QT 5
  • GTK+
  • LSD
  • Clutter
  • EFL

1
Linux内核的图形操作在/include/linux/fb.h中作为struct fb_ops。最终,像X11、Wayland或DRM这样的附加组件似乎是参考的内容。由于这些操作仅适用于视频卡,而不适用于矢量或光栅硬拷贝或面向tty的终端设备,因此它们作为GUI的有用性受到限制;如果您不介意使用一些汇编语言来绕过syscall,则完全不需要这些附加组件以获得图形输出。

0

在Linux中,最接近Win32的应该是libc库,因为您提到的不仅仅是UI界面,还包括事件和其他操作系统相关的内容。


5
libc(标准 C 库)是连接操作系统系统调用的接口。在 Linux 上,它是后者(系统调用)的抽象层,相当于 Windows 上的 Win32。你无法真正地(或完全?)在当前版本的 Windows 上编程而不使用 Win32 API 的某个级别,但是可以通过复制直接到系统调用的代码来为 Windows 和 Linux 编程而不使用相应编译器的标准 C 库。这并不推荐,并且会使你的代码完全无法移植到其他操作系统,但是这是可能的。 - user
UI不是libc的一部分 - 只要您不认为printf / scanf等类似内容是UI... libc只是C标准库。它也不是与操作系统系统调用交互的接口。它提供文件I / O,内存管理,字符串处理等功能,并在内部使用系统调用。如果要自己进行像ioctl这样的系统调用,则必须从sys/中包含某些内容。 - Axel
问题并非总是指定“GUI”。 - jv110
1
也许你所说的是 Xlib 而不是 libc - i486

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接