476

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

我听说有人说 GTK+,但 GTK+ 是跨平台的。怎么可能是原生的?

4

11 回答 11

637

在 Linux 中,图形用户界面不是操作系统的一部分。大多数 Linux 桌面上的图形用户界面是由称为X Window System的软件提供的,它定义了一种与设备无关的方式来处理屏幕、键盘和指针设备。

X Window 定义了一个用于通信的网络协议,任何知道如何“说出”这个协议的程序都可以使用它。有一个名为Xlib的 C 库可以更轻松地使用此协议,因此 Xlib 是一种生 GUI API。Xlib 不是访问 X Window 服务器的唯一方法。还有XCB

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

X 如何在屏幕上绘制内部取决于实现。X.org有一个设备独立部分和一个设备相关部分。前者管理windows等屏幕资源,后者与显卡驱动通信,通常是内核模块。通信可能通过直接内存访问或通过对内核的系统调用进行。驱动程序将命令翻译成卡上的硬件可以理解的形式。

从 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。

于 2012-10-03T21:38:00.023 回答
91

Linux 是一个内核,而不是一个完整的操作系统。有不同的窗口系统和 gui 运行在 Linux 之上以提供窗口。X11通常是 Linux 发行版使用的窗口系统。

于 2012-10-03T21:26:28.927 回答
63

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

另请注意,Android 和其他一些移动操作系统不包含 X11,尽管它们具有 Linux 内核,因此从这个意义上说,X11 并不是所有 Linux 系统都原生的。

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

于 2012-10-03T21:49:32.777 回答
26

严格来说,Linux 的 API 由它的系统调用组成。这些是用户模式(非内核)程序可以调用的所有内核函数。这是一个非常低级的接口,允许程序执行诸如打开和读取文件之类的操作。有关一般介绍,请参阅http://en.wikipedia.org/wiki/System_call

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

于 2012-10-03T21:37:37.700 回答
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(直接渲染管理器) -我对此了解最少,但它基本上是内核驱动程序,可让您直接将图形写入帧缓冲区而无需通过 X

于 2012-10-04T03:40:47.810 回答
11

我想这个问题更像是“什么是 linux 的原生 GUI API”。

在大多数情况下,X(又名 X11)将用于:http ://en.wikipedia.org/wiki/X_Window_System 。

您可以在此处找到 API 文档

于 2012-10-03T21:33:03.127 回答
6

XWindows 可能是最接近可以称为“本机”的东西 :)

于 2012-10-03T21:26:48.670 回答
1

linux 内核图形操作在 /include/linux/fb.h 中作为 struct fb_ops。最终,这就是 X11、Wayland 或 DRM 等附加组件所引用的内容。由于这些操作仅适用于视频卡,而不是矢量或光栅硬拷贝或面向 tty 的终端设备,因此它们作为 GUI 的有用性是有限的;如果您不介意在必要时使用一些汇编程序绕过系统调用,那么您需要这些附加组件来获得图形输出并不完全正确。

于 2018-02-27T01:49:06.133 回答
1

韦兰

正如您可能听说的,Wayland是当今许多发行版的特色选择,因为它的协议比 X 更简单。

Wayland 工具包

wayland建议的工具包或 gui 库是:

  • QT 5
  • GTK+
  • 迷幻剂
  • 杂波
  • 英语
于 2018-10-04T07:39:38.330 回答
0

linux 中最接近 Win32 的是 libc,因为您不仅提到了 UI,还提到了事件和“其他操作系统的东西”

于 2012-10-04T00:54:31.520 回答
0

GUI 是一种高级别的能力抽象,所以从 XOrg 服务器到 OpenGL 的几乎所有东西都是跨平台移植的,包括 Windows 平台。但是,如果您所说的 GUI API 是指 *nix 图形 API,那么您可能会在“直接渲染基础设施”周围徘徊。

于 2015-11-29T09:37:39.723 回答