linux图形化X窗口

【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窗口事件过程】

  1. 用户输入鼠标
  2. X服务器接收鼠标事件,转换成X事件
  3. 事件传递,将事件传给窗口管理器(如果是窗口布局相关的需要窗口管理器介入处理)
  4. 窗口管理器处理事件,分发给对应程序处理移动,缩放等事件(如果是窗口内部事件如按钮点击,则直接由X服务器分发,如果是窗口自身布局相关则窗口管理器处理后二次分发)
  5. 应用程序响应,执行事件处理动作,提交窗口管理器(如果非窗口管理器布局相关事件则直接到提交X服务器)
  6. 窗口管理器转换为绘图请求,提交X服务器
  7. X服务器绘制,刷新显示器输出,完成绘制

【X窗口创建过程】

  1. 应用程序使用XCB接口创建窗口(即向X服务器发送一个创建请求),X服务器维护窗口对象
  2. 应用程序调用Xcb接口映射窗口(像X服务器发送映射请求),X服务器通知窗口管理器窗口的创建
  3. 窗口管理器监听X服务器的窗户事件、应用程序监听窗口内部事件
  4. 窗口管理器分发事件,接收请求、或应用程序直接处理事件

【系统托盘】

以上,可以看到窗口本身和托盘弹窗没关系。桌面显示只关心窗口的显示,而弹窗相当于桌面上一个弹窗程序和其他程序的通信。在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等。这些桌面环境也可能支持不通的图形化协议系统。

相关推荐
Yana.nice41 分钟前
openssl将证书从p7b转换为crt格式
java·linux
AI逐月1 小时前
tmux 常用命令总结:从入门到稳定使用的一篇实战博客
linux·服务器·ssh·php
小白跃升坊1 小时前
基于1Panel的AI运维
linux·运维·人工智能·ai大模型·教学·ai agent
跃渊Yuey2 小时前
【Linux】线程同步与互斥
linux·笔记
舰长1152 小时前
linux 实现文件共享的实现方式比较
linux·服务器·网络
zmjjdank1ng2 小时前
Linux 输出重定向
linux·运维
路由侠内网穿透.2 小时前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居
VekiSon2 小时前
Linux内核驱动——基础概念与开发环境搭建
linux·运维·服务器·c语言·arm开发
zl_dfq3 小时前
Linux 之 【进程信号】(signal、kill、raise、abort、alarm、Core Dump核心转储机制)
linux
Ankie Wan3 小时前
cgroup(Control Group)是 Linux 内核提供的一种机制,用来“控制、限制、隔离、统计”进程对系统资源的使用。
linux·容器·cgroup·lxc