这一切都非常模块化和灵活;然而,这会导致复杂性。
“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 的库,它具有所有这些简单服务的标准接口。任何想要使用 X 服务器显示的程序最终都会使用这个客户端库,称为 X 客户端。Xlib 知道如何连接到任意 X 服务器——在本地机器上,或者通过 LAN 上的 TCP/IP,或者跨越世界——来调用这些服务。
窗口管理器,它只是另一个 X 客户端程序,负责桌面的“观感”——如何移动和排列窗口等。因为窗口管理器绘制了所有的窗口装饰,它可以使桌面看起来像 WindowsXP、Mac 或 NeXTSTEP。
X 的部分哲学是定义“机制而不是政策”——意思是,他们给你工具来做这件事,但不告诉你如何使用这些工具。一种这样的工具是窗口管理器,可以随意更换。
许多现代 X 应用程序都是为使用桌面环境而编写的,例如 Gnome 或 KDE。这为这些程序提供了一组一致的按钮和控件来绘制,并为一些传统上不包含在 X 中的东西提供了一致的界面,但通常被认为是桌面的一部分 - 例如如何响应拖放或如何呈现标准文件选择器对话框。
桌面环境通常提供一个对象模型或编程接口,负责处理所有简单的 X 客户端请求并让程序处理更重要的事情。删除这些低级调用会产生另一个重要的好处——平台独立性。
许多桌面环境都包含一个窗口管理器,因此窗口控件和按钮的外观和感觉是一致的,并且可以与环境提供的桌面隐喻配合使用。但是,它通常仍然可以关闭。
X 服务器(运行显示)和 X 客户端(想要使用显示)的分离有一些含义:
图形系统与 GUI 程序是分开的,它们完全分开,就像 web 浏览器和 web 服务器一样。
因此,GUI 程序可能不会显示在本地机器上——就像 Web 浏览器不必指向本地机器上的 Web 服务器一样。
一台机器可以只运行客户端,而 X 服务器在其他地方。
带有显示器的机器不必运行客户端——它可以只运行 X 服务器,所有客户端都可以在专用机器上运行。这是最初的瘦客户端:大型中央服务器上运行的大型程序 - 图形用户交互由用户面前办公桌上的专用硬件处理。
你需要知道你的 X 服务器的网络地址是什么,这样你才能告诉 GUI 程序在哪里显示它们的 GUI。(这通常通过设置 DISPLAY 环境变量来完成)
您可以同时在同一个桌面上显示来自许多不同机器的许多程序。这一切都是无缝处理的,包括剪切和粘贴。