Windows (Win32 API) 和 OS X (Cocoa) 都有自己的 API 来处理窗口、事件和其他操作系统的东西。关于 Linux 的等价物是什么,我从来没有真正得到明确的答案?
我听说有人说 GTK+,但 GTK+ 是跨平台的。怎么可能是原生的?
Windows (Win32 API) 和 OS X (Cocoa) 都有自己的 API 来处理窗口、事件和其他操作系统的东西。关于 Linux 的等价物是什么,我从来没有真正得到明确的答案?
我听说有人说 GTK+,但 GTK+ 是跨平台的。怎么可能是原生的?
在 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。
Linux 是一个内核,而不是一个完整的操作系统。有不同的窗口系统和 gui 运行在 Linux 之上以提供窗口。X11通常是 Linux 发行版使用的窗口系统。
严格来说,Linux 的 API 由它的系统调用组成。这些是用户模式(非内核)程序可以调用的所有内核函数。这是一个非常低级的接口,允许程序执行诸如打开和读取文件之类的操作。有关一般介绍,请参阅http://en.wikipedia.org/wiki/System_call。
一个真正的 Linux 系统还将运行一个完整的其他软件“堆栈”,以提供图形用户界面和其他功能。该堆栈的每个元素都将提供自己的 API。
为了帮助已经提到的内容,此博客中对 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
XWindows 可能是最接近可以称为“本机”的东西 :)
linux 内核图形操作在 /include/linux/fb.h 中作为 struct fb_ops。最终,这就是 X11、Wayland 或 DRM 等附加组件所引用的内容。由于这些操作仅适用于视频卡,而不是矢量或光栅硬拷贝或面向 tty 的终端设备,因此它们作为 GUI 的有用性是有限的;如果您不介意在必要时使用一些汇编程序绕过系统调用,那么您需要这些附加组件来获得图形输出并不完全正确。
linux 中最接近 Win32 的是 libc,因为您不仅提到了 UI,还提到了事件和“其他操作系统的东西”
GUI 是一种高级别的能力抽象,所以从 XOrg 服务器到 OpenGL 的几乎所有东西都是跨平台移植的,包括 Windows 平台。但是,如果您所说的 GUI API 是指 *nix 图形 API,那么您可能会在“直接渲染基础设施”周围徘徊。