X11:当窗口移动时如何收到通知

4

我的应用程序需要知道窗口何时被移动(我需要知道我的应用程序窗口相对于屏幕(根窗口/绝对位置)的确切位置,例如使用 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,因为我还需要让我的应用程序通过窗口管理器进行管理。


1
在你的WM框架上观察结构通知。 - n. m.
1个回答

4

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接