Linux的本机GUI API是什么?


441

我希望这不会成为一个愚蠢的问题,但这始终是我一直想知道的事情。Windows(Win32 API)和OS X(Cocoa)都有自己的API,可以处理窗口,事件和其他OS内容。对于Linux的等效功能,我从未真正有明确的答案。

我听说有人说GTK +,但是GTK +是跨平台的,怎么会是本地的呢?


46
Joni是正确的:“在Linux中,图形用户界面不是操作系统的一部分... X Window System为[GUI功能]定义了网络协议。工具包库,例如Gtk +(由Gnome使用)和QT(由KDE),建立在Xlib之上。”
paulsm4 2012年

33
相反,戴维(David),这是一个很好的询问
两栖游戏,2012年

7
我同意-我已阅读“ Linux编程API”和“系统编程... Unix”,这是内核和API上的两本圣经,而我从未想到过这个问题:)答案很有趣。
约翰·汉弗莱斯

10
如果您包括Wine,Win32 API也是跨平台的。
Brendan Long

2
BTW Windows具有WIN32 / WIN64子系统,除了其他功能外,这些子系统还为“ Windows外观-aka WIN32”实现了许多相同的功能。这些子系统在NT内核之上运行。这些的API不同。例如C:是WIN32抽象,不是NT内核。某些窗口功能也相同。Windows还具有可用的Unix子系统(在某种程度上支持X11)。
Preet Sangha

Answers:


603

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

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

之所以使用XKit之上的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宣布由于Wayland遇到的问题而正在开发一个名为Mir的新系统。该窗口系统也基于OpenGL / ES API。


95
+1。由于操作系统什么时候必须具有GUI,是否暗示它不是OS?废话。
大卫·哈门

42
甚至Windows最初也只是在DOS之上运行的程序。
dan04 2012年

2
+1 @DavidHammen我不确定这是否是针对我的,但是您100%正确。我的术语不完全准确。我应该说的是,这不是一个完整的操作系统的方式,您可能会常与一切,使易于使用的附加组件认为OS,而是来自不同供应商等成分的聚集
克里斯汤普森2012年

3
@ChrisThompson-嗯...也许我年纪太大了,但我从未想过GUI是操作系统的核心部分。而且我从未想到没有GUI的操作系统仅仅是“来自不同供应商的组件的集合等”。但是,自从我对构成OS的看法形成以来,也许情况可能已经发生了变化:)
George Hawkins

2
除非答案是社区Wiki,否则除了改善语法/格式或添加链接之外,我不会更改任何内容。如果内容需要更正或更新,则由信誉与内容绑定的人负责。但是,我将帮助他们进行评论,以便他们意识到我认为某些问题需要纠正或更新。
诚实的安倍晋三

84

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


6
它们建立在它之上。X11是服务器,而KDE,GNOME等都是桌面管理器,提供了更高级别的API,常见的窗口布局等
马克

7
X11是实际的低层,它处理所有这些内容并处理到屏幕等的绘制(并与图形驱动程序进行通信)。然后,Gnome / KDE控制X11。这是在高层次上进行的,忽略了十亿个细节。
slugonamission,2012年

3
谢谢。另一个问题:维基百科解释说,X11“创建了一个硬件抽象层,在其中编写软件来使用一组通用的命令,从而使设备独立性和实现X的任何计算机上的程序均可重复使用。” 我的问题是:为什么X11提供硬件交互(HAL),Linux内核应提供该功能,而X11在内核之上运行?换句话说,当内核应作为代理时,为什么X11到达硬件设备?
两栖游戏,2012年

1
认为在这种情况下,这HAL是一个错误使用的术语。他们真正在说的是X11提供了一种独立于系统的方式来显示窗口。有适用于Darwin的X11版本(Mac OS-实际上,现在使用Mountain Lion更加复杂...),MS Windows和Linux。
克里斯·汤普森

4
X11是网络协议。抽象涉及在平台A上编写程序,该程序可以通过某些网络设备在平台B上显示X11客户端(窗口,应用程序等)。您的应用程序可以在本地,远程,嵌套服务器中,仅在VNC中运行的虚拟服务器中运行,等等。硬件抽象(在本地平台上)是此功能的副作用,但同时也模糊了X11与内核(这是普通Unix系统上进行硬件抽象的功能)。
Alexios

59

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

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

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


2
Wayland的高级体系结构图与X相同,只是X图中的“合成器”和“服务器”在Wayland图中合并。什么是缺少的是一个合理的解释,为什么这种整合不能工作到十
卡兹

1
好吧,我想说要更改20多年历史的代码库的基本设计并不容易。还要注意,X11的另一个问题是它的大多数功能(例如字体渲染)今天都没有使用。服务器和超级计算机仍将需要X11,网络透明度太好了,不能放弃。

3
@gokcehan wayland不忽略网络透明性,这是一个神话。它没有实现,就像韦兰许多其他的事情。wayland.freedesktop.org/faq.html#heading_toc_j_8 blog.martin-graesslin.com/blog/2011/08/...
whitequark

8
+!提到Android缺少X11。对于“ x11是本地linux GUI”这一论点,Android可能是最令人信服的反例。证明Linux可以具有x11或Android(因为它是“本机” GUI)向初学者展示了Linux实际上只是一个内核,并不总是具有GUI。
Trevor Boyd Smith

“跨平台与原生无关”是一个很好的观点。在移植跨平台的这些年中,我经常使用这种模式。最值得注意的是,在90年代,我出售了一个框架,该框架使您可以在后台使用MFC对编写到Metrowerks PowerPlant框架的代码进行交叉编译。(在任何人嘲笑之前,一旦您进入宏之下,MFC都是很合理的。)我还进行了多个移植工作,其中Win32或Mac Toolbox API是我们进行编译的规范,并在其他平台上根据需要重新实现。
安迪·邓特

23

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

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


3
当问题是“什么是linux的本机API?”时,写下了此答案。(此后,“ GUI”已插入到问题中)。
nibot 2012年

仍然是解决当前不连贯问题的正确答案,因为在Linux之上的所有系统(包括GNU和X11)在任何有意义的意义上都不是“本机”。
Jim Balter 2012年

20

为了帮助已经提到的内容,此博客中对Linux图形堆栈进行了很好的概述:http : //blog.mecheye.net/2012/06/the-linux-graphics-stack/

这解释了X11 / Wayland等以及它们如何组合在一起。除了已经提到的内容外,我认为值得添加一些有关以下API的信息,您可以在Linux中将其用于图形处理:

Mesa- “ Mesa有很多东西,但是它提供的最著名的主要功能之一就是它的OpenGL实现。它是OpenGL API的开源实现。”

开罗 -“开罗是一个绘图库,可以被Firefox之类的应用程序直接使用,也可以被GTK +之类的库使用,以绘制矢量形状。”

DRM(Direct Rendering Manager) -我对此了解最少,但基本上是内核驱动程序,可让您直接将图形写入帧缓冲区而无需通过X


habrahabr.ru/post/148954-(俄语)该帖子的翻译,如果有人需要
Boris Burkov,


5

XWindows可能是最接近所谓的“本机”的东西:)


3
和x11一样吗?
DavidColson,2012年

1
但是,如果直接使用它,您会发现它不是一个GUIAPI。Linux只是没有1个本机GUI API。但是几乎所有这些GUI API(至少今天在台式机Linux上都是常见的)都运行在X之上。如果您今天开始使用普通的旧X编写应用程序,那么在任何现代发行版中它看起来都将完全不合适。说本地GUI是依赖于发行版的-ubuntu为gtk / gnome,其他为kde。
Axel 2012年

1

在Linux中,最接近Win32的是libc,因为您不仅提到了UI,而且还提到了事件和“其他操作系统”。


5
libc(C标准库)是OS系统调用的接口。在Linux上,后者(OS系统调用)可以大致转换为Windows上的Win32。如果不使用Win32 API,就不能为当前版本的Windows真正地(或根本不?)编程,但是无需复制相应的编译器的标准C库,就可以针对Windows和Linux进行编程。到系统调用代码。不建议这样做,它会使您的代码完全不可移植到其他操作系统,但是可以这样做。
CVn 2012年

UI并不是libc的一部分-只要您不认为printf / scanf之类的东西就是UI ... libc只是C标准库。而且它也不是OS系统调用的接口。它提供文件I / O,内存管理,字符串处理等功能,并在内部使用系统调用。为了像ioctl您一样进行系统调用,您必须包含中的内容sys/
Axel 2012年

问题并不总是指定“ GUI”。
jv110

也许你说的Xlib不是libc
i486

1

linux内核图形操作在/include/linux/fb.h中作为struct fb_ops。最终,这才是X11,Wayland或DRM之类的附件所引用的。由于这些操作仅适用于视频卡,而不适用于矢量或光栅硬拷贝或面向tty的终端设备,因此它们作为GUI的用途受到限制;如果您不介意使用某些汇编程序绕过syscall,则并非完全正确,您需要这些附加组件来获得图形输出。


0

GUI是功能的高级抽象,因此从XOrg服务器到OpenGL的几乎所有内容都可以跨平台移植,包括Windows平台。但是,如果使用GUI API的意思是* nix图形API,那么您可能会在“ Direct Rendering Infrastructure”周围徘徊。


0

韦兰

如您所知韦兰是许多发行版的特色选择,因为它的协议比X更简单。

Wayland的工具包

Wayland 建议的工具箱或GUI库是:

  • QT 5
  • GTK +
  • 迷幻药
  • 杂乱无章
  • EFL

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.