Windows (Win32 API)和OS X (Cocoa)都有自己的API来处理窗口、事件和其他操作系统的东西。我从来没有真正得到一个明确的答案,Linux的等效是什么?
我听到有人说GTK+,但GTK+是跨平台的。怎么可能是本土的呢?
Windows (Win32 API)和OS X (Cocoa)都有自己的API来处理窗口、事件和其他操作系统的东西。我从来没有真正得到一个明确的答案,Linux的等效是什么?
我听到有人说GTK+,但GTK+是跨平台的。怎么可能是本土的呢?
当前回答
严格地说,Linux的API由它的系统调用组成。这些都是用户模式(非内核)程序可以调用的所有内核函数。这是一个非常低级的接口,允许程序做一些事情,比如打开和读取文件。有关一般介绍,请参阅http://en.wikipedia.org/wiki/System_call。
为了提供图形用户界面和其他特性,一个真正的Linux系统还会有一个运行在其上的其他软件的完整“堆栈”。这个堆栈的每个元素都将提供自己的API。
其他回答
XWindows可能是最接近所谓的“原生”:)
Linux是一个内核,不是一个完整的操作系统。有不同的窗口系统和gui运行在Linux上提供窗口。通常X11是Linux发行版使用的窗口系统。
严格地说,Linux的API由它的系统调用组成。这些都是用户模式(非内核)程序可以调用的所有内核函数。这是一个非常低级的接口,允许程序做一些事情,比如打开和读取文件。有关一般介绍,请参阅http://en.wikipedia.org/wiki/System_call。
为了提供图形用户界面和其他特性,一个真正的Linux系统还会有一个运行在其上的其他软件的完整“堆栈”。这个堆栈的每个元素都将提供自己的API。
在Linux中,图形用户界面不是操作系统的一部分。大多数Linux桌面上的图形用户界面是由名为X Window System的软件提供的,该软件定义了一种与设备无关的处理屏幕、键盘和指针设备的方式。
X Window定义了一个用于通信的网络协议,任何知道如何“说”这个协议的程序都可以使用它。有一个叫做Xlib的C库,它使使用这个协议变得更容易,所以Xlib是一种原生GUI API。Xlib不是访问X Window服务器的唯一方法;还有XCB。
使用诸如GTK+ (GNOME使用)和Qt (KDE使用)等构建在Xlib之上的工具包库,是因为它们更容易编程。例如,它们为应用程序提供一致的外观,使拖放操作更容易,为现代桌面环境提供标准组件,等等。
X在屏幕上如何绘制内部取决于实现。X.org有一个独立于设备的部分和一个依赖于设备的部分。前者管理窗口等屏幕资源,而后者与显卡驱动程序通信,通常是一个内核模块。通信可以通过直接内存访问或通过对内核的系统调用进行。驱动程序将命令转换成卡上硬件能够理解的形式。
As of 2013, a new window system called Wayland is starting to become usable, and many distributions have said they will at some point migrate to it, though there is still no clear schedule. This system is based on OpenGL/ES API, which means that in the future OpenGL will be the "native GUI API" in Linux. Work is being done to port GTK+ and QT to Wayland, so that current popular applications and desktop systems would need minimal changes. The applications that cannot be ported will be supported through an X11 server, much like OS X supports X11 apps through Xquartz. The GTK+ port is expected to be finished within a year, while Qt 5 already has complete Wayland support.
更复杂的是,Ubuntu宣布他们正在开发一个名为Mir的新系统,因为他们发现Wayland存在问题。这个窗口系统也是基于OpenGL/ES API的。
linux内核的图形化操作在/include/linux/fb.h中作为结构体fb_ops。最终,这就是X11、Wayland或DRM等附加组件所引用的内容。由于这些操作仅适用于视频卡,而不适用于矢量或光栅硬拷贝或面向tty的终端设备,因此它们作为GUI的用处是有限的;如果你不介意在必要时使用一些汇编器绕过系统调用,那么你需要这些附加组件来获得图形输出,这并不完全正确。