X11:窗口移动时得到通知

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

问题是我需要接收一个事件,如果我的窗口被用户移动。 我已经将这个XCB_EVENT_MASK_STRUCTURE_NOTIFY添加到了事件掩码中,正如我们在这里所build议的那样,我的应用程序只是在窗口pipe理器的框架的相对位置发生改变时才获取事件(这反过来,X服务器不会向我的应用程序发送任何事件如果窗口被用户移动,因为它不改变窗口pipe理器框架的相对位置)。 有关其他信息,这里是窗口创build代码:

 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,在合成模式和非合成模式下都尝试了这种方法,所有结果都一样。

什么是解决scheme,以便我可以通知窗口移动事件? 我不想启用override_redirect ,因为我也需要我的应用程序由窗口pipe理器来pipe理。

最后,经过一番研究后发现,大多数窗口管理器(至少那些进行重新映射,堆栈和/或合成的窗口管理器)都会向其客户端发送一个ConfigureNotify事件,并将synthetic位标志设置为true(例如,在XCB的response_type上设置了MSB)其xy设置为客户窗口的绝对位置。 确认与Xfwm4,Openbox,metacity和KWin。