什么是Linux的原生GUI API?

Dav*_*son 427 c c++ linux api user-interface

我希望这不是一个愚蠢的问题,但它总是我想知道的.Windows(Win32 API)和OS X(Cocoa)都有自己的API来处理窗口,事件和其他操作系统.对于Linux的等价物,我从来没有真正得到明确的答案.

我听说有人说GTK +,但是GTK +是跨平台的,它怎么可能是原生的呢?

Jon*_*oni 591

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

X Window定义了用于通信的网络协议,任何知道如何"说"该协议的程序都可以使用它.有一个叫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.

  • +1.从什么时候开始,操作系统必须有一个GUI,这意味着如果不是,那么它不是操作系统?废话. (92认同)
  • 甚至Windows最初只是一个运行在DOS之上的程序. (42认同)
  • @DavidHammen很明显.每个操作系统都需要一个GUI,因为否则你无法将鼠标连接到NAT路由器,而没有鼠标支持的NAT路由器显然是无用的.(讽刺) (18认同)
  • 我们能否获得有关Wayland的2016年最新消息? (9认同)
  • @ChrisThompson - 嗯......也许我太老了,但我从未想过将GUI作为操作系统的核心部分.我从来没有想过没有GUI的操作系统只是"来自不同供应商的组件集合等".但是嘿,也许事情已经发生了变化,因为我形成了对构成操作系统的看法:) (3认同)
  • +1 @DavidHammen我不确定这是否针对我,但你是100%正确的.我的术语并不完全准确.我所说的是,它不是一个完整的操作系统,就像你通常认为的操作系统一样,所有的附加组件都易于使用,而是来自不同供应商的组件集合等. (2认同)
  • 除非答案是社区维基,否则除了改进语法/格式或添加链接之外,我不会更改任何内容。如果内容需要更正或更新,则由声誉与内容相关的人员负责。然而,我会帮助他们发表评论,以便他们意识到_我认为_某些东西需要纠正或更新。 (2认同)

Chr*_*son 83

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

  • X11是实际的低级层,它处理所有这些东西并处理绘图到屏幕等(并与图形驱动程序通信).然后Gnome/KDE控制X11.这是关于它的高水平,忽略了十亿和一个细节. (7认同)
  • 它们建立在它之上.X11是服务器,而KDE,Gnome等是桌面管理器,提供更高级别的API,常见的窗口布局等. (6认同)
  • X11是一种网络协议.抽象涉及在平台A上编写程序,该平台可以通过某些网络设备在平台B上显示X11客户端(窗口,应用程序等).您的应用程序可以在本地,远程,嵌套服务器,只执行VNC的虚拟服务器等中运行.硬件抽象(在本地平台上)是此功能的副作用,但它也模糊了X11和内核(这是普通Unix系统上的硬件抽象). (4认同)
  • 谢谢.还有一个问题:维基百科解释说,X11"创建了一个硬件抽象层,其中编写软件以使用一组通用命令,允许设备独立并在任何实现X的计算机上重用程序." 我的问题是:为什么X11提供硬件交互(HAL),如果Linux内核提供,并且X11在内核之上运行?换句话说,当内核应该是它的代理时,为什么X11会到达硬件设备? (3认同)

non*_*one 58

Wayland也值得一提,因为它主要被称为"未来的X11杀手".

另请注意,Android和其他一些移动操作系统不包含X11,尽管它们有Linux内核,因此从这个意义上讲,X11并非所有Linux系统都是原生的.

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

  • +!提到Android缺乏X11.Android可能是最有说服力的反例,"x11是本机linux GUI".证明Linux可以拥有x11或Android,因为它的"本机"GUI向初学者展示了Linux实际上只是一个内核而且并不总是有GUI. (8认同)
  • @gokcehan wayland没有忽略网络透明度,这是一个神话.它没有实现_yet_,就像Wayland中的许多其他东西一样.http://wayland.freedesktop.org/faq.html#heading_toc_j_8 http://blog.martin-graesslin.com/blog/2011/08/thoughts-about-network-trancparency/等 (3认同)
  • Wayland的高级架构图与X的架构图相同,只是X图中的"Compositor"和"Server"在Wayland图中合并.缺乏的是一个合理的解释,为什么这种整合不能用于X. (2认同)

nib*_*bot 23

严格来说,Linux的API包含其系统调用.这些是可以由用户模式(非内核)程序调用的所有内核函数.这是一个非常低级的接口,允许程序执行打开和读取文件等操作.有关一般介绍,请参见http://en.wikipedia.org/wiki/System_call.

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

  • 当问题是"什么是Linux的本机API?"时,我们写了这个答案.(从那时起,"GUI"已插入到问题中). (3认同)

小智 20

为了帮助已经提到的内容,在这个博客上有一个非常好的Linux图形堆栈概述:http://blog.mecheye.net/2012/06/the-linux-graphics-stack/

这解释了X11/Wayland等以及它们如何组合在一起.除了已经提到的内容之外,我认为值得添加一些关于以下用于Linux中图形的API:

Mesa - "Mesa是很多东西,但它提供的主要功能之一就是它的OpenGL实现.它是OpenGL API的开源实现."

开罗 - "cairo是一个绘图库,可以直接用于Firefox等应用程序,也可以通过GTK +等库来绘制矢量形状."

DRM(直接渲染管理器) - 我理解这一点,但它基本上是内核驱动程序,可让您直接将图形写入帧缓冲区而无需通过X


Mar*_*ark 9

我想这个问题更像是"什么是linux的原生GUI API".

在大多数情况下,X(也称为X11)将用于此:http://en.wikipedia.org/wiki/X_Window_System.

您可以在此处找到API文档


Ser*_*kin 5

XWindows可能是最接近可称为"原生"的:)

  • 和x11一样吗? (2认同)
  • 是的.我正是这个意思. (2认同)
  • 但是如果你直接使用它,你会发现它不是一个 GUI api……Linux 只是没有 1 个原生的 GUI api。但是几乎所有这些 GUI API(至少是当今桌面 linux 上常见的那些)都运行在 X 之上。如果你今天开始使用普通的旧 X 编写应用程序,它在任何现代发行版上看起来都完全不合适,所以我会说原生 GUI 依赖于发行版 - gtk/gnome 用于 ubuntu,kde 用于其他。 (2认同)