1. GUI图形界面是什么
GUI是graphical user interface的缩写,图形用户接口,实现了基本的WIMP(windows,icons,menus,pointer)。一个GUI的基本组成:display server实现windowing system。参考下图:
 
1.1 windowing system
windowing system:管理不同的display screens的软件。是一种GUI的实现。
下表是常见的windowing system,我主要感兴趣的是Wayland和X Window System。
| 类unix系统 | Windows NT家族系统 | Web | 其他 | 
|---|---|---|---|
| Quartz Compositor(Mac OS X) | DWM(Desktop Window Manager)(微软Vista及之后系统用的视窗系统) | Dojo | MiniGUI | 
| Wayland | ReactOS Explorer | ExtJS | DM | 
| X Window System | Classic Shell | … | VWS | 
| W Window Ssytem | Talisman Desktop | … | |
| … | … | 
1.1.1 display server
windowing system中主要的组成是display server(或者window server,compositor)。任何用来在窗口中显示GUI界面的软件应用,都是该display server的一个client客户端。
display server与client之间的交互协议叫做display server communications protocol。
| display server | 
|---|
| X.Org server(主要是类unix) | 
| Wayland(主要是类unix) | 
| Mir(主要是类unix) | 
| SurfaceFlinger(谷歌安卓) | 
| Quartz Compositor(苹果MacOS) | 
| Desktop Window Manager(微软) | 
1.1.2 display server communications protocols
X11
X.Org server跑在类unix系统kernel之上,用于接收用户数据并处理然后传给其clients,也用于接收clients传来的数据,进行处理影响合成compositing,并将数据传给kernel模块三者之一:DRM,gem,KMS drvier。它是通过将数据写入framebuffer,然后framebuffer中的数据通过GLX传给相关的screen显示。
- GLX:opengl extension to the X window system。是OpenGL与X Window System之间的连接桥梁。
X.Org是一种X Window System实现,但其实现还依赖于另一个软件compositing window manager来做影响合成,比如Mutter和KWin,实现X11客户端库可以依赖于Xlib和XCB。
下图是X.Org server与X clients(比如Amarok)通过X11协议来通信交互。
 
通常,X、X11、X Window System的说法可以混为一谈,都代表一种windowing system,那就是X11系统,而X.Org是X Window System中display server的一种实现,通常也叫它X Server。

GLX
GLX(OpenGL Extension to the X Window System)是指OpenGL在X Window System上的扩展,它允许OpenGL程序与X Window System进行交互,并在X Window System中显示图形。GLX最初是由SGI(Silicon Graphics International)开发的,后来成为了OpenGL的标准扩展之一。目前,GLX已经成为了Linux和Unix系统中OpenGL标准的一部分,提供了一种可靠且高效的图形编程方式。
GLX最初的实现是GLX API,叫GLcore,是在X系统中加载了一个mesa渲染器来渲染opengl命令。
随着DRI(direct rendering infrastructure)发展,可以通过direct render方式来加速opengl命令。后来又有DRI2(通过KMS,kernel mode-setting内核模块)替换了DRI。再后来,linux kernel3.12出现render node直接渲染。
下图是通过DRM(direct rendering manager)直接访问到显卡来做处理。
 
早期通过DRM API,是通过DRM设备/dev/dri/cardX来处理的,后来kernel中合入了render node,/dev/dri/renderDX。
linux kernel3.12开始render node被合入。wayland是通过EGL来direct rendering。
 
wayland
wayland也是一种display server。同X11类似,wayland也需要依赖wayland compositors,比如Weston、mutter、KWin等。
Wayland compositors与Wayland Clients之间交互协议是Wayland display server protocol。该协议定义client可以通过EGL rendering API来直接访问framebuffer。

1.2 window manager
什么是window manager?GUI中,在window system中,负责控制视窗位置、外表等的系统软件。大部分window manager具备提供desktop环境的能力。
Gnome、Xfce、KDE都是window manager,不过它们都是工作在X display server上,所以又都是X window manager。
| window manager | 描述 | 实例 | 
|---|---|---|
| X window manager | 使用X window system | GNOME、KDE、Xfce | 
| Microsoft windoes | 微软从windows2.0开始就提供了集成window manger | |
| ChromeOS | Ash | 
1.2.1 gnome/kde desktops
GNOME,KDE和Xfce desktops是Linux环境下的desktop。display server比如X11只提供基本的绘画能力,然后client通过Xlib和XCB等库来作用X11,具备了不同的视觉能力。
如何开发一个GUI?,通过widget toolkits,比如GTK和Qt。
| 开发套件 | 窗口管理器 | 
|---|---|
| GTK | GNOME,Xfce | 
| Qt | KDE | 
1.2.2 display manager
不同的desktop可能使用不同的display manager(更准确的应该叫做graphical login manager,图形登录系统)。
| window manager | display manager | 
|---|---|
| GNOME | gdm3 | 
| Xfce | lightdm | 
| KDE | kdm,sddm | 
| LXDE | LXDM | 
display manager提供在X server上(或远程)启动一个session会话的功能。
下图示意了基本的框架理解
 
【参考文档】
-  https://en.wikipedia.org/wiki/Windowing_system#List_of_windowing_systems 
-  https://unix.stackexchange.com/questions/345344/difference-between-xorg-and-gnome-kde-xfce 



















