如何确认X Server绘制完成?Xlib绘制矩形不显示及Expose事件次数问题
X11绘制相关问题解答
如何确认X Server已完成单个矩形绘制
Xlib的所有绘图请求默认是异步的:请求首先缓存在客户端本地,攒到一定量才批量发给X Server,没有专门的「绘制完成信号」。如果需要确认绘制执行完成,直接调用XSync(display, False)即可:
- 该函数会强制刷新本地缓存的所有请求到X Server,并且阻塞等待X Server处理完全部请求再返回,返回即代表此前所有绘制操作已执行完成
- 如果不需要等待执行完成,仅需要把请求发给服务器,调用
XFlush()即可
Expose事件处理次数说明
没有固定的次数要求,Expose事件的触发次数完全由窗口管理器行为决定:窗口首次映射、被遮挡后重新露出、大小调整、位置移动都会触发Expose事件,甚至同一帧的重绘需求可能被拆分为多个Expose事件发送。
你只需要判断event.xexpose.count字段即可:当该字段值为0时,代表当前批次的所有Expose事件已经全部发送完成,此时做一次完整重绘就能保证窗口内容正确,完全不需要统计处理了多少次Expose事件。
代码问题排查
第一个矩形不显示的核心原因:
- 调用
XMapWindow后窗口不会立刻完成映射,窗口映射完成前发送的首次绘制请求会被直接丢弃 - Expose事件处理逻辑错误:每次Expose触发时仅重绘了当前坐标的单个矩形,没有重绘所有历史绘制的矩形,窗口重绘时之前的矩形内容会被清空
- 循环逻辑不合理:绘制新矩形后被动等待Expose事件,没有主动触发刷新,也没有同步绘制状态
最小修改建议
- 窗口映射后先等待首次
xexpose.count == 0的Expose事件,再开始绘制后续矩形 - 维护一个已绘制矩形的坐标列表,每次Expose触发时遍历列表重绘所有矩形
- 每次绘制新矩形后调用
XSync(disp, False)确认绘制完成
内容的提问来源于stack exchange,提问作者Mikey
相关产品推荐
相关产品推荐

