一篇对Windowing System说的比较清楚的回答,对理解Android SurfaceFlinger、理解OpenGL也有帮助。
https://unix.stackexchange.com/questions/345344/difference-between-xorg-and-gnome-kde-xfce
Question
Unix操作系统中的X是控制UI显示的标准应用,为什么同时还存在Gnome/KDE,它们和X的关系是什么?
Answer
每个操作系统都提供了一个Display Server,标准的Display Server包括:
- Unix下的X11
- Android中的SurfaceFlinger
- MacOS中的Quartz Compositor
- Windows中的Desktop Window Manager
X、X11和X Window System都是指的同一个Windowing System,其核心是一个Display Server,在不同的操作系统中,Display Server也会被称作Window Server、Compositor等。
一个需要显示GUI的应用程序是Display Server的Client,一个Client往往对应着Display Server管理的一个或多个Window(Android上则是Layer)。Display Server和Client之间通过某种通信协议相互通信,Display Server的角色是Client和用户之间的中间人。具体来说,DisplayServer负责:
- 接收用户输入,包括键盘、鼠标、触摸屏等,将输入转发给合适的Client处理;
- 接收Client的渲染结果,将其显示在显示设备上;
- 通信协议可以支持网络通信;
X仅提供了基本的窗口管理能力:允许在显示设备上移动窗口、支持窗口和Client的鼠标键盘交互。至于窗口显示的内容,UI界面的样式,并不是X关心的内容,X为Client提供画布,以及允许Client接收用户在画布上的交互,但X并没有提供具体的绘制方案。具体要在画布上绘制是由Client自行决定的,不同的Unix发行版使用了不同的库来绘制操作系统界面,其中Gnome是基于GTK+的,KDE是基于Qt的。
Gnome和KDE是一整套具体的GUI应用程序,GTK+和Qt是GUI应用基础框架,以Qt为例,它负责和操作系统的Display Server进行通信,创建画布,并提供在画布上绘制UI控件的具体方案,同时还将不同操作系统的事件交互逻辑统一,让应用程序只要按照Qt提供的API开发应用,即可正确的运行在不同的操作系统上。