diff --git a/ChangeLog b/ChangeLog index efe739adcd..04ce75206a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-12-31 Emmanuele Bassi + + * gtk/gtkrecentchoosermenu.c: Move the signal and idle + disconnections into the dispose function, as well as the + object unrefs; reset every handler id and the + pointers. (suggested by Paolo Borelli, #390873) + 2006-12-31 Matthias Clasen * gtk/gtkprintoperation-win32.c: Include windows.h (#391229, diff --git a/gtk/gtkrecentchoosermenu.c b/gtk/gtkrecentchoosermenu.c index eba0068872..12b9ca274e 100644 --- a/gtk/gtkrecentchoosermenu.c +++ b/gtk/gtkrecentchoosermenu.c @@ -94,6 +94,7 @@ enum { #define GTK_RECENT_CHOOSER_MENU_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_RECENT_CHOOSER_MENU, GtkRecentChooserMenuPrivate)) static void gtk_recent_chooser_menu_finalize (GObject *object); +static void gtk_recent_chooser_menu_dispose (GObject *object); static GObject *gtk_recent_chooser_menu_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_params); @@ -181,6 +182,7 @@ gtk_recent_chooser_menu_class_init (GtkRecentChooserMenuClass *klass) GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->constructor = gtk_recent_chooser_menu_constructor; + gobject_class->dispose = gtk_recent_chooser_menu_dispose; gobject_class->finalize = gtk_recent_chooser_menu_finalize; gobject_class->set_property = gtk_recent_chooser_menu_set_property; gobject_class->get_property = gtk_recent_chooser_menu_get_property; @@ -240,32 +242,53 @@ gtk_recent_chooser_menu_finalize (GObject *object) GtkRecentChooserMenu *menu = GTK_RECENT_CHOOSER_MENU (object); GtkRecentChooserMenuPrivate *priv = menu->priv; - g_signal_handler_disconnect (priv->manager, priv->manager_changed_id); - priv->manager_changed_id = 0; - - if (priv->populate_id) - g_source_remove (priv->populate_id); - priv->manager = NULL; if (priv->sort_data_destroy) { priv->sort_data_destroy (priv->sort_data); - priv->sort_data_destroy = NULL; - priv->sort_data = NULL; - priv->sort_func = NULL; } - - if (priv->tooltips) - g_object_unref (priv->tooltips); - - if (priv->current_filter) - g_object_unref (priv->current_filter); + + priv->sort_data = NULL; + priv->sort_func = NULL; G_OBJECT_CLASS (gtk_recent_chooser_menu_parent_class)->finalize (object); } +static void +gtk_recent_chooser_menu_dispose (GObject *object) +{ + GtkRecentChooserMenu *menu = GTK_RECENT_CHOOSER_MENU (object); + GtkRecentChooserMenuPrivate *priv = menu->priv; + + if (priv->manager_changed_id) + { + g_signal_handler_disconnect (priv->manager, priv->manager_changed_id); + priv->manager_changed_id = 0; + } + + if (priv->populate_id) + { + g_source_remove (priv->populate_id); + priv->populate_id = 0; + } + + if (priv->tooltips) + { + g_object_unref (priv->tooltips); + priv->tooltips = NULL; + } + + if (priv->current_filter) + { + g_object_unref (priv->current_filter); + priv->current_filter = NULL; + } + + G_OBJECT_CLASS (gtk_recent_chooser_menu_parent_class)->dispose (object); +} + static GObject * gtk_recent_chooser_menu_constructor (GType type, guint n_construct_properties,