Re: Receiving a callback on GDK window destroy



Thanks Kevin! I'm trying out your suggestion and I've got the GtkWindow
hooking up to the foreign GdkWindow properly, but it looks like I still get
the same X server error when trying to draw after the browser destroys the
GtkSocket's window, and I still can't find a signal/event that gets
dispatched when that happens. :( e.g., delete, destroy, reparent, unmap, and
unrealize are not dispatched. Do you remember if there was a particular
event that you listened for to handle this case?

On 15 January 2010 16:08, Kevin DeKorte <kdekorte gmail com> wrote:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 01/15/10 16:51, Tristan Schmelcher wrote:
Hello,

I'm a novice Gtk app developer writing a plugin for Firefox and I'm
having trouble getting the callbacks that I need from Gtk/Gdk. The way
the plugin architecture works is that Firefox creates a GtkSocket and
my plugin gets passed its XID and creates the corresponding GtkPlug
(in the same process). By and large everything works, except at
shutdown. In some cases, Firefox happens to do a gdk_window_destroy()
on one of the parent windows of the GtkSocket before unloading my
plugin (for example, when closing a tab with the 'X'). That
recursively destroys everything down to the GtkSocket and also the
GtkPlug in _gdk_window_destroy_hierarchy(
). So when I try to access the underlying X11 Window handle after this
I get an error from the X server and the program aborts. :(

What I'd like to do is receive a signal from Gtk/Gdk when the
GdkWindow inside my GtkPlug is destroyed like this so that I can
cancel any further rendering actions. But I can't figure out how to
receive a signal when this happens! AFAICT none of the GtkPlug signals
or its inherited GtkWidget signals are dispatched when this happens.

Any ideas?

Tristan,

I've had this same problem when developing
gecko-mediaplayer/gnome-mplayer and mplayerplug-in. I was never able to
fully use the GtkPlug interface. It just didn't work the way I needed it
to.

What I ended up doing is creating a normal toplevel window and then
embedding it in the window that firefox gave me..

Something like this where windowid is the xid I get from firefox.



   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

   if (windowid > 0 && embedding_disabled == FALSE) {
       gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
       GTK_WIDGET_SET_FLAGS(window, GTK_CAN_FOCUS);
   }


  if (windowid != 0 && embedding_disabled == FALSE) {
       while (gtk_events_pending())
           gtk_main_iteration();

       window_container = gdk_window_foreign_new(windowid);
       if (GTK_WIDGET_MAPPED(window))
           gtk_widget_unmap(window);

       gdk_window_reparent(window->window, window_container, 0, 0);
   }


Hope that helps.

Kevin
- --
Get my public GnuPG key from
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x7D0BD5D1
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iEYEARECAAYFAktRA4AACgkQ6w2kMH0L1dFb0ACfdc7jssfzEnillFHhrUFOjDbW
nsQAnj4Q6GCxg8H1zeoC9/NTx8kuRtDV
=iMWg
-----END PGP SIGNATURE-----




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]