XCB:xcb_wait_for_event 未捕获应用程序生成的事件

XCB: xcb_wait_for_event does not catch event generated by application

我有一个用于 GUI 编程的基于 xcb 的小型库。它的一种方法强制重绘 window 区域中的指定矩形。它创建 Expose 事件并将其发送到 window:

void GWindow::redrawRectangle(const I2Rectangle& r) {
    xcb_rectangle_t rect;
    rect.x = (short) r.left(); rect.y = (short) r.top();
    rect.width = (unsigned short) r.width(); 
    rect.height = (unsigned short) r.height();
    xcb_set_clip_rectangles(m_Connection, XCB_CLIP_ORDERING_UNSORTED,
                        m_GC, 0, 0, 1, &rect);

    xcb_expose_event_t *e = (xcb_expose_event_t*)malloc(sizeof(xcb_expose_event_t));
    memset(e, 0, sizeof(xcb_expose_event_t));
    e->response_type = XCB_EXPOSE;
    e->window = m_Window;
    e->x = r.left();
    e->y = r.top();
    e->width = r.width();
    e->height = r.height();
    e->count = 0;
    xcb_send_event(m_Connection, 0, m_Window, XCB_EVENT_MASK_EXPOSURE, (char*)e);
    xcb_flush(m_Connection);
}

这里r是一个矩形,其顶点坐标为整数。

另外,我有事件循环,它使用 xcb_wait_for_event 获取事件并将其分派给适当的回调函数。

所以,当我调用 redrawRectangle 方法时,屏幕上没有任何反应。我已经调查并发现函数生成的事件不会进入事件循环。但是 xscope 表示 X 服务器获取事件请求并发出它。怎么了?

UPD 1 Window 事件掩码通过 xcb_set_window_attributes 设置。掩码是XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_FOCUS_CHANGE

UPD 2 ClientMessage 也未被 xcb_wait_for_event 捕获。

问题在于检查事件类型。要提取类型,应该使用 event->response_type & ~0x80,而不仅仅是 event->response_type