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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:15:02