当前位置: 首页 > article >正文

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@mybkylinV10: /桌面

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等。这些桌面环境也可能支持不通的图形化协议系统。


http://www.kler.cn/a/375523.html

相关文章:

  • 查缺补漏----关于指令执行的题型
  • 大厂面试真题-很多系统会使用netty进行长连接,连接太多会有问题吗
  • LINUX Shell命令中$0、$1-9、$#、$?、$*、$@、$!、$、$-、$IFS含义及举例
  • linux alsa-lib snd_pcm_open函数源码分析(三)
  • 信息隐藏技术概述
  • 【分布式技术】分布式事务深入理解
  • 商品详情API接口系列(json数据示例演示)
  • Lucene的使用方法与Luke工具(2)
  • 基于redis实现延迟队列
  • 【Docker项目实战】使用Docker安装Blossom 笔记应用
  • 【LangChain系列4】【Chain模块详解】
  • 【2025最新整理】ResNet 系列网络的演进及其创新
  • lanqiaoOJ 3255:重新排队 ← STL list 单链表
  • 【贪心算法】(第十三篇)
  • Linux---cp命令
  • 【p2p、分布式,区块链笔记 Torrent】WebTorrent 的lt_donthave插件
  • 软件测试学习笔记丨Flask操作数据库-数据库和表的管理
  • MySQL utf8mb3 和 utf8mb4引发的问题
  • 前端八股文第七篇
  • .net core NPOI以及NOPI mapper
  • HTML的总结作业
  • 简单的kafkaredis学习之kafka
  • 5G(NR)无线协议层二的RLC子层
  • Python 网络爬虫教程:从入门到高级的全面指南
  • 51c~C语言~合集1
  • 界面控件DevExpress JS ASP.NET Core v24.1亮点 - 支持Angular 18