You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:48:00