X11:移动 window 时收到通知

X11: Get notified when the window is moved

我的应用程序需要知道它的 window 何时移动(我需要知道我的应用程序 window 相对于屏幕的确切位置(根 window / 绝对位置) - 例如 xcb_translate_coordinates 返回的 dst_window 设置为屏幕的根 window。

问题是如果我的 window 被用户移动,我需要接收一个事件。我已经按照 SO 上的建议将 XCB_EVENT_MASK_STRUCTURE_NOTIFY 添加到事件掩码中,我的应用仅在 相对于 位置到 window 经理的框架时才获取事件更改(反过来,如果 window 被用户移动,X 服务器不会向我的应用程序触发任何事件,因为它不会更改与 window 管理器框架的相对位置)。如需更多信息,这里是 window 创建代码:

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,在合成模式和非合成模式下,所有结果都相同。

有什么解决方案可以让我收到有关 window 移动事件的通知?我不想启用 override_redirect,因为我还需要我的应用程序由 window 管理器管理。

最后,经过一些研究,事实证明大多数 Window 管理器,至少是那些进行重新父级设置、堆叠 and/or 合成的管理器会向他们的客户发送一个 ConfigureNotify 事件 synthetic 位标志设置为真(例如,在 XCB 的 response_type 上设置 MSB),其 xy 设置为客户端 window 的绝对位置。通过 Xfwm4、Openbox、metacity 和 KWin 确认。