]> Pileus Git - ~andy/gtk/commitdiff
GtkAction: Hold a reference to proxy widgets
authorColin Walters <walters@verbum.org>
Thu, 25 Aug 2011 18:50:30 +0000 (14:50 -0400)
committerColin Walters <walters@verbum.org>
Tue, 20 Dec 2011 20:36:48 +0000 (15:36 -0500)
Previously we expect that a proxy widget holds a reference to the
action via gtk_activatable_do_set_related_action().  However, it
is possible for the widget to still be in a floating state when
it adds itself to the the action.

This is a problem when gtk_action_get_proxies() gets called, because
we return floating objects back to the user.  And language bindings
aren't going to be expecting that.

Fix this by calling ref_sink() and unref().

https://bugzilla.gnome.org/show_bug.cgi?id=657367

gtk/gtkaction.c

index ad69d4f163ee457303e8f2f3c3d5f8566d860553..c24ee7859fb6d2b1aa5a6e00648a0fa92096f5cc 100644 (file)
@@ -716,6 +716,7 @@ static void
 remove_proxy (GtkAction *action,
              GtkWidget *proxy)
 {
+  g_object_unref (proxy);
   action->private_data->proxies = g_slist_remove (action->private_data->proxies, proxy);
 }
 
@@ -725,6 +726,8 @@ connect_proxy (GtkAction *action,
 {
   action->private_data->proxies = g_slist_prepend (action->private_data->proxies, proxy);
 
+  g_object_ref_sink (proxy);
+
   if (action->private_data->action_group)
     _gtk_action_group_emit_connect_proxy (action->private_data->action_group, action, proxy);