c++ - XCB:xcb_wait_for_event 未捕获应用程序生成的事件
问题描述
我有一个基于 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_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 ClientMessage 也没有被抓住xcb_wait_for_event
。
解决方案
问题在于检查事件类型。要提取类型,应该使用event->response_type & ~0x80
,而不仅仅是event->response_type
推荐阅读
- typo3 - 在 Extbase/Fluid 中接收和显示引用记录的数据
- python - django 错误:“DoesNotExist at /login/”,部署到 heroku 后
- java - Android Studio中连续图标闪烁而没有停止涟漪效应
- vue.js - 如何创建一个可点击的图标来显示带有多日期选择器的日期选择器?
- android - 使用kotlin从android主页上的通知启动意图时如何获取当前的活动状态
- reactjs - 在strapi Markdown文本字段中向表格添加样式
- makefile - 为什么 make: execvp: device/coo: Permission denied
- php - 如何在 Json 文件数组的多列中进行搜索?
- wsdl - 用于 WSDL 的 JAX-WS 客户端
- python - 重温“如何在 Python 中从我的 XLS 文件中读取特定工作表”的问题