c-X11:移动窗口时获得通知

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

解决方法:

最后,经过一番研究,事实证明,大多数窗口管理器,至少是那些进行父项,堆栈和/或合成的窗口管理器,都会将其合成位标志设置为true(例如,将XBB的response_type设置为MSB)发送ConfigureNotify事件给其客户端,其x和y设置为客户端窗口的绝对位置.已通过Xfwm4,Openbox,Metacity和KWin确认.

上一篇:Linux 的一些坑


下一篇:c-将程序化的鼠标事件发送到X