[gtk+/gtk-2-18] Fix a refcounting issues in GtkPlug



commit a14c8aba5d37df1e0aed15e7fc03d763936d0cb2
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Feb 8 20:08:22 2010 -0500

    Fix a refcounting issues in GtkPlug
    
    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.
    (cherry picked from commit beddf67e562e1670d692cb9ba0a2546713cc80fc)

 gtk/gtkplug.c |   35 +++++++++++++++++++++--------------
 1 files changed, 21 insertions(+), 14 deletions(-)
---
diff --git a/gtk/gtkplug.c b/gtk/gtkplug.c
index 4c31ea7..3b1af66 100644
--- a/gtk/gtkplug.c
+++ b/gtk/gtkplug.c
@@ -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);



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