窗口创建(XCreateWindow)后的首个事件处理疑问
XCreateWindow后首个事件的相关说明
不存在绝对一定会最先触发的XEvent,X服务器的事件队列顺序可能受多种因素影响,但有几个事件是窗口创建后大概率较早出现的,同时你可以通过设置事件掩码来确保接收:
XCreateWindow本身不会触发任何事件,必须调用XMapWindow()将窗口映射到屏幕后,才会开始收到窗口相关事件。- MapNotify:窗口成功映射到屏幕时发送,只要给窗口设置
StructureNotifyMask事件掩码就能接收,这是映射后最常见的早期事件之一。 - Expose:当窗口区域需要重绘时触发,通常在映射完成后立即发送,需要设置
ExposureMask掩码才能接收。 - ConfigureNotify:窗口位置、大小等配置变更时发送,映射窗口的操作也可能触发该事件,同样需要
StructureNotifyMask掩码。
不过要注意,以上事件无法保证绝对是队列中的第一个事件(比如队列中可能残留其他窗口的未处理事件)。如果需要严格处理窗口创建后的第一个事件,用布尔变量标记的方法依然是最可靠的:初始化一个is_first_event变量为true,每次通过XNextEvent获取事件后先检查该变量,若是首次事件则执行目标操作,随后将变量设为false。
内容的提问来源于stack exchange,提问作者Irbis
相关产品推荐
相关产品推荐

