【发布时间】:2017-11-28 00:59:03
【问题描述】:
我的应用程序需要知道它的窗口何时移动(我需要知道我的应用程序窗口相对于屏幕的确切位置(根窗口/绝对位置) - 例如由xcb_translate_coordinates 返回且 dst_window 设置为屏幕的根窗口)。
问题是如果我的窗口被用户移动,我需要接收一个事件。我已将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,因为我还需要我的应用程序由窗口管理器管理。
【问题讨论】:
-
在 WM 框架上观看结构通知。