Windows (Win32 API)和OS X (Cocoa)都有自己的API来处理窗口、事件和其他操作系统的东西。我从来没有真正得到一个明确的答案,Linux的等效是什么?
我听到有人说GTK+,但GTK+是跨平台的。怎么可能是本土的呢?
Linux是一个内核,不是一个完整的操作系统。有不同的窗口系统和gui运行在Linux上提供窗口。通常X11是Linux发行版使用的窗口系统。
XWindows可能是最接近所谓的“原生”:)
我想这个问题更像是“linux的原生GUI API是什么”。
在大多数情况下,X(又名X11)将用于http://en.wikipedia.org/wiki/X_Window_System。
你可以找到API文档在这里
严格地说,Linux的API由系统调用组成。这些都是用户模式(非内核)程序可以调用的所有内核函数。这是一个非常低级的接口,允许程序做一些事情,比如打开和读取文件。有关一般介绍,请参阅http://en.wikipedia.org/wiki/System_call。
为了提供图形用户界面和其他特性,一个真正的Linux系统还会有一个运行在其上的其他软件的完整“堆栈”。这个堆栈的每个元素都将提供自己的API。
在Linux中,图形用户界面不是操作系统的一部分。大多数Linux桌面上的图形用户界面是由名为X窗口系统的软件提供的,它定义了一种与设备无关的处理屏幕、键盘和指针设备的方式。
X Window定义了一个用于通信的网络协议,任何知道如何“说”这个协议的程序都可以使用它。有一个名为Xlib的C库可以更容易地使用这个协议,所以Xlib是一种的原生GUI API。Xlib不是访问X Window服务器的唯一方法;还有XCB。
使用诸如GTK +(由GNOME使用)和Qt(由KDE使用)等构建在Xlib之上的工具包库,是因为它们更容易编程。例如,它们为应用程序提供一致的外观,使拖放操作更容易,为现代桌面环境提供标准组件,等等。
X在屏幕上如何绘制内部取决于实现。X.org有一个设备独立部分和一个设备依赖部分。前者管理窗口等屏幕资源,而后者与显卡驱动程序通信,通常是一个内核模块。通信可以通过直接内存访问或通过系统调用与内核进行。驱动程序将命令转换成卡上硬件能够理解的形式。
截至2013年,一个名为韦兰的新窗口系统开始可用,许多发行版都表示他们将在某个时候迁移到它,尽管仍然没有明确的时间表。该系统基于OpenGL/ES API,这意味着未来OpenGL将成为Linux中的“原生GUI API”。正在进行的工作是将GTK+和QT移植到Wayland,这样当前流行的应用程序和桌面系统将需要最小的更改。无法移植的应用程序将通过X11服务器得到支持,就像OS X通过Xquartz支持X11应用程序一样。GTK+的移植是预计一年内完工,而Qt 5已经有完整的Wayland支持。
更复杂的是,Ubuntu宣布他们正在开发一个名为米尔的新系统,因为他们发现Wayland存在问题。这个窗口系统也是基于OpenGL/ES API的。
韦兰也值得一提,因为它通常被称为“未来的X11杀手”。
还要注意,Android和其他一些移动操作系统不包括X11,尽管它们有Linux内核,所以从这个意义上说,X11并不是所有Linux系统的本机。
跨平台与本土化没有任何关系。Cocoa也通过GNUStep移植到其他平台,但它仍然是OS X / macOS的原生版本。
linux中最接近Win32的是libc,正如你所提到的,不仅是UI,还有事件和“其他操作系统的东西”
为了帮助已经提到的内容,在这个博客上有一个关于Linux图形堆栈的很好的概述:http://blog.mecheye.net/2012/06/the-linux-graphics-stack/
这解释了X11/Wayland等以及它们是如何组合在一起的。除了已经提到的内容,我认为有必要添加一些关于你可以在Linux中用于图形的API:
台面 -“Mesa有很多功能,但它最著名的功能之一是它的OpenGL实现。它是OpenGL API的开源实现。”
开罗 -“cairo是一个绘图库,可以由像Firefox这样的应用程序直接使用,也可以通过像GTK+这样的库来绘制矢量形状。”
DRM(直接渲染管理) -我对这个理解最少,但它基本上是内核驱动程序,可以让你直接将图形写入framebuffer,而不需要经过X
GUI是功能的高级抽象,所以从XOrg服务器到OpenGL的几乎所有东西都是跨平台移植的,包括Windows平台。但如果你所说的GUI API是指*nix图形API,那么你可能会在“直接渲染基础设施”附近徘徊。
linux内核的图形化操作在/include/linux/fb.h中作为结构体fb_ops。最终,这就是X11、Wayland或DRM等附加组件所引用的内容。由于这些操作仅适用于视频卡,而不适用于矢量或光栅硬拷贝或面向tty的终端设备,因此它们作为GUI的用处是有限的;如果你不介意在必要时使用一些汇编器绕过系统调用,那么你需要这些附加组件来获得图形输出,这并不完全正确。
正如你可能听到的,wayland是目前许多发行版的特色选择,因为它的协议比X更简单。
wayland 建议的工具包或gui库是: