linux - X11/X - linux 桌面软件,我不明白它是如何组合在一起的

标签 linux x11

我最近开始使用 Linux(我工作的地方是 Microsoft 商店,所以我只用 C# 编写代码,使用 MS 产品等)。

我试图从较高的层次理解 Linux 中的一些基本内容是如何联系在一起的。 我一直在阅读 www.linfo.org

无论如何,我一直不太明白 X 是什么。

来自阅读this article在我看来,X 是位于操作系统之上的层(一个 X 服务器位于操作系统之上??),X 客户端应用程序向 X 服务器发出请求。 我认为 KDE、Xfce 和 Gnome 是显示管理器,那么它们是 X 服务器客户端吗?

我对所有内容都感到很困惑。

任何解释将不胜感激!

最佳答案

这一切都非常模块化和灵活;然而,这会导致复杂性。

“X 服务器”驱动显示设备。它为客户端提供图形服务,这些服务非常简单——例如:

"Give me a window frame to draw in"

"Put this bitmap here"

"Draw a horizontal black line 100px wide"

"Render the text 'hello' at (100,100)"

"Tell me if any mouse clicks or key presses have been aimed at my window frame"

X 提供了一个名为 Xlib 的库,它具有用于所有这些简单服务的标准接口(interface)。任何想要使用 X 服务器显示的程序最终都会使用这个客户端库,它被称为 X 客户端。 Xlib 知道如何连接到任意 X 服务器 - 在本地机器上,或通过 LAN 上的 TCP/IP,或在世界各地 - 以调用这些服务。

窗口管理器,它只是另一个 X 客户端程序,负责桌面的“外观和感觉”——你如何移动和排列窗口等。因为窗口管理器绘制了所有的窗口装饰,它可以使桌面看起来像 WindowsXP、Mac 或 NeXTSTEP。

X 的部分哲学是定义“机制而不是策略”——意思是,它们为您提供执行此操作的工具,但不告诉您如何使用这些工具。一种这样的工具是窗口管理器,它可以随意更换。

许多现代 X 应用程序都是为使用桌面环境(例如 Gnome 或 KDE)而编写的。这为这些程序提供了一组一致的按钮和控件来绘制,以及一些传统上不包含在 X 中但通常被认为是桌面一部分的东西的一致界面——例如如何响应拖放或如何呈现一个标准的文件选择器对话框。

桌面环境通常提供一个对象模型或编程接口(interface)来处理所有简单的 X 客户端请求并让程序处理更重要的事情。删除这些低级调用会产生另一个重要的好处 - 平台独立性。

许多桌面环境包含一个窗口管理器,因此窗口控件和按钮的外观和感觉是一致的,并与环境提供的桌面隐喻一起工作。但是,它通常仍然可以关闭。

X 服务器(运行显示)和 X 客户端(想要使用显示)的分离有一些含义:

  • 图形系统与 GUI 程序是分开的,它们的分离程度与 Web 浏览器和 Web 服务器的分离程度差不多。

  • 因此 GUI 程序可能不会在本地计算机上显示 - 就像网络浏览器不必指向本地计算机上的网络服务器一样。

  • 一台机器可以只运行客户端,在别处运行 X 服务器。

  • 带有显示器的机器不必运行客户端 - 它可以只运行 X 服务器,所有客户端都可以在专用机器上运行。这是原始的瘦客户端:大型中央服务器上运行的大型程序 - 图形用户交互由用户面前桌面上的专用硬件处理。

  • 您需要知道您的 X 服务器的网络地址是什么,这样您才能告诉 GUI 程序在哪里显示它们的 GUI。 (这通常通过设置 DISPLAY 环境变量来完成)

  • 您可以同时在同一个桌面上显示来自许多不同机器的许多程序。所有这些都是无缝处理的,包括剪切和粘贴。

关于linux - X11/X - linux 桌面软件,我不明白它是如何组合在一起的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/636316/

相关文章:

linux - GLX 视觉和 FBconfig 之间有什么区别?

python - 安装 matplotlib 时出错

linux - 在 bash 中替换太多的 if 语句

php - 上传文件上的 Finfo_file 以确定 mime 类型

c++ - 如果窗口存在,我如何 checkin xlib?

docker - 在没有 "--net host"的情况下,在通过 SSH 连接的服务器上可靠地在 Docker 容器中运行 X 应用程序

javascript - 从 web 浏览器提升 X11 紧急标志

linux - 如何通过 linux 代理在 docker 容器中转发 eclipse?

linux - 如何在 64 位 Linux 上从 32 位 Wine 执行 shell 脚本?

linux - 从多台机器收集文件?