import cairo import gtk import gtk.gdk def move_window_to_parent(w, p): pwidth, pheight = p.window.get_size(); px, py = p.window.get_position(); width, height = w.window.get_size(); x, y = w.window.get_position(); nx = px + pwidth / 2 - width / 2; ny = py + pheight / 2 - height / 2; if x != nx or y != ny: w.window.move (nx, ny); w.window.restack(p.window, True); def show_lightbox(w): lightbox = gtk.Window(); lightbox.set_transient_for(w); lightbox.set_decorated(False); lightbox.set_position(gtk.WIN_POS_CENTER_ON_PARENT); lightbox.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_SPLASHSCREEN); lightbox.set_default_size(w.allocation.width, w.allocation.height); w.connect("configure-event", lambda *args: move_window_to_parent (lightbox, w)); lightbox.set_decorated(False); lightbox.set_app_paintable(True); lightbox.realize(); lightbox.window.set_back_pixmap(None, True); lightbox.show(); pixmap = gtk.gdk.Pixmap(lightbox.window, w.allocation.width, w.allocation.height, -1); cr = pixmap.cairo_create(); cr.set_source_pixmap(w.window, w.allocation.x, w.allocation.y); cr.paint(); cr.set_source_rgba(0.0, 0.0, 0.0, 0.5); cr.paint(); lightbox.window.set_back_pixmap(pixmap, False); lightbox.window.clear(); gtk.gdk.flush(); return lightbox; def show_message_dialog(l): m = gtk.MessageDialog(l, buttons=gtk.BUTTONS_OK) m.set_markup("Woo, subdialog"); m.set_position(gtk.WIN_POS_CENTER_ON_PARENT); l.connect("configure-event", lambda *args: move_window_to_parent (m, l)); m.run(); gtk.main_quit(); def on_clicked(b, w): l = show_lightbox(w); show_message_dialog(l); w = gtk.Window(); w.set_default_size(800, 600); box = gtk.VBox(); w.add(box); l = gtk.Label("I'm the installer"); box.add(l); b = gtk.Button("Show dialog"); b.connect("clicked", on_clicked, w); box.pack_start(b, expand=False); w.show_all(); gtk.main();