【发布时间】: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。
【问题讨论】: