Windows (Win32 API)和OS X (Cocoa)都有自己的API来处理窗口、事件和其他操作系统的东西。我从来没有真正得到一个明确的答案,Linux的等效是什么?
我听到有人说GTK+,但GTK+是跨平台的。怎么可能是本土的呢?
Windows (Win32 API)和OS X (Cocoa)都有自己的API来处理窗口、事件和其他操作系统的东西。我从来没有真正得到一个明确的答案,Linux的等效是什么?
我听到有人说GTK+,但GTK+是跨平台的。怎么可能是本土的呢?
我想这个问题更像是“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 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的。
Wayland也值得一提,因为它通常被称为“未来的X11杀手”。
还要注意,Android和其他一些移动操作系统不包括X11,尽管它们有Linux内核,所以从这个意义上说,X11并不是所有Linux系统的本机。
跨平台与本土化没有任何关系。Cocoa也通过GNUStep移植到其他平台,但它仍然是OS X / macOS的原生版本。
为了补充前面提到的内容,在这个博客上有一个关于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(直接渲染管理器)——我对这个理解最少,但它基本上是内核驱动程序,可以让你直接将图形写入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的工具包
wayland建议的工具箱或gui库是:
QT 5 GTK+ 迷幻剂 杂乱 FFo