Rust调用X11 xproto创建子窗口失败报BadRegion错误如何解决
X11子窗口不显示且抛出BadRegion错误解决方案
问题核心原因
- 多余的子结构事件掩码
子窗口无需设置SUBSTRUCTURE_REDIRECT和SUBSTRUCTURE_NOTIFY事件掩码,这两个权限仅允许窗口管理器在根窗口的直接子窗口上申请,普通子窗口添加这两个掩码会触发X服务权限错误,是BadRegion报错的核心诱因。 - 视觉参数不匹配
直接使用根窗口的视觉属性创建子窗口,若父窗口frame_win的视觉属性与根窗口不一致,会导致背景色值解析错误、渲染异常,应当直接复用父窗口的视觉参数,而非调用根窗口的visual。 - 未刷入X请求缓冲区
xproto的接口默认是异步缓存请求的,调用完map_window后没有主动flush连接缓冲区,请求不会被发送到X服务器,窗口自然无法渲染。
修正后代码
let text_win = self.conn.generate_id()?; let text_win_aux = xproto::CreateWindowAux::new() .event_mask( xproto::EventMask::EXPOSURE | xproto::EventMask::BUTTON_PRESS | xproto::EventMask::BUTTON_RELEASE | xproto::EventMask::POINTER_MOTION | xproto::EventMask::ENTER_WINDOW | xproto::EventMask::PROPERTY_CHANGE, ) .background_pixel(0xFFFFFF); // frame_visual为父窗口frame_win对应的视觉属性值,替换原有screen.root_visual即可 self.conn.create_window( COPY_DEPTH_FROM_PARENT, text_win, frame_win, 15, 15, 60, 25, 0, xproto::WindowClass::INPUT_OUTPUT, frame_visual, &text_win_aux, )?; self.conn.map_window(text_win)?; // 新增flush调用,将缓存的请求发送到X服务 self.conn.flush()?;
内容的提问来源于stack exchange,提问作者gsb
相关产品推荐
相关产品推荐

