我正在尝试收到有关任何指针运动的通知。由于我不想作为窗口管理器运行,因此我需要XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_POINTER_MOTION
在启动时和收到创建通知事件时都设置所有窗口。
一般来说,这似乎工作正常,我在所有窗口上都收到运动通知事件。但是,不知何故,这不适用于 Google Chrome 窗口。我之后通过显式查询来检查事件掩码,并且设置正确。我也没有在传播掩码中看到任何异常。
什么可能导致 Google Chrome 不报告动作通知事件?AFAIK,除了 Chrome 肯定没有的主动指针抓取之外,X 协议不允许这样做。
这是我在所有现有窗口上注册自己的方式。我调用register_events
根窗口,每当我收到创建通知事件时:
static void register_events(xcb_window_t window) {
xcb_void_cookie_t cookie = xcb_change_window_attributes_checked(connection,
window, XCB_CW_EVENT_MASK, (uint32_t[]) { XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_LEAVE_WINDOW });
xcb_generic_error_t *error = xcb_request_check(connection, cookie);
if (error != NULL) {
xcb_disconnect(connection);
errx(EXIT_FAILURE, "could not subscribe to events on a window, bailing out");
}
}
static void register_existing_windows(void) {
xcb_query_tree_reply_t *reply;
if ((reply = xcb_query_tree_reply(connection, xcb_query_tree(connection, root), 0)) == NULL) {
return;
}
int len = xcb_query_tree_children_length(reply);
xcb_window_t *children = xcb_query_tree_children(reply);
for (int i = 0; i < len; i++) {
register_events(children[i]);
}
xcb_flush(connection);
free(reply);
}