From 90340a01ab45830f2f392a54c729209eb12f7355 Mon Sep 17 00:00:00 2001 From: Jose Dapena Paz Date: Wed, 26 Aug 2009 12:29:47 +0200 Subject: [PATCH] Handle better finalize/last ref of model cases in ModestHeaderWindow * src/hildon2/modest-header-window.c: add different (more safe) handling of weak reference to model used to free signal handler of sort column (fixes NB#134642). --- src/hildon2/modest-header-window.c | 39 ++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/hildon2/modest-header-window.c b/src/hildon2/modest-header-window.c index cc14434..2ceee3d 100644 --- a/src/hildon2/modest-header-window.c +++ b/src/hildon2/modest-header-window.c @@ -100,6 +100,9 @@ struct _ModestHeaderWindowPrivate { GtkWidget *csm_menu; gdouble x_coord; gdouble y_coord; + + /* weak refs */ + GtkTreeModel *model_weak_ref; }; #define MODEST_HEADER_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_HEADER_WINDOW, \ @@ -169,6 +172,8 @@ static void on_horizontal_movement (HildonPannableArea *hildonpannable, gdouble initial_x, gdouble initial_y, gpointer user_data); +static void on_header_view_model_destroyed (gpointer user_data, + GObject *model); /* globals */ static GtkWindowClass *parent_class = NULL; @@ -243,6 +248,7 @@ modest_header_window_init (ModestHeaderWindow *obj) priv->progress_hint = FALSE; priv->queue_change_handler = 0; priv->sort_column_handler = 0; + priv->model_weak_ref = NULL; priv->current_store_account = NULL; priv->sort_button = NULL; priv->new_message_button = NULL; @@ -262,6 +268,18 @@ modest_header_window_finalize (GObject *obj) priv = MODEST_HEADER_WINDOW_GET_PRIVATE(obj); + if (priv->model_weak_ref) { + g_object_weak_unref ((GObject *) priv->model_weak_ref, + on_header_view_model_destroyed, + obj); + if (g_signal_handler_is_connected (G_OBJECT (priv->model_weak_ref), + priv->sort_column_handler)) { + g_signal_handler_disconnect (G_OBJECT (priv->model_weak_ref), + priv->sort_column_handler); + } + on_header_view_model_destroyed (obj, (GObject *) priv->model_weak_ref); + } + folder = modest_header_view_get_folder ((ModestHeaderView *) priv->header_view); if (folder) { tny_folder_sync_async (folder, FALSE, NULL, NULL, NULL); @@ -546,13 +564,9 @@ on_header_view_model_destroyed (gpointer user_data, return; priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); + priv->model_weak_ref = NULL; - if (g_signal_handler_is_connected (G_OBJECT (model), - priv->sort_column_handler)) { - g_signal_handler_disconnect (G_OBJECT (model), - priv->sort_column_handler); - priv->sort_column_handler = 0; - } + priv->sort_column_handler = 0; } static void @@ -564,6 +578,18 @@ on_header_view_model_changed (GObject *gobject, ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (gobject)); + if (priv->model_weak_ref ) { + g_object_weak_unref ((GObject *) priv->model_weak_ref, + on_header_view_model_destroyed, + self); + if (g_signal_handler_is_connected (G_OBJECT (priv->model_weak_ref), + priv->sort_column_handler)) { + g_signal_handler_disconnect (G_OBJECT (priv->model_weak_ref), + priv->sort_column_handler); + } + on_header_view_model_destroyed (self, (GObject *) priv->model_weak_ref); + } + if (!model) return; @@ -572,6 +598,7 @@ on_header_view_model_changed (GObject *gobject, "sort-column-changed", G_CALLBACK (on_sort_column_changed), self); + priv->model_weak_ref = model; g_object_weak_ref ((GObject *) model, on_header_view_model_destroyed, self); } -- 1.7.9.5