gpt4 book ai didi

c - XCB – 未在所有窗口上接收到运动通知事件

转载 作者:太空狗 更新时间:2023-10-29 14:58:48 25 4
gpt4 key购买 nike

我正在尝试接收有关任何指针移动的通知。因为我不想作为窗口管理器运行,所以我需要设置 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_POINTER_MOTION 在所有窗口上,我在启动时和收到创建通知事件时都这样做。

这似乎在一般情况下工作正常,我在所有窗口上都收到了 Action 通知事件。然而,不知何故,谷歌浏览器窗口并非如此。我之后通过显式查询检查了事件掩码,并且它已正确设置。我在传播掩码中也没有看到任何异常。

什么会导致 Google Chrome 不报告 Action 通知事件? AFAIK,X 协议(protocol)不允许这样做,除了 Chrome 肯定没有的主动指针抓取。

这是我在所有现有窗口上注册自己的方法。我在根窗口上调用 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);
}

最佳答案

Chrome 窗口似乎由嵌套子窗口树组成。看来您需要遍历窗口树并监视所有窗口。此代码在我的整个 Chrome 窗口中获取指针运动事件:

#include <stdio.h>
#include <stdlib.h>
#include <xcb/xcb.h>
#include <X11/Xlib.h>

static void register_events(xcb_connection_t *conn,
xcb_window_t window) {
xcb_void_cookie_t cookie =
xcb_change_window_attributes_checked(conn,
window, XCB_CW_EVENT_MASK,
(uint32_t[]) {
XCB_EVENT_MASK_POINTER_MOTION });
xcb_generic_error_t *error = xcb_request_check(conn, cookie);
if (error != NULL) {
xcb_disconnect(conn);
exit(-1);
}
}

static void register_existing_windows(xcb_connection_t *conn,
xcb_window_t root) {
int i, len;
xcb_window_t *children;
xcb_query_tree_reply_t *reply;
if ((reply = xcb_query_tree_reply(conn,
xcb_query_tree(conn, root), 0))
== NULL)
{
return;
}

len = xcb_query_tree_children_length(reply);
children = xcb_query_tree_children(reply);
for (i = 0; i < len; i++) {
register_events(conn, children[i]);
register_existing_windows(conn, children[i]);
}

xcb_flush(conn);
}

void main(void) {
int i=0;

/* Open the connection to the X server */
xcb_connection_t *conn = xcb_connect (NULL, NULL);

/* Get the first screen */
xcb_screen_t *screen = xcb_setup_roots_iterator (xcb_get_setup (conn)).data;

register_existing_windows(conn, screen->root);

while(1) {
xcb_generic_event_t *evt;
evt = xcb_wait_for_event(conn);
printf("%i\n", i++);
}
}

(这只是为了证明概念,不是很好。)

关于c - XCB – 未在所有窗口上接收到运动通知事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30032416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com