X 窗口系统的一个特性:窗口一路到底
从 X11 到 Microsoft Windows 再到经典 Mac OS,图形用户界面长期以来都把几乎每个屏幕元素——按钮、文本框、标题栏——视为某种“窗口”或视图,每个元素都有自己的坐标、事件和绘制上下文。评论者比较了不同系统如何实现这种层级(原生与“无窗口”控件、客户端与服务端装饰、全局句柄限制、输入抓取),以及这些选择如何影响性能、皮肤化、远程显示和可访问性。整体主题是,这种“窗口一路到底”的模型既在历史上很常见,也在概念上很优雅,但随着 UI 变得更丰富、更复杂,它也不得不演化,或者在某些方面被部分放弃。
窗口作为通用原语
- 许多 GUI 系统都把“万物皆窗口/视图”:X、Microsoft Windows(HWND)、GTK、Qt、经典 Smalltalk 视图,以及在某种程度上经典 Mac(窗口加上更轻量的控件)。
- 开发者指出,这在实现 GUI 时往往会“自然而然地出现”:一切都有位置、边界、绘制和子项,所以“窗口一路到底”是一种常见架构,并非 X 独有。
- 也有人主张把概念分开(例如窗口与控件),即使它们共享实现,这样能让心智模型更清晰。
性能、资源与无窗口控件
- 早期系统使用许多真实窗口来实现控件,并没有明显的性能问题,但会遇到资源限制(16 位 GDI/USER 堆、句柄数量上限)。
- 随着 UI 变得更丰富(浏览器、带皮肤的应用、透明效果、复杂成像),每个控件都用窗口变得过于沉重;这推动了“无窗口控件”和 Qt 的 “alien widgets”。
- 即使是现代工具包,如 Qt,基于大量 QWidget 的列表也会变慢;对列表项采用自定义绘制加事件处理,扩展性更好。
- 在 Windows 上,GDI 过去会直接绘制到 VRAM;而随着 Desktop Window Manager 的引入,窗口现在以合成后的纹理形式存在,这更接近 X 现代合成的故事。
客户区与非客户区,以及装饰
- 经典 Windows 区分客户区和非客户区(标题栏、边框、按钮),各自有独立消息;应用通常让默认行为处理非客户区。
- OS/2 Presentation Manager 把一切,包括客户区,都当作子窗口来处理,简化了模型,但可能以速度为代价。
- 非客户区处理有助于即使应用忙碌或卡死时,窗口移动/关闭仍保持响应;有人将其与 Linux/Wayland 上的客户端装饰作比较,认为后者在应用冻结时更难管理。
- 关于客户端装饰仍有持续争议:有些人重视通过服务端边框获得一致性;另一些人指出,为 CSD 设计的应用(例如某些 Linux 应用)那样看起来更好。
X 客户端/服务端模型与术语
- 有几条评论为 X 的“server”是显示系统、“clients”是应用的说法辩护:这类似于文件/打印/数据库服务器对资源访问进行中介。
- 之所以产生混淆,主要来自 1990 年代“客户端-服务器计算”的营销,以及以用户为中心的心智模型,即“我的本地机器是客户端”。
- 人们强调,一旦解释清楚,X 的术语就符合网络常规。
输入捕获与交互怪癖
- XGrabPointer/XGrabKeyboard 会将事件路由到特定窗口,而不管指针焦点在哪里,从而支持级联菜单和稳健的拖拽行为等功能。
- 其他地方也有类似机制(例如 Windows 上的鼠标捕获);如果没有它们,跨窗口边界的拖拽就会出问题。
- 滚轮行为在不同系统和时代差异很大:有些系统总是滚动光标下方的窗口,另一些历史上需要显式焦点;Windows 直到较晚才加入“滚动非活动窗口”。
嵌入窗口与组合
- XEmbed 利用“万物皆窗口”,使一个应用可以把另一个应用的窗口设为父窗口(例如标签式容器、可嵌入浏览器、音频插件)。
- Win32 技术上可以在进程之间重新设定顶层窗口的父子关系,但会遇到性能和复杂性问题(线程/上下文切换、输入队列)。
- 一些现代组件(例如进程外 web 视图)通过更复杂的管线模糊了这条边界;它如何映射到 Wayland,被认为并不明确。
皮肤、主题与 UI 一致性
- Windows 原生控件很难做皮肤化,这促使了自绘 UI 和第三方皮肤库,尤其是在 XP 时代前后。
- 这带来了大量“像 XP 但不对”的 UI:视觉上模仿系统主题,但在行为或度量上并不忠实。
- 在经典 Mac 上,非原生程度很高的 UI 也存在,但通常不受用户欢迎,被视为例外而非常态。
- 让应用自由绘制一切,与保持统一、可访问的桌面外观和行为之间存在张力。
历史工具包与怀旧
- X 被记忆为在其时代很优雅,尤其是网络透明性方面,但早期工具包(例如 Motif)使用起来很痛苦。
- 较新的工具包如 GTK 和 Tk 被认为更易上手;也有人怀念 XView 那种大量使用可变参数的 C API。
- 有几条评论指出,“许多小窗口”的风格,如今对现代开发者来说相对冷门,尽管其底层思想仍存在于 DOM 和 MVC 风格的视图层级中。