探索X窗口系统(窗口探测工具)
ahcoder 2025-05-05 13:35 10 浏览
在之前的分享中,我们提到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++基础开发工具领域的首款产品,我们虽然需要正视在基础开发工具方面与国外同行的差距,但同时也具备一定的后发优势,可以基于前人的经验,走出属于自己的特色与创新的路子,创造出真正好用且适用于国内环境的优秀开发工具产品。
相关推荐
- 写一个Nginx的模块没有那么难(nginx模块化)
-
Nginx作为世界第二大Web服务器(第一是Apache),越来越受到大家的青睐。受到欢迎的一个重要原因,是他的高扩展性。它是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。当我们开发自己的...
- Rocky Linux 9.x 从零安装 Nginx 全流程:源码编译 + dnf 安装方案详解
-
0.前言本文目标,安装nginx提供http访问git仓库。关于这篇只是再续,还有续集...以下安装主要的过程都是在root用户下进行,如果是非root用户,请使用sudo获取root权限执行命令。1...
- RockyLinux 9快速部署Nginx+HTTPS(基于DNF安装)
-
RockyLinux9快速部署Nginx+HTTPS(基于DNF安装)针对RockyLinux9用户,通过DNF包管理器快速搭建Nginx服务并配置HTTPS加密,以下是优化后的实战流程,兼顾效率...
- 如何在openEuler 24.03 LTS部署Zabbix 7.0 LTS之源码编译安装
-
由于openEuler24.03LTS系统无法通过Zabbix官网提供的RPM包来安装Zabbix7.0LTS软件,因此只能采取源码编译的方式进行安装,选择MySQL数据库和Nginxweb...
- 搭建自己的前端服务器环境—Node、MySQL、Git和Nginx等一网打尽
-
前言作为前端开发者一直都在关注浏览器的行为、表现。但是时间长了免不了要接触到后端的知识、服务器的知识。尤其是在前端技术爆发式发展的当下,前端慢慢的渗透到了更多的领域。比如,使用express/koa...
- 跟我学Nginx(三)——Centos8安装Nginx
-
Nginx有window版本,也有Linux版本,我的工作环境都是基于Linux,所以今天主要讲讲如何在Linux下安装Nginx,以Centos为例进行说明。一.下载Nginx从Nginx的官网(h...
- 04《Nginx 入门教程》Windows 下安装 Nginx
-
在Windows上安装Nginx时一件非常简单的事情,因为连编译都不用,直接开箱使用。接下来,我们在Windows7上搭建Nginx服务并简单使用起来。1.下载Nginx最新稳...
- nginx负载均衡配置(nginx负载均衡配置两个程序副本)
-
Nginx是什么没有听过Nginx?那么一定听过它的“同行”Apache吧!Nginx同Apache一样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(UniformResources...
- 内测分发平台应用的异地容灾和负载均衡处理和实现思路?
-
在软件开发过程中,内测分发平台扮演着至关重要的角色。它不仅帮助开发者将应用程序传播给内部测试人员,还负责收集反馈、跟踪错误并改进产品。然而,为了确保一个平稳、连贯的内测过程,对内测分发平台实施异地容灾...
- SpringBoot 项目处理跨域的四种技巧
-
上周帮一家公司优化代码时,顺手把跨域的问题解决了,这篇文章,我们聊聊SpringBoot项目处理跨域的四种技巧。1什么是跨域我们先看下一个典型的网站的地址:同源是指:协议、域名、端口号完全相...
- 确保 Nginx 网络服务器的安全(nginx 安全防护)
-
在数字时代,网络安全已成为一个亟待解决的问题。随着网络攻击的增加,确保网络服务器安全对保护敏感数据和维护网站完整性至关重要。本博文将指导你如何配置Nginx(一种流行的开源网络服务器软件),以保护服...
- 三条命令部署 Jira 和 Confluence,我为什么写了这个小工具?
-
这两天,趁着Team'25大会的余温,我回顾了一下自己过去这些年和AtlassianDataCenter(以下简称DC)打交道的经历。Mike在会上提到,Isolated...
- 前端域名、端口、协议一样,本地缓存可以共享吗?
-
是的,前端在域名、端口、协议都相同的情况下,本地缓存(localStorage、sessionStorage、cookie等)是可以共享的,具体如下:本地缓存能否共享的判断标准:缓存类型是否共享的...
- 如果给nginx写插件,基于何种语言实现
-
Nginx插件开发主要基于以下几种语言和技术栈,具体选择取决于插件类型、性能需求和开发复杂度:1.C语言(原生模块)特点:直接编译到Nginx核心,性能最优,适合高性能要求的底层功能(如负载均...
- 《云计算故障排查:网站突然打不开,咋办?》
-
云计算故障排查:网站突然打不开,咋办?——用“医院急诊室”类比,5分钟学会“网络急救术”一、先抛结论:网站崩了≠“世界末日”,按“急诊流程”快速排查网站突然打不开,就像病人突然倒地——慌乱中乱投医只会...
- 一周热门
- 最近发表
-
- 写一个Nginx的模块没有那么难(nginx模块化)
- Rocky Linux 9.x 从零安装 Nginx 全流程:源码编译 + dnf 安装方案详解
- RockyLinux 9快速部署Nginx+HTTPS(基于DNF安装)
- 如何在openEuler 24.03 LTS部署Zabbix 7.0 LTS之源码编译安装
- 搭建自己的前端服务器环境—Node、MySQL、Git和Nginx等一网打尽
- 跟我学Nginx(三)——Centos8安装Nginx
- 04《Nginx 入门教程》Windows 下安装 Nginx
- nginx负载均衡配置(nginx负载均衡配置两个程序副本)
- 内测分发平台应用的异地容灾和负载均衡处理和实现思路?
- SpringBoot 项目处理跨域的四种技巧
- 标签列表
-
- 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 防火墙 (33)
- linux 镜像 (34)
- linux ip地址 (34)
- linux 用户查看 (33)
- nginx配置 解析 (37)
- nginx 频率限制 (34)