Я экспериментирую с XReparentWindow с конечной целью объединить окна нескольких процессов в один процесс имитации «кабины».Эксперименты с XReparentWindow работают спорадически ;иногда окно успешно перерисовывается, иногда нет .При неудачной перекомпоновке захваченное окно (не) мигает секунду, а затем продолжает работать как обычно, и граббер показывает неопределенное содержимое окна.Это успешно каждый второй раз (искушение перебить проблему, всегда пытаясь дважды).
Редактировать 1: Проверка вывода XQueryTree
сразу после XReparentWindow
показывает, что захваченное окно правильно переставлено,но может показаться, что он сохраняет исходный кадр, когда захватывается с экрана, а не перемещается в окно захвата.
Окно захвата происходит из приложения рендеринга 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 ...
Что происходит?