XCB开发中窗口resize时未触发对应事件无法打印hello问题咨询
问题原因
1. 事件掩码注册错误
你调用xcb_create_window时仅指定了XCB_CW_EVENT_MASK一个窗口属性,对应value_list只需要提供1个元素存储事件掩码组合。你当前定义的value_list第一个元素是XCB_NONE,第二个才是目标事件掩码,导致实际生效的事件掩码为XCB_NONE,所有预期监听的事件都没有被注册,自然无法触发回调。
2. 监听事件类型不匹配常规使用场景
XCB_EVENT_MASK_RESIZE_REDIRECT对应的XCB_RESIZE_REQUEST事件是特殊场景使用的:仅当你需要主动拦截窗口管理器的窗口大小调整逻辑、完全自主控制窗口尺寸时才需要监听该事件。常规场景下监听窗口大小变化,仅需要开启XCB_EVENT_MASK_STRUCTURE_NOTIFY,监听XCB_CONFIGURE_NOTIFY事件即可。
修正代码
窗口创建部分
// 仅保留需要的事件掩码,去掉多余的XCB_NONE和RESIZE_REDIRECT uint32_t value_list[] = { XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_STRUCTURE_NOTIFY, }; xcb_create_window( result->connection, XCB_COPY_FROM_PARENT, result->window, screen->root, 0, 0, width, height, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, XCB_CW_EVENT_MASK, value_list);
事件处理部分
if(intern_window->event) { switch(intern_window->event->response_type & ~0x80) { case XCB_EXPOSE: { xcb_flush(intern_window->connection); break; } case XCB_CLIENT_MESSAGE: { if( ((xcb_client_message_event_t*)intern_window->event)->data.data32[0] == intern_window->delete_reply->atom ) { intern_window->closing = true; free(intern_window->delete_reply); } break; } // 替换为XCB_CONFIGURE_NOTIFY事件 case XCB_CONFIGURE_NOTIFY: { puts("Hello"); // 如果需要获取新的窗口尺寸可以加以下代码: // xcb_configure_notify_event_t *cfg_ev = (xcb_configure_notify_event_t *)intern_window->event; // printf("新窗口尺寸:宽%d 高%d\n", cfg_ev->width, cfg_ev->height); break; } } }
内容的提问来源于stack exchange,提问作者taste01
相关产品推荐
相关产品推荐

