探索X窗口系统(窗口探测工具)
ahcoder 2025-05-05 13:35 1 浏览
在之前的分享中,我们提到Linux下主流的窗口系统是X窗口系统X Window System(以下:简称X)。现有的国产操作系统基本基于Linux开发,因此对X接口的抽象和封装,是合迅智灵国产化C++基础开发套件的图形绘制子系统中最为重要的组成部分。
X窗口系统简介
X的初学者经常惊讶于一个事实,那就是X其实是一个基于服务器-客户端的网络架构。服务端(X Server)负责管理来自客户端(X Client)的连接,处理键盘和鼠标等输入设备的输入,并向客户端返回像素数据作为响应;而客户端则是由一个实际的应用程序组成,而应用程序通过发送请求到服务端,读取服务端的响应,才可以顺利更新自己的界面。这个过程就像是应用程序请求X Server 说“请告诉我现在的样子”,服务端收到这个请求后,通过内置的逻辑进行复杂的计算,最后得到一张图并返回到应用程序,以完成应用程序的界面绘制。
事实上,X 的确可以通过网络实现“远程绘制界面”这样的操作。X Server 和 X Client 完全可以运行在不同的机器上,并经由网络协议通信。当然如果它们运行在同一台机器的话,就是你“本机运行 Linux 系统”的情形了。
下面是一些额外的概念:
X11:众所周知,客户端和服务端要实现通信需要遵循一定的协议。X11 就是现行协议的名称,即“X 协议的第11个版本”;
Xlib、xcb:都是实现X11协议的C语言库,程序员正是调用的这些库,在 X环境下开发图形界面程序。
X还封装了显示设备(Display)和屏幕(Screen)的概念,作为对图像输出终端硬件设备的完整抽象。显示设备负责管理一套输入设备和多个屏幕。显示设备描述了 X Server 图像的最终输出目标;屏幕可以简单理解为硬件显示屏,每个屏幕拥有长宽尺寸等属性,用于承载实际的图像输出。
比如常见的多屏幕工作站,本身是一个显示设备,只有一套输入设备(键盘鼠标/触摸),管理着多块屏幕。应用程序可以显示在任意一块屏幕上,甚至可以通过跨屏幕来进行显示,为用户带来更加流畅和个性化的使用体验,大大提高了工作效率。
X事件的处理
事件的本质,即由X Server服务器端所发起的,针对X Client客户端提出的请求的响应。请求和响应的种类很多,其中输入设备就尤为典型。客户端可以注册(XSelectInput)自身所关心的事件类型,对于不关心的事件将直接丢弃来提高效率和降低逻辑复杂程度。
开发工具所封装的跨平台事件,如Qt的QEvent,以及合迅智灵的LEvent,可以实现跨平台使用,是因为开发工具在不同的窗口系统上对窗口系统的原生事件进行了适当的包装,从而可以生成统一的、跨平台的事件对象。
基于此,合迅智灵实现了统一的事件监听器。事件监听器封装了X的事件响应机制,并负责将X系统事件包装为合迅智灵LEvent,并存放于事件队列中,等待事件循环进行处理与分发。事件监听器是平台无关的抽象类,例如后续只需要单独针对Wayland的事件机制作出处理,即可实现针对Wayland平台的事件监听器。
X窗口的绘制
窗口可以作为屏幕输出承载,那么窗口是怎么输出图像的呢?目前,合迅智灵已经实现了自研的图形绘制系统,通过内置的软渲染引擎对所绘制组件内容的光栅化,可以将一个完整的应用程序窗体输出为一张二维栅格图片,存放于内存之中,这块内存区域即是窗口的后台缓存。在后台缓存中进行绘制,并不会影响到屏幕上的窗口显示。当绘制完成,只需要通过一次刷新操作(XFlush),即可将后台缓存中的图像映射到窗口中,显示到屏幕上。
不过,无论是顶层的计算器窗口,还是内部的“按钮”窗口,在窗口系统语境下都是一视同仁的。但我们其实并不需要单独为“按钮”窗口分配单独的绘图后台缓存,而只将其作为输入接收器(有点像鼠标点击的“热区”概念),不参与绘制输出。针对此需求,X提供了两种不同的窗口类型:
InputOutput:可接受输入,同时也作为可绘制的实体(Drawable)承担图形输出职责,可以处理一切和图形输出相关的事件,如暴露事件(XExposeEvent)。X 客户端收到此事件之后会进行重绘尝试。
InputOnly:仅承担输入职责,在屏幕上无显示,不承担图形输出职责,不处理图形输出相关事件。其他和InputOutput类型的窗口一致。
因此,我们完全可以用前者作为顶层窗口,负责整个应用程序窗体的图形输出,而用后者负责各组件的事件逻辑输入处理,其本身的绘制可以统一交给顶层的InputOutput窗口处理。这种方案的好处是可以轻松处理组件之间的层叠和混合效果(比如半透明),但代码逻辑较为复杂,需要很好的处理每个组件相对于顶层窗口的偏移位置。这也是合迅智灵目前采用的方案。
小结
因为国内开发工具匮乏,为了高效地开发图形界面应用程序,开发人员不得不大量采用国外开发工具,这对我国基础软件的国产化构成了潜在威胁。
合迅智灵作为国内C++基础开发工具领域的首款产品,我们虽然需要正视在基础开发工具方面与国外同行的差距,但同时也具备一定的后发优势,可以基于前人的经验,走出属于自己的特色与创新的路子,创造出真正好用且适用于国内环境的优秀开发工具产品。
相关推荐
- Linux ntp时钟同步问题(linux ntp同步命令)
-
有时候,操作系统会报linux的ntp时钟错误。从时钟源同步时间超时。我查看了一下ntp的时钟源,发现执行ntpq-p显示超时。执行nslookup时钟服务器域名,发现可以正常解析。执行了n...
- linux服务器同步利器Rsync全介绍(付脚本)
-
1、认识Rsync(remotesynchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文件...
- 如何使用Rsync同步两个网站服务器的内容
-
本头条号每天坚持更新原创干货技术文章,欢迎关注本头条号"Linux学习教程",公众号名称“Linux入门学习教程"。如需学习视频,请复制以下信息到手机浏览器或电脑浏览器上:zc...
- Linux TB级小文件同步备份解决方案
-
在某些电子档案存储的业务系统下,按照业务场景要求,需要将产生的所有电子影像资料永久存储,并支持备份;因为“钞能力”等原因,一般备份存储只有一个节点(即:一个备份存储服务器);这样就要求研发工程师,不...
- CentOS7下使用Lsyncd实现文件实时同步
-
Lsyncd简单介绍Lsyncd使用文件系统事件接口(inotify或fsevents)来监视本地文件和目录的更改。Lsyncd在几秒钟内将这些文件事件整理核对后,然后生成一个或多个进程以将更...
- 如何手动同步Linux系统时间并与互联网时间保持同步?
-
在Linux系统中,正确的时间同步对于许多任务都是至关重要的。一些关键应用程序可能需要准确的时间戳才能正常工作,而一些安全功能也需要确保所有服务器的时间都是准确的。NTP服务可以自动同步系统时间和互...
- Linux服务器Rsync定时同步一键化配置指南
-
1、主从服务器同时安装rsyncopenssh-clientaptupdate&&aptinstall-yrsyncopenssh-client2、主服务器安装好后输入以下命令生成密钥...
- Linux系统如何使用NTPDATE命令设置时间同步
-
简介:咱们在使用Linux系统的时候,常常能发现用了一阵子之后,Linux系统的时间就对不上了。已经知道的情况是,安装Linux的时候选的时区是Asia/Shanghai,可这系统运行了一...
- 开源的Linux文件同步工具有哪些?(linux 文件夹 同步)
-
Linux系统之间经常需要文件同步,一个好的文件同步工具省时省力,这里介绍几款开源的Linux文件同步工具1.rsync:rsync是Linux上一个功能强大的命令行工具,可以在不同的服务器之间同...
- Linux 系统使用 rsync + inotify 实现文件实时同步
-
Linux系统使用rsync+inotify实现文件实时同步简介inotify监控文件的变化后通知rsync进行文件的同步#配置免密登录ssh-keygen-trsaca...
- Linux 远程数据同步工具详解(linux远程同步命令)
-
一、简介1认识Rsync(remotesynchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之...
- 构建基于 Linux 的 NTP 时间同步集群与时间安全防护实战指南
-
一、为什么时间同步对系统如此重要?在分布式系统、数据库复制、消息队列、审计日志、安全认证(如Kerberos)、容器编排等场景中,系统时间一致性是保障正确性与安全性的基础。一旦服务器间时间漂移,可能...
- 每日Linux学习:同步备份工具 rsync
-
rsync是一个用于高效同步文件和目录的工具。它通过仅传输变化的部分(增量传输)来节省时间和带宽,支持本地同步、远程同步(通过SSH),还能保留文件原有权限、时间戳等属性。本文通过几个常用的实例来...
- Chromixium OS 1.0发布 基于Ubuntu发行版
-
Chromixium项目宣布chromixiumOS1发布,一款基于Ubuntu的Linux分支,chromixiumOS试图重新打造一款外观和感觉与ChromeOS相似的完...
- iOS8.0.X~iOS8.1完美越狱!盘古团队出品
-
【巴士速递·移动情报站】最新消息,iOS8.1越狱了!!此次越狱依旧是iOS7时代我国的大神盘古团队带来的,而该次越狱支持最新的iPhone6、iPhone6Plus、iPadAir2和iPad...
- 一周热门
- 最近发表
- 标签列表
-
- linux 远程 (37)
- u盘 linux (32)
- linux 登录 (34)
- linux 路径 (33)
- linux 文件命令 (35)
- linux 是什么 (35)
- linux 界面 (34)
- 查看文件 linux (35)
- linux 语言 (33)
- linux代码 (32)
- linux 查看命令 (33)
- 关闭linux (34)
- root linux (33)
- 删除文件 linux (35)
- linux 主机 (34)
- linux与 (33)
- linux 函数 (35)
- linux .ssh (35)
- cpu linux (35)
- 查看linux 系统 (32)
- linux 防火墙 (33)
- linux 手机 (32)
- linux 镜像 (34)
- linux mac (32)
- linux ip地址 (34)