C++ XCB:XCB_wait_for_事件未捕获应用程序生成的事件

C++ XCB:XCB_wait_for_事件未捕获应用程序生成的事件,c++,xcb,C++,Xcb,我有一个小型的基于xcb的GUI编程库。它的一个方法强制在窗口区域中重画指定的矩形。它创建Expose事件并将其发送到窗口: 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();

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

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\u wait\u for\u event
获取事件并将其分派给适当的回调函数

所以,当我调用
重画矩形
方法时,屏幕上什么也没发生。我已经调查并发现函数生成的事件不会进入事件循环。但是xscope说X服务器获取事件请求并发出它。怎么了

UPD 1窗口事件掩码是通过
xcb\u set\u Window\u属性设置的。遮罩为
XCB_事件(遮罩)曝光| XCB_事件(遮罩)按钮| XCB_事件(遮罩)按钮| XCB_事件(遮罩)按钮|按下| XCB u事件(遮罩)按钮|释放| XCB XCB u事件(遮罩)按键|按下| XCB u事件(遮罩(指针|移动| XCB


UPD 2客户端消息也未被
xcb\u wait\u for\u事件捕获。

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

是否
xscope
拦截服务器和应用程序之间的所有通信?因此,如果
xscope
显示事件,那么它必须到达您的应用程序。另外,为什么您需要向自己发送一个公开事件?你不能直接重画受影响的矩形吗?@UliSchlachter将事件传递给应用程序前后都会执行一些代码。此代码设置剪辑矩形。当然,我可以将此逻辑添加到
GWindow::redraw
,但我仍然对解决原始问题感兴趣。我想这是因为误解了xcb中的某些内容。