【问题标题】:X11: Get notified when the window is movedX11:窗口移动时得到通知
【发布时间】: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 框架上观看结构通知。

标签: c++ linux x11 xorg xcb


【解决方案1】:

最后,经过一些研究,事实证明,大多数窗口管理器,至少是那些执行重父化、堆叠和/或合成的窗口管理器,会在 synthetic 位标志设置为 true 的情况下向其客户端发送 ConfigureNotify 事件(例如MSB 设置在 XCB 的 response_type) 上,其 xy 设置为客户端窗口的绝对位置。通过 Xfwm4、Openbox、metacity 和 KWin 确认。

【讨论】:

    猜你喜欢
    • 2010-11-04
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    相关资源
    最近更新 更多