【问题标题】:XCB get all root eventsXCB 获取所有根事件
【发布时间】:2022-07-29 18:14:30
【问题描述】:

我正在编写一个处理所有根事件的 xcb 应用程序。我写了这段代码:

#include <stdio.h>
#include <stdlib.h>

#include <xcb/xcb.h>
#include <xcb/xcb_aux.h>

int main(void) {
    xcb_connection_t *connection = xcb_connect(NULL, NULL);
    xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(connection)).data;
    xcb_generic_event_t *event;

    const uint32_t values[] = {
        XCB_EVENT_MASK_BUTTON_PRESS
    };

    xcb_change_window_attributes(connection, screen->root, XCB_CW_EVENT_MASK, values);
    xcb_aux_sync(connection);
    xcb_flush(connection);

    while ((event = xcb_wait_for_event(connection))) {
        switch (event->response_type & ~0x80) {
            case XCB_EXPOSE: {
                puts("expose");
                break;
            }
            case XCB_BUTTON_PRESS: {
                puts("mouse clicked");
                break;
            }
        }
        free(event);
    }

    xcb_disconnect(connection);

    return 0;
}

但是如果我需要在 DISPLAY:0 上获取事件,这不起作用,我该怎么做?如果我尝试检查 xcb_poll_for_event 返回的内容,它会返回 NULL,因为另一个窗口管理器正在运行,所以我需要访问正在运行的 wm。

【问题讨论】:

    标签: c x11 xorg xcb


    【解决方案1】:

    根据Xlib documentation,按钮按下掩码是三个事件掩码之一,一次只能由单个客户端在特定窗口上注册。不幸的是,如果窗口管理器已经在根窗口上注册按钮按下,那么您的客户端也不能在其上注册按钮按下事件。

    我在这里看到了一种明显的方法:您尝试在根窗口上注册按钮按下事件,以防万一没有窗口管理器正在运行,或者正在运行的窗口管理器实际上并未注册按钮按下事件根窗口。

    您也可以简单地决定不注册按钮按下事件,或者决定将您的客户端变成一个实际的窗口管理器,从而确保它拥有窗口管理器的全部权限。这几乎只是意味着如果您没有成功获得您在根窗口上查找的事件,则退出您的程序。显然,这将是一项艰巨的任务,并且可能远远超出您当前项目的范围……不过,这可能是您感兴趣的事情。

    【讨论】:

      猜你喜欢
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多