【问题标题】:What is Linux’s native GUI API?什么是 Linux 的原生 GUI API?
【发布时间】:2012-09-24 21:23:32
【问题描述】:

Windows (Win32 API) 和 OS X (Cocoa) 都有自己的 API 来处理窗口、事件和其他操作系统内容。关于 Linux 的等价物是什么,我从来没有真正得到过明确的答案?

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

【问题讨论】:

  • Joni 是正确的:“在 Linux 中,图形用户界面不是操作系统的一部分……X Window System 为 [GUI 功能] 定义了一个网络协议。工具包库,如 Gtk+(使用由 Gnome)和 QT(由 KDE 使用)构建在 Xlib 之上。”
  • 相反,大卫,这是一个很好的调查
  • 我同意 - 我已经阅读了关于内核和 API 的两本圣经“Linux 编程 API”和“系统编程... Unix”,但我从未想过这个问题 :)答案很有趣。
  • Win32 API 也是跨平台的,如果你包含 Wine..
  • BTW Windows 有 WIN32/WIN64 子系统,它们在“Windows 外观 - 也就是 WIN32”等方面实现了很多相同的功能。这些子系统在 NT 内核之上运行。这些 API 是不同的。例如 C: 是 WIN32 的抽象,而不是 NT 内核的东西。某些窗口功能也是如此。 Windows 也有可用的 Unix 子系统(在某种程度上支持 X11)。

标签: c++ c linux user-interface


【解决方案1】:

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

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

使用构建在 Xlib 之上的工具包库,例如 GTK+(由 GNOME 使用)和 Qt(由 KDE 使用),因为它们更易于编程。例如,它们为您提供跨应用程序的一致外观和感觉,使拖放更容易使用,为现代桌面环境提供标准组件等等。

X 如何在内部绘制屏幕取决于实现。 X.org 有一个设备独立部分和一个设备相关部分。前者管理windows等屏幕资源,后者与显卡驱动通信,通常是内核模块。通信可能通过direct memory access 或通过system calls 与内核进行。驱动程序将命令翻译成卡上的硬件可以理解的形式。

从 2013 年开始,一个名为 Wayland 的新窗口系统开始可用,许多发行版都表示他们将在某个时候迁移到它,尽管仍然没有明确的时间表。该系统基于OpenGL/ES API,这意味着未来的OpenGL将成为Linux中的“原生GUI API”。将 GTK+ 和 QT 移植到 Wayland 的工作正在进行中,因此当前流行的应用程序和桌面系统将需要进行最小的更改。无法移植的应用程序将通过 X11 服务器得到支持,就像 OS X 通过 Xquartz 支持 X11 应用程序一样。 GTK+ 端口是expected to be finished within a year,而Qt 5 已经拥有完整的Wayland 支持。

更复杂的是,Ubuntu 宣布他们正在开发一个名为Mir 的新系统,因为他们认为 Wayland 存在问题。这个窗口系统也是基于 OpenGL/ES API。

【讨论】:

  • Windows 最初也只是一个运行在 DOS 之上的程序。
  • +1 @DavidHammen 我不确定这是否针对我,但你是 100% 正确的。我的术语并不完全准确。我应该说的是,它不是一个完整的操作系统,就像您通常认为的具有所有附加组件使其易于使用的操作系统,而是一个来自不同的供应商等。
  • @ChrisThompson - 嗯......也许我太老了,但我从来没有想过将 GUI 作为操作系统的核心部分。而且我从来没有想过没有 GUI 的操作系统只是“来自不同供应商的组件的集合体,等等”。但是,自从我对操作系统的构成形成了自己的看法后,也许事情已经发生了变化:)
  • @GeorgeHawkins 我没有做好解释工作。 GUI 绝对不是操作系统的核心部分,坦率地说,UI 也不是。当您查看 Ubuntu Linux 时,大多数人通常认为整个软件映像作为操作系统,包括安装时存在的每个功能。这包括 GNOME、Linux 内核、bash、X11 服务器、各种软件库(libc、pthread 等)等等,它们都可能来自不同的供应商。我不确定这是否有意义,但这就是我想要表达的想法。
  • 除非答案是社区 wiki,否则我不会更改任何内容,除了改进语法/格式或添加链接。如果内容需要更正或更新,那是其声誉与内容绑定的人的责任。不过,我会帮助他们发表评论,以便他们意识到我认为需要更正或更新某些内容。
【解决方案2】:

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

【讨论】:

  • 它们建立在它之上。 X11 是服务器,而 KDE、Gnome 等是桌面管理器,提供更高级别的 API、常见的窗口布局等。
  • X11 是实际的低层层,它处理所有这些东西并处理在屏幕上的绘制等(并与图形驱动程序通信)。 Gnome/KDE 然后控制 X11。这是关于它的高级别的,忽略了十亿零一个细节。
  • 谢谢。还有一个问题:维基百科解释说 X11“创建了一个硬件抽象层,在其中编写软件以使用一组通用的命令,允许设备独立性和在任何实现 X 的计算机上重用程序。”我的问题是:为什么 X11 提供硬件交互 (HAL),Linux 内核是否应该提供它并且 X11 在内核之上运行?换句话说,为什么 X11 应该在 Kernel 作为其代理的情况下访问硬件设备?
  • 认为 在这种情况下,HAL 是一个错误使用的术语。他们真正的意思是 X11 提供了一种独立于系统的方式来显示窗口。有适用于 Darwin 的 X11 版本(Mac OS - 现在使用 Mountain Lion 实际上更复杂......)、MS Windows 和 Linux。
  • X11 是一种网络协议。抽象涉及在平台 A 上编写程序,这些程序可以通过一些网络设备在平台 B 上显示 X11 客户端(窗口、应用程序等)。您的应用程序可以在本地、远程、嵌套服务器、仅执行 VNC 的虚拟服务器等中运行。硬件抽象(在本地平台上)是此功能的副作用,但它也模糊了 X11 和内核(这是一般 Unix 系统上的硬件抽象)。
【解决方案3】:

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

另请注意,Android 和其他一些移动操作系统虽然有 Linux 内核,但不包含 X11,因此从这个意义上说,X11 并不是所有 Linux 系统都原生的。

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

【讨论】:

  • Wayland 的高层架构图与 X 相同,只是 X 图中的“Compositor”和“Server”在 Wayland 图中合并。缺少的是一个合理的解释,为什么这种集成不能用于 X。
  • 好吧,我想说要改变一个 20 多年历史的代码库的基本设计并不容易。另请注意,X11 的另一个问题是它的大部分功能,例如字体渲染,现在都没有使用。此外,服务器和超级计算机仍然需要 X11,网络透明性太好了,不能放弃。
  • @gokcehan wayland 并没有忽略网络透明度,这是一个神话。它还没有实现,就像 Wayland 中的许多其他东西一样。 wayland.freedesktop.org/faq.html#heading_toc_j_8blog.martin-graesslin.com/blog/2011/08/…
  • +!提到Android缺乏X11。对于“x11 是原生 linux GUI”这一论点,Android 可能是最有说服力的反例。证明 Linux 可以拥有 x11 或 Android,因为它是“本机”GUI,向初学者表明 Linux 实际上只是一个内核,并不总是有 GUI。
  • “跨平台与原生无关”是一个很好的观点。在我多年移植跨平台的过程中,我经常使用这种模式。最值得注意的是,在 90 年代,我出售了一个框架,它允许您在底层使用 MFC 交叉编译编写到 Metrowerks PowerPlant 框架的代码。 (在任何人嘲笑之前,一旦你低于宏,MFC 是相当合理的。)我也有多个移植工作,其中 Win32 或 Mac 工具箱 API 是我们编译的规范,并在其他平台上根据需要重新实现.
【解决方案4】:

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

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

【讨论】:

  • 这个答案是在问题是“什么是 linux 的原生 API?”时写的。 (从那时起,“GUI”已被插入问题中)。
  • 对于现在这个不连贯的问题,这仍然是正确的答案,因为在 Linux 之上的任何系统,包括 GNU 和 X11,都不是“原生”的有意义的意义。
【解决方案5】:

为了帮助已经提到的内容,此博客对 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 (Direct Rendering Manager) - 我对此了解最少,但它基本上是内核驱动程序,可让您直接将图形写入帧缓冲区而无需通过 X

【讨论】:

【解决方案6】:

我想这个问题更像是“什么是 linux 的原生 GUI API”。

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

你可以找到API文档here

【讨论】:

    【解决方案7】:

    XWindows 可能是最接近“原生”的东西了 :)

    【讨论】:

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

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

    【讨论】:

    • libc(C 标准库)是操作系统系统调用的接口。 Linux 上的后者(操作系统系统调用)大致转换为 Windows 上的 Win32。如果在某种程度上不使用 Win32 API,你就不能真正(或根本?)为当前版本的 Windows 编程,但是你可以在不使用各自编译器的标准 C 库的情况下为 Windows 和 Linux 编程,只需复制直接 -到系统调用代码。不推荐这样做,它会使您的代码完全无法移植到其他操作系统,但可以这样做。
    • UI 不是 libc 的一部分——只要您不认为 printf/scanf 之类的东西是 UI ...... libc 只是 C 标准库。它也不是操作系统系统调用的真正接口。它提供文件 i/o、内存管理、字符串处理等功能,并在内部使用系统调用。要自己进行像ioctl 这样的系统调用,您必须包含来自sys/ 的内容。
    • 问题并不总是指定“GUI”。
    • 也许你说的是Xlib而不是libc
    【解决方案9】:

    Linux 内核图形操作在 /include/linux/fb.h 中作为 struct fb_ops。最终,这就是 X11、Wayland 或 DRM 等附加组件所引用的内容。由于这些操作仅适用于视频卡,而不是矢量或光栅硬拷贝或面向 tty 的终端设备,因此它们作为 GUI 的有用性是有限的;如果您不介意在必要时使用一些汇编程序绕过系统调用,那么您需要这些附加组件来获得图形输出并不完全正确。

    【讨论】:

      【解决方案10】:

      GUI 是一种高级别的功能抽象,因此从 XOrg 服务器到 OpenGL 的几乎所有东西都是跨平台移植的,包括 Windows 平台。但是,如果您所说的 GUI API 是指 *nix 图形 API,那么您可能会在“直接渲染基础设施”周围徘徊。

      【讨论】:

        【解决方案11】:

        韦兰

        您可能听说过,wayland 是当今许多发行版的特色选择,因为它的协议比 X 更简单。

        Wayland 工具包

        wayland suggests 的工具包或 gui 库是:

        • QT 5
        • GTK+
        • 迷幻剂
        • 杂乱无章
        • 英语

        【讨论】:

          猜你喜欢
          • 2013-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-03
          • 2018-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多