【发布时间】:2021-10-05 07:58:44
【问题描述】:
我正在试验 XReparentWindow,最终目标是将多个进程的窗口聚合到一个“驾驶舱”模拟进程中。 XReparentWindow 的实验偶尔会起作用;有时窗口会成功重新设置父级,有时则不会。当重新设置父对象失败时,(not) 抓取的窗口闪烁一秒钟,然后照常进行,抓取器显示未定义的窗口内容。每隔一段时间就成功一次(总是尝试两次以暴力解决问题)。
编辑 1:在 XReparentWindow 之后检查 XQueryTree 的输出显示抓取的窗口已正确重新设置父级,但似乎将其帧原点保持在从显示屏上抓取的位置,而不是移动到抓取器窗口。
抓取的窗口来自实时 OpenGL 渲染应用程序,从源代码编译。应用程序不会以任何方式预测抓取(也许应该?)。我也尝试过使用glxgears 和 GNOME 终端,结果相同。
实验代码,将窗口抓取作为程序参数(例如使用xwininfo | grep "Window id"):
#include <X11/Xlib.h>
#include <stdio.h>
#include <assert.h>
#include <unistd.h> // usleep
int main(int argc, char** argv) {
assert(argc==2);
Window window, extwin;
sscanf(argv[1], "%p", &extwin);
Display* display = XOpenDisplay(0);
window = XCreateWindow(display, RootWindow(display, 0), 0, 0, 500, 500, 0, DefaultDepth(display, 0), InputOutput, DefaultVisual(display, 0), 0, 0);
XMapWindow(display, window);
XReparentWindow(display, extwin, window, 0, 0);
while(1) {
XFlush(display);
usleep(3e5);
}
return 0;
}
(代码是从受限环境中手动导出的。对于导出过程中的任何拼写错误,我们深表歉意。)
期待有关下一步尝试的建议。
编辑 2:使用 xev 捕获抓取窗口的事件流后,我注意到一些奇怪的事情;在重新设置为抓取器窗口后,它会在不到一秒后重新设置为根窗口(受限环境,键入在其他窗口上看到的具有预期意义的内容):
UnmapNotify event ...
ReparentNotify event ... parent 0x4000001 (grabber window)
MapNotify event ...
ConfigureNotify event ... synthetic YES (what is this?)
UnmapNotify event ...
ReparentNotify event ... parent 0xed (reparenting back to parent window, but why?)
MapNotify event ...
VisibilityNotify event ...
Expose event ...
PropertyNotify event ... _NET_WM_DESKTOP state PropertyDelete
PropertyNotify event ... _NET_WM_STATE state PropertyDelete
PropertyNotify event ... WM_STATE state PropertyNewValue
我退出程序并再次尝试第二次,此时继续的输出是:
UnmapNotify event ...
ReparentNotify event ... parent 0x4000001 (grabber window)
MapNotify event ...
VisibilityNotify event ...
Expose event ...
发生了什么事?
【问题讨论】: