我的应用程序需要知道窗口何时被移动(我需要知道我的应用程序窗口相对于屏幕(根窗口/绝对位置)的确切位置,例如使用 xcb_translate_coordinates
将 dst_window 设置为屏幕根窗口返回的位置)。
问题在于,如果用户移动窗口,我需要接收到一个事件。根据 SO 上的建议,我将 XCB_EVENT_MASK_STRUCTURE_NOTIFY
添加到事件掩码中,但是只有当我的应用程序与窗口管理器的框架相对位置发生改变时,我的应用程序才会收到事件,因为这样 X 服务器不会向我的应用程序发出任何事件,窗口被用户移动时它不会改变相对于窗口管理器框架的位置。以下是窗口创建代码的附加信息:
uint32_t events = XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_KEY_PRESS;
xcb_create_window(conn, XCB_COPY_FROM_PARENT, main_window, scr->root, 0, 0, width, height, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT,
scr->root_visual, XCB_CW_EVENT_MASK , &events);
xcb_map_window(conn, main_window);
我已在我的桌面会话和 Xephyr 上尝试过,使用 Xfwm4、Openbox 和 metacity,在合成模式和非合成模式下都有相同的结果。
那么有什么解决办法可以让我收到窗口移动事件的通知呢?我不想启用 override_redirect
,因为我还需要让我的应用程序通过窗口管理器进行管理。