From 58b68db327f2f02c251ef5b9c41f7623a3bf417f Mon Sep 17 00:00:00 2001 From: Not Zed Date: Tue, 3 Dec 2002 04:24:47 +0000 Subject: frobbed around with these till it exits without crashing. 2002-12-03 Not Zed * folder-browser.c (folder_browser_finalise/destroy): frobbed around with these till it exits without crashing. * message-list.c (message_list_destroy): made a destroy handler again (was dispose). Frobbed around with this and finalise till it can destroy without crashing. * message-browser.c (message_browser_new): ref/sink the folderbrowser. svn path=/trunk/; revision=18991 --- mail/message-list.c | 65 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 27 deletions(-) (limited to 'mail/message-list.c') diff --git a/mail/message-list.c b/mail/message-list.c index f6de16b362..e9f8856000 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -1260,48 +1260,64 @@ normalised_free (gpointer key, gpointer value, gpointer user_data) } static void -message_list_dispose(GObject *object) +message_list_destroy(GtkObject *object) { MessageList *message_list = MESSAGE_LIST (object); + if (message_list->async_event) { + mail_async_event_destroy(message_list->async_event); + message_list->async_event = NULL; + } + if (message_list->folder) { + /* need to do this before removing folder, folderinfo's might not exist after */ + if (message_list->uid_nodemap) { + g_hash_table_foreach(message_list->uid_nodemap, (GHFunc)clear_info, message_list); + g_hash_table_destroy (message_list->uid_nodemap); + } + save_tree_state(message_list); hide_save_state(message_list); + camel_object_unhook_event(message_list->folder, "folder_changed", folder_changed, message_list); + camel_object_unhook_event(message_list->folder, "message_changed", message_changed, message_list); + camel_object_unref (message_list->folder); + message_list->folder = NULL; + } + + if (message_list->extras) { + g_object_unref((message_list->extras)); + message_list->extras = NULL; } - G_OBJECT_CLASS (message_list_parent_class)->dispose(object); + if (message_list->model) { + g_object_unref((message_list->model)); + message_list->model = NULL; + } + + if (message_list->idle_id != 0) { + g_source_remove (message_list->idle_id); + message_list->idle_id = 0; + } + + if (message_list->seen_id) { + g_source_remove (message_list->seen_id); + message_list->seen_id = 0; + } + + GTK_OBJECT_CLASS (message_list_parent_class)->destroy(object); } static void message_list_finalise (GObject *object) { MessageList *message_list = MESSAGE_LIST (object); - - mail_async_event_destroy(message_list->async_event); g_hash_table_foreach (message_list->normalised_hash, normalised_free, NULL); g_hash_table_destroy (message_list->normalised_hash); - if (message_list->folder) { - camel_object_unhook_event(message_list->folder, "folder_changed", folder_changed, message_list); - camel_object_unhook_event(message_list->folder, "message_changed", message_changed, message_list); - camel_object_unref (message_list->folder); - } - if (message_list->thread_tree) camel_folder_thread_messages_unref(message_list->thread_tree); - if (message_list->extras) - g_object_unref((message_list->extras)); - if (message_list->model) - g_object_unref((message_list->model)); - - if (message_list->idle_id != 0) - g_source_remove (message_list->idle_id); - - if (message_list->seen_id) - g_source_remove (message_list->seen_id); - if (message_list->hidden) { g_hash_table_destroy(message_list->hidden); e_mempool_destroy(message_list->hidden_pool); @@ -1309,11 +1325,6 @@ message_list_finalise (GObject *object) message_list->hidden_pool = NULL; } - if (message_list->uid_nodemap) { - g_hash_table_foreach(message_list->uid_nodemap, (GHFunc)clear_info, message_list); - g_hash_table_destroy (message_list->uid_nodemap); - } - g_free(message_list->cursor_uid); g_mutex_free(message_list->hide_lock); @@ -1330,7 +1341,7 @@ message_list_class_init (GObjectClass *object_class) message_list_parent_class = g_type_class_ref(PARENT_TYPE); object_class->finalize = message_list_finalise; - object_class->dispose = message_list_dispose; + ((GtkObjectClass *)object_class)->destroy = message_list_destroy; message_list_signals[MESSAGE_SELECTED] = g_signal_new ("message_selected", -- cgit v1.2.3