]> Pileus Git - ~andy/gtk/commitdiff
Fix a refcounting issues in GtkPlug
authorMatthias Clasen <mclasen@redhat.com>
Tue, 9 Feb 2010 01:08:22 +0000 (20:08 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 9 Feb 2010 18:41:57 +0000 (13:41 -0500)
When the foreign window already has a GdkWindow, we forget to take
an extra references, leading to crashes later on. Patch by
Karl Tomlinson, bug 607061.

gtk/gtkplug.c

index 40623f0b2cb9f2c47b2f5680095f67b399304cb7..5289cb5dad97dc33799612fa1bbaa003803faafd 100644 (file)
@@ -325,6 +325,7 @@ _gtk_plug_add_to_socket (GtkPlug   *plug,
   socket_->plug_widget = widget;
 
   plug->socket_window = GTK_WIDGET (socket_)->window;
+  g_object_ref (plug->socket_window);
 
   if (GTK_WIDGET_REALIZED (widget))
     {
@@ -410,10 +411,13 @@ _gtk_plug_remove_from_socket (GtkPlug   *plug,
   socket_->same_app = FALSE;
 
   plug->same_app = FALSE;
-  plug->socket_window = NULL;
-
+  if (plug->socket_window != NULL)
+    {
+      g_object_unref (plug->socket_window);
+      plug->socket_window = NULL;
+    }
   gtk_plug_set_is_child (plug, FALSE);
-                   
+
   g_signal_emit_by_name (socket_, "plug-removed", &result);
   if (!result)
     gtk_widget_destroy (GTK_WIDGET (socket_));
@@ -467,22 +471,25 @@ gtk_plug_construct_for_display (GtkPlug         *plug,
       gpointer user_data = NULL;
 
       plug->socket_window = gdk_window_lookup_for_display (display, socket_id);
-      
       if (plug->socket_window)
-       gdk_window_get_user_data (plug->socket_window, &user_data);
-      else
-       plug->socket_window = gdk_window_foreign_new_for_display (display, socket_id);
-         
-      if (user_data)
        {
-         if (GTK_IS_SOCKET (user_data))
-           _gtk_plug_add_to_socket (plug, user_data);
-         else
+         gdk_window_get_user_data (plug->socket_window, &user_data);
+
+         if (user_data)
            {
-             g_warning (G_STRLOC "Can't create GtkPlug as child of non-GtkSocket");
-             plug->socket_window = NULL;
+             if (GTK_IS_SOCKET (user_data))
+               _gtk_plug_add_to_socket (plug, user_data);
+             else
+               {
+                 g_warning (G_STRLOC "Can't create GtkPlug as child of non-GtkSocket");
+                 plug->socket_window = NULL;
+               }
            }
+         else
+           g_object_ref (plug->socket_window);
        }
+      else
+       plug->socket_window = gdk_window_foreign_new_for_display (display, socket_id);
 
       if (plug->socket_window) {
        g_signal_emit (plug, plug_signals[EMBEDDED], 0);