【发布时间】:2015-07-13 23:22:09
【问题描述】:
我正在尝试收到有关任何指针运动的通知。由于我不想作为窗口管理器运行,我需要在所有窗口上设置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);
}
【问题讨论】:
-
如果将
xev附加到 Chome 窗口,您会得到什么? -
@AndrewHenle 附加它并将我的鼠标移动到那里,移动它,让它休息并再次离开窗口只会给我 Enter/LeaveNotify、KeymapNotify 和 FocusIn/Out (pastebin.com/XQ3ZkVhW)
-
我还应该指出,同样的观察可以在不同的机器上使用 Chromium 进行。
-
那么您在 Chrome 窗口中看到 zero 个事件了吗?连鼠标点击都被吞了?
xprop和xwininfo -all在这些窗口中显示什么? -
@AndrewHenle 点击一下,我会收到 EnterNotify、KeymapNotify、PropertyNotify、ConfigureNotify 和 LeaveNotify(是的,所有这些都只需点击一个有焦点的 Chrome 窗口)。按键触发相应的事件。 xprop output, xwininfo on reparenting container, xwininfo on actual container
标签: c google-chrome x11 xcb