早先的分享中曾提及,Linux环境下广泛使用的窗口系统为X窗口系统(简称:X)。当前,多数国产操作系统根基在于Linux,因此对X接口进行抽象与封装成为了合迅智灵国产化C++基础开发套件图形绘制子系统的核心要素。
初涉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 Server端触发的,针对X Client请求的响应。请求和响应类型多样,其中输入设备事件尤为显著。客户端可预先注册关注的事件类型,忽视无关事件以提高效率和简化逻辑复杂度。
诸如Qt的QEvent以及合迅智灵的LEvent这类跨平台开发工具封装的事件处理机制,能够在不同窗口系统间实现兼容性,得益于它们在底层窗口系统原始事件之上进行适配性包装,生成统一的跨平台事件对象。
合迅智灵已构建起统一的事件监听器,它封装了X事件响应机制,负责将X系统事件转化为合迅智灵的LEvent,并存储至事件队列,待事件循环处理与分发。该监听器为平台无关的抽象类,今后只需针对Wayland事件机制进行特定处理,就能实现针对Wayland平台的事件监听器。
至于窗口绘制,合迅智灵自主研发的图形绘制系统通过内建软渲染引擎对绘制组件的内容进行光栅化处理,从而将完整应用程序窗体转换成二维栅格图片存储于内存中,这部分内存即成为窗口的后台缓存。在后台缓存中绘制不影响屏幕上窗口的实际显示。一旦绘制完毕,只需执行一次刷新操作(XFlush),即可将后台缓存中的图像映射至窗口并在屏幕上呈现。
在窗口系统中,无论是顶层的计算器窗口,还是内部的“按钮”窗口,都被同等对待。然而,实际上并不需要为“按钮”窗口单独分配绘图后台缓存,只需将其作为输入接收器(类似鼠标点击的“热点”区域),不参与图像绘制输出。为此,X窗口系统提供了两种不同类型的窗口:
InputOutput: 能接受输入,同时作为可绘制实体(Drawable)承担图形输出任务,可处理所有图形输出相关的事件,如曝光事件(XExposeEvent)。当X客户端接收到此类事件时,会尝试重新绘制。
InputOnly: 只承担输入职责,在屏幕上不可见,不参与图形输出任务,不处理图形输出相关事件。除了这一点外,它与其他InputOutput类型的窗口功能相同。
因此,我们可以利用InputOutput类型的窗口作为顶层窗口,负责整体应用程序窗体的图形输出,而InputOnly类型的窗口则用于处理各个组件的事件逻辑输入,它们自身的绘制工作交由顶层的InputOutput窗口处理。这种方案便于处理组件间的层叠和混合效果(例如半透明),但代码逻辑相对复杂,需要精确处理每个组件相对于顶层窗口的位置偏移。这也正是合迅智灵目前所采取的方法。
鉴于国内开发工具资源稀缺,图形界面应用程序的开发人员通常依赖国外工具,这无疑对我国基础软件的国产化进程构成潜在挑战。作为国内C++基础开发工具领域的首个产品,合迅智灵虽然须正视与国外先进同行间的差距,但也享有后发优势,得以借鉴前人经验,走出一条有中国特色和创新精神的道路,打造出真正适合国内环境且易用的优秀开发工具产品。
文章内容来源于网络,不代表本站立场,若侵犯到您的权益,可联系多特删除。(联系邮箱:[email protected])
近期热点
最新资讯