2011-07-27 15 views
6

estoy perdido en la versión 3 .. en python2 + gdk2 es: ¿Cómo obtener la ventana Gdk de xid?

#!/usr/bin/env python2 
import gtk 

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

que es bastante sencillo. Pero entonces, el horror:

#!/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) 

la xlib me está matando .. Soy incapaz de hacer nada con ella. ¿Alguien ha trabajado con eso antes?

La documentación tengo a través de varias veces ya es: Gdk3, Xlib

Conseguir la ventana de su XID era la manera más rápida para obtener una captura de pantalla en python2 supongo que tendré que tratar de otra manera en la python3 ... alguna idea? tal vez peek_children desde la ventana raíz? pero entonces, ¿cómo sé si es la ventana que quiero?

Respuesta

9

A Window en X11 es lo mismo que XID. Solo hay un tipodef de uno a otro.

Por lo tanto, en el código C gdk_x11_window_foreign_new_for_display() solo acepta Window o XID, que es básicamente un número entero. Esto también funciona en Python usando la introspección:

#!/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() 
+0

Awesome! Muchas gracias. Cuando probé esto por primera vez, creo que todavía no lo habían implementado. Sin embargo, solo un cambio menor para python3, la directiva 'print()' ahora necesita paréntesis. Aparte de eso, funciona como un encanto. ¡Gracias de nuevo! – demula

Cuestiones relacionadas