【linux图形化协议框架】
X、X11系统:X协议,X服务器,窗口管理器,X客户端(客户端库Xcb,Xlib库等),输入、绘制
Wayland系统:Wayland 协议,合成器、客户端(libwayland-client、libwayland-cursor)
以上,已经看到存在2种多个不通版本的图形化系统,为了保障桌面环境和应用程序的一致性、互操作性、兼容性等,这里都得(或部分)遵循XDG标准。
通过环境变量,查看桌面环境后端的图形化系统,如下。展示为x11代表桌面环境后端图形系统是x11系统,如果是tty则是非图形化(比如麒麟服务器vncserver远程后之前提权弹窗问题就是由于窗口的环境变量不标准,在图形化环境种xdg指定为了tty,而非x11),.desktop桌面程序菜单展示的标准即出自该标准,窗口任务栏,系统托盘标准也都是在XDG标准约定。
myb@myb-kylinV10:~/桌面$ echo X D G S E S S I O N T Y P E x 11 m y b @ m y b − k y l i n V 10 : / 桌面 XDG_SESSION_TYPE x11 myb@myb-kylinV10:~/桌面 XDGSESSIONTYPEx11myb@myb−kylinV10: /桌面
gtk和qt都提供了对以上图形化系统的支持。
图形化系统这块核心的服务器、合成器需要硬件驱动支持。ubuntu
以下说明围绕的是X窗口。
【X服务器与显示】
绘图显示,处理鼠标键盘输入转换成基本的事件(该事件需要进一步传递给窗口管理器处理)
Xorg X窗口图形服务器,与X客户端通过X协议进行通信,同时提供硬件交互。QT依赖的xcb就是一个客户端的C实现库。
在linux上图形窗口可通过QT,gtk。这两个实现都是基于xcb(或xlib)接口与X服务器进行通信,实现窗口界面相关功能。
【X客户端】
窗口管理器,应用程序UI都是X客户端。通过X协议(X11协议、Wayland协议或框架规范)与X服务器交互。
名字,任意UI程序。
【X桌面应用】
桌面应用基于X协议进行桌面开发,X协议实现如Xcb,Xlib,包括QT底层默认用Xcb。
所以开发桌面应用可以用最基础的Xcb库,封装后的gtk库,封装后的Qt库。
【X窗口管理器】
窗口布局与管理(如位置,大小层叠顺序等装饰器行为)、监听X服务器的需要窗口管理器处理的事件并处理
装饰器(基本的窗口最大化,最小化,移动,边框,标题栏,主体样式,焦点,布局),窗口管理器提供所有窗口的管理操作(统一的风格样式和统一的窗口功能),窗口管理器和普通UI一样也是一个X客户端。而窗口事件分身是X服务器直接分发的。窗口自身的事件由X服务器直接分发,而窗口作为一个整体在系统内部则需要窗口管理器处理,比如一个窗口最小化了自己,那就需要窗口管理器处理让其后的窗口能够展示出来。
名字如KWM,Mutter
【X窗口事件过程】
- 用户输入鼠标
- X服务器接收鼠标事件,转换成X事件
- 事件传递,将事件传给窗口管理器(如果是窗口布局相关的需要窗口管理器介入处理)
- 窗口管理器处理事件,分发给对应程序处理移动,缩放等事件(如果是窗口内部事件如按钮点击,则直接由X服务器分发,如果是窗口自身布局相关则窗口管理器处理后二次分发)
- 应用程序响应,执行事件处理动作,提交窗口管理器(如果非窗口管理器布局相关事件则直接到提交X服务器)
- 窗口管理器转换为绘图请求,提交X服务器
- X服务器绘制,刷新显示器输出,完成绘制
【X窗口创建过程】
- 应用程序使用XCB接口创建窗口(即向X服务器发送一个创建请求),X服务器维护窗口对象
- 应用程序调用Xcb接口映射窗口(像X服务器发送映射请求),X服务器通知窗口管理器窗口的创建
- 窗口管理器监听X服务器的窗户事件、应用程序监听窗口内部事件
- 窗口管理器分发事件,接收请求、或应用程序直接处理事件
【系统托盘】
以上,可以看到窗口本身和托盘弹窗没关系。桌面显示只关心窗口的显示,而弹窗相当于桌面上一个弹窗程序和其他程序的通信。在linux托盘弹窗定义在不通桌面环境的标准中。一般基于dbus进行通信。
系统托盘自身有标准协议,是桌面组件之一,提供图标展示。
系统托盘通常遵循特定的标准协议,例如System Tray Protocol(也称为Systray Protocol)或者更新的StatusNotifierItem规范,这使得不同的应用程序能够以一致的方式与系统托盘交互
早期gtk2和gtk3提供了GtkStatusIcon托盘操作,gtk4废弃,要实现gtk可采用三方库如libappindicator,或gnome桌面环境可采用其Adwaita库。其他如qt实现了托盘的功能对接,提供QSystemTrayIcon支持多种桌面环境(实际围绕2类图形化系统标准X或wayland)的兼容。
所以要实现这个需要和标准组件接口进行对接。当前可选的:
gtk、qt、gnome下Adwaita,三方库libappindicator(基于gtk,跨桌面环境,兼容性多种桌面环境)
【桌面组件与环境】
如资源管理器,任务管理器,开始菜单,桌面面板,系统托盘等都是桌面的UI组件,这些组件都是独立的X客户端,组件间通过dbus服务进行通信,共同组成了桌面环境。诸如,GNOME,KDE,XFCE等。这些桌面环境也可能支持不通的图形化协议系统。