如何正确处理XCB客户端消息,解决WM_DELETE_WINDOW关闭事件不触发问题
问题根因
你代码里的hnd_poll_events函数存在指针类型转换错误,导致无法正确读取客户端消息事件的内容:
// 错误写法:直接把hnd_event_t结构体指针转成了xcb事件指针 xcb_client_message_event_t *temp_client_message_event = (xcb_client_message_event_t *)_event;
你应该转换的是_event结构体里存储原始xcb事件的xcb_event成员,而不是_event本身。
修复方案
替换hnd_poll_events中XCB_CLIENT_MESSAGE分支的代码即可:
case XCB_CLIENT_MESSAGE: { // 正确转换:取_event->xcb_event成员做类型转换 xcb_client_message_event_t *temp_client_message_event = (xcb_client_message_event_t *)_event->xcb_event; if (temp_client_message_event->data.data32[0] == _window->wm_delete_window->atom) _window->running = HND_NK; } break;
可选校验点
如果修复后仍然不生效,可以做以下排查:
- 确认你在主事件循环里正确调用了
hnd_poll_events,并且每次调用后都会判断_window->running的状态来退出循环 - 临时添加日志打印
temp_client_message_event->data.data32[0]和_window->wm_delete_window->atom的值,确认两者数值匹配 - 你当前设置的事件掩码已经足够接收客户端消息,不需要额外添加STRUCTURE_NOTIFY掩码
内容的提问来源于stack exchange,提问作者JozuTM
相关产品推荐
相关产品推荐

