然而,我们从未提及 X 服务器如何处理客户端屏幕显示区域(称为窗口)的操作。对于任何使用过 GUI 的人来说,很明显你需要控制“客户端窗口”。通常你可以移动和排列它们;改变大小,最大化或最小化窗口。那么,X 服务器如何处理这些任务呢?答案是:它不处理。
X 的基本原则之一是“我们提供机制,但不提供策略”。因此,尽管 X 服务器为窗口操作提供了一种方式(机制),但它实际上并没有规定这种操作应该如何表现(策略)。
所有这些机制/策略的奇怪之处基本上归结为:管理屏幕空间是另一个程序的责任。这个程序决定窗口放置的位置,为用户提供控制窗口外观、位置和大小的机制,并且通常提供“装饰”,例如窗口标题、边框和按钮,这些装饰让我们能够控制窗口本身。这个管理窗口的程序被称为(猜猜看!)“窗口管理器”。
“X 中的窗口管理器只是另一个客户端——它不是 X 窗口系统的一部分,尽管它享有特殊的权限——因此没有单一的窗口管理器;相反,有很多,它们支持用户与窗口交互的不同方式以及窗口布局、装饰以及键盘和颜色映射焦点的不同风格。”
X 架构提供了窗口管理器对窗口执行所有这些操作的方法;但它实际上并没有提供窗口管理器。
当然,有很多窗口管理器,因为窗口管理器是一个外部组件,所以根据你的偏好编写一个(相对)容易,比如你希望窗口看起来如何,你希望它们如何表现,你希望它们在哪里等等。一些窗口管理器很简单而且丑陋 (twm);一些很花哨,包含了除厨房水槽之外的一切 (enlightenment);以及介于两者之间的一切;fvwm、amiwm、icewm、windowmaker、afterstep、sawfish、kwm 以及无数其他的窗口管理器。总有一款窗口管理器适合你的口味。
窗口管理器是一个“元客户端”,其最基本的任务是管理其他客户端。大多数窗口管理器提供一些额外的功能(有些提供很多)。然而,似乎大多数窗口管理器都存在的一项功能是启动应用程序的方式。它们中的一些提供了一个命令框,你可以在其中键入标准命令(然后可以用来启动客户端应用程序)。另一些则有一个不错的应用程序启动菜单。然而,这没有标准化;同样,由于 X 没有规定如何启动客户端应用程序的策略,因此此功能需要在客户端程序中实现。虽然通常窗口管理器承担了这项任务(并且每个窗口管理器的实现方式都不同),但可以想象有客户端应用程序的唯一任务是启动其他客户端应用程序;想想程序启动面板。当然,人们已经编写了大量的“程序启动”应用程序。