X11:移动窗口时收到通知

时间:2017-06-24 16:24:57

标签: c++ linux x11 xorg xcb

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

1 个答案:

答案 0 :(得分:3)

最后,经过一些研究,结果发现,大多数窗口管理器,至少那些进行重新定位,堆叠和/或合成的窗口管理器向ConfigureNotify位设置的synthetic位标志设置发送response_type事件为true(例如,在XCB的x上设置了MSB),其y<shape xmlns:android="http://schemas.android.com/apk/res/android"> <stroke android:width="1dp" android:color="@color/colorPrimary" /> <solid android:color="@color/colorLightSky" /> <padding android:bottom="2dp" android:left="10dp" android:right="10dp" android:top="2dp" /> </shape> 设置为客户端窗口的绝对位置。用Xfwm4,Openbox,metacity和KWin确认。