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



我有一个用于GUI编程的基于xcb的小型库。其中一种方法强制重新绘制窗口区域中指定的矩形。它创建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_wait_for_event来获取事件,并将其分派给适当的回调函数。

所以,当我调用redrawRectangle方法时,屏幕上什么都没有发生。我调查了一下,发现函数生成的事件不会进入事件循环。但xscope说X服务器接收到事件请求并发出它。它出了什么问题?

UPD 1通过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客户端消息也未被xcb_wait_for_event捕获。

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

最新更新