Как получить окно Gdk от xid?

Я потерялся в версии 3.. в Вместо python2+gdk2 является:

#!/usr/bin/env python2
import gtk

gtk.gdk.window_process_all_updates()
window_xid = 54525964
gdk_window = gtk.gdk.window_foreign_new(window_xid)

что в значительной степени прямолинейно. Но тогда ужас:

#!/usr/bin/env python3
from gi.repository import xlib
from gi.repository import Gdk
from gi.repository import GdkX11

Gdk.Window.process_all_updates()
xlib_window = "???????"
gdk_display = GdkX11.X11Display.get_default()
gdk_window = GdkX11.X11Window.foreign_new_for_display(gdk_display, xlib_window)

xlib убивает меня.. Я ничего не могу с этим поделать. Кто-нибудь работал с ним раньше??

документация, которую я уже несколько раз проходил,: Gdk3, Xlib

получение окна из его xid было самым быстрым способом получить скриншот в python2, я думаю Я попробую другой способ в python3.. есть идеи? может быть, peek_children из корневого окна?? но тогда откуда мне знать, хочу ли я именно это окно?

1 ответов


A Window в X11 то же самое, что и XID. Есть только typedef от одного к другому.

Итак, в коде C gdk_x11_window_foreign_new_for_display() просто принимает Window или XID, который в основном является целым числом. Это также работает в python, используя интроспекцию:

#!/usr/bin/env python3
from gi.repository import Gdk
from gi.repository import GdkX11

Gdk.Window.process_all_updates()
xlib_window = 0x2a00005 # from xwininfo command
gdk_display = GdkX11.X11Display.get_default()
gdk_window = GdkX11.X11Window.foreign_new_for_display(gdk_display, xlib_window)
print gdk_window.get_geometry()