From 17d7865c512d65aca2b12dc0a980c3309742319a Mon Sep 17 00:00:00 2001 From: Sergio Villar Senin Date: Thu, 28 Jun 2007 07:21:17 +0000 Subject: [PATCH] * Fixed an issue whith signal handlers when unregistering windows * Make a more fine-grained gdk threads locking * Added msg view window registration in the dbus callbacks * Removed an uneeded gdk_threads_enter/leave pmo-trunk-r2469 --- src/dbus_api/modest-dbus-callbacks.c | 44 ++++++++++++----------- src/maemo/modest-maemo-global-settings-dialog.c | 7 ++-- src/maemo/modest-main-window.c | 3 +- src/modest-mail-operation.c | 8 +++-- src/widgets/modest-attachment-view.c | 9 +++-- src/widgets/modest-header-view.c | 17 ++++----- src/widgets/modest-window-mgr.c | 8 ++--- 7 files changed, 46 insertions(+), 50 deletions(-) diff --git a/src/dbus_api/modest-dbus-callbacks.c b/src/dbus_api/modest-dbus-callbacks.c index 73bb627..d341be1 100644 --- a/src/dbus_api/modest-dbus-callbacks.c +++ b/src/dbus_api/modest-dbus-callbacks.c @@ -181,12 +181,9 @@ static gchar* uri_parse_mailto (const gchar* mailto, GSList** list_items_and_val return result_to; } - static gboolean on_idle_mail_to(gpointer user_data) { - gdk_threads_enter (); - /* This is based on the implemenation of main.c:start_uil(): */ gchar *uri = (gchar*)user_data; @@ -260,11 +257,16 @@ on_idle_mail_to(gpointer user_data) } else { tny_folder_add_msg (folder, msg, NULL); /* TODO: check err */ - + gdk_threads_enter (); + ModestWindow *win = modest_msg_edit_window_new (msg, account_name); + modest_window_mgr_register_window (modest_runtime_get_window_mgr (), win); gtk_widget_show_all (GTK_WIDGET (win)); + + gdk_threads_leave (); g_object_unref (G_OBJECT(folder)); + g_object_unref (win); } g_object_unref (G_OBJECT(msg)); @@ -284,8 +286,6 @@ on_idle_mail_to(gpointer user_data) g_free(to); g_free(uri); - - gdk_threads_leave (); return FALSE; /* Do not call this callback again. */ } @@ -316,8 +316,6 @@ static gint on_mail_to(GArray * arguments, gpointer data, osso_rpc_t * retval) static gboolean on_idle_compose_mail(gpointer user_data) { - gdk_threads_enter (); - ComposeMailIdleData *idle_data = (ComposeMailIdleData*)user_data; gchar **list = NULL; gint i = 0; @@ -361,7 +359,9 @@ on_idle_compose_mail(gpointer user_data) } else { tny_folder_add_msg (folder, msg, NULL); /* TODO: check err */ - + + gdk_threads_enter (); + ModestWindow *win = modest_msg_edit_window_new (msg, account_name); /* it seems Sketch at least sends a leading ',' -- take that into account, @@ -378,10 +378,14 @@ on_idle_compose_mail(gpointer user_data) (ModestMsgEditWindow *)win, list[i]); } g_strfreev(list); - + + modest_window_mgr_register_window (modest_runtime_get_window_mgr (), win); gtk_widget_show_all (GTK_WIDGET (win)); + + gdk_threads_leave (); g_object_unref (G_OBJECT(folder)); + g_object_unref (win); } g_object_unref (G_OBJECT(msg)); @@ -402,8 +406,6 @@ on_idle_compose_mail(gpointer user_data) g_free (account_name); - gdk_threads_leave (); - return FALSE; /* Do not call this callback again. */ } @@ -516,8 +518,6 @@ out: static gboolean on_idle_open_message (gpointer user_data) { - gdk_threads_enter (); - ModestWindow *msg_view; TnyMsg *msg; TnyAccount *account; @@ -534,7 +534,6 @@ on_idle_open_message (gpointer user_data) if (msg == NULL) { g_debug (" %s: message not found.", __FUNCTION__); - gdk_threads_leave (); return FALSE; } g_debug (" %s: Found message.", __FUNCTION__); @@ -543,17 +542,20 @@ on_idle_open_message (gpointer user_data) account_name = tny_account_get_name (account); msg_uid = tny_header_get_uid (header); + gdk_threads_enter (); + msg_view = modest_msg_view_window_new (msg, account_name, msg_uid); - /* TODO: does that leak the msg_view ?! */ + modest_window_mgr_register_window (modest_runtime_get_window_mgr (), msg_view); gtk_widget_show_all (GTK_WIDGET (msg_view)); + gdk_threads_leave (); + g_object_unref (header); g_object_unref (account); - - gdk_threads_leave (); + g_object_unref (msg_view); return FALSE; /* Do not call this callback again. */ } @@ -679,9 +681,10 @@ on_delete_message (GArray *arguments, gpointer data, osso_rpc_t *retval) static gboolean on_idle_send_receive(gpointer user_data) { - gdk_threads_enter (); ModestWindow *win; + gdk_threads_enter (); + /* Pick the main window if it exists */ win = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()); @@ -719,8 +722,7 @@ on_idle_open_default_inbox(gpointer user_data) /* Get the folder view */ GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), MODEST_WIDGET_TYPE_FOLDER_VIEW); - modest_folder_view_select_first_inbox_or_local ( - MODEST_FOLDER_VIEW (folder_view)); + modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (folder_view)); gdk_threads_leave (); diff --git a/src/maemo/modest-maemo-global-settings-dialog.c b/src/maemo/modest-maemo-global-settings-dialog.c index 5b967bb..6ffc736 100644 --- a/src/maemo/modest-maemo-global-settings-dialog.c +++ b/src/maemo/modest-maemo-global-settings-dialog.c @@ -151,8 +151,6 @@ typedef struct { static gboolean idle_select_default_focus (gpointer data) { - gdk_threads_enter (); - ModestGlobalSettingsDialogPrivate *ppriv; ModestMaemoGlobalSettingsDialogPrivate *priv; SwitchPageHelper *helper; @@ -164,13 +162,12 @@ idle_select_default_focus (gpointer data) /* Grab focus, we need to block in order to prevent a recursive call to this callback */ g_signal_handler_block (G_OBJECT (ppriv->notebook), priv->switch_handler); + gdk_threads_enter (); gtk_widget_grab_focus (helper->focus_widget); + gdk_threads_leave (); g_signal_handler_unblock (G_OBJECT (ppriv->notebook), priv->switch_handler); - g_free (helper); - gdk_threads_leave (); - return FALSE; } diff --git a/src/maemo/modest-main-window.c b/src/maemo/modest-main-window.c index c9f5fe0..2d74fc3 100644 --- a/src/maemo/modest-main-window.c +++ b/src/maemo/modest-main-window.c @@ -1602,8 +1602,7 @@ _on_msg_count_changed (ModestHeaderView *header_view, else { modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS); - } - + } } void diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index e34560d..726cf6d 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -644,13 +644,17 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self, header = tny_msg_get_header (draft_msg); /* Remove the old draft expunging it */ tny_folder_remove_msg (folder, header, NULL); - tny_folder_sync (folder, TRUE, NULL); + tny_folder_sync (folder, TRUE, &(priv->error)); g_object_unref (header); } - tny_folder_add_msg (folder, msg, &(priv->error)); + if (!priv->error) + tny_folder_add_msg (folder, msg, &(priv->error)); + if (!priv->error) priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; + else + priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; end: if (msg) diff --git a/src/widgets/modest-attachment-view.c b/src/widgets/modest-attachment-view.c index c92bbdb..483c35e 100644 --- a/src/widgets/modest-attachment-view.c +++ b/src/widgets/modest-attachment-view.c @@ -129,8 +129,6 @@ modest_attachment_view_set_part (TnyMimePartView *self, TnyMimePart *mime_part) static gboolean get_size_idle_func (gpointer data) { - gdk_threads_enter (); - ModestAttachmentView *self = (ModestAttachmentView *) data; ModestAttachmentViewPriv *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (self); gssize readed_size; @@ -147,6 +145,8 @@ get_size_idle_func (gpointer data) if (tny_stream_is_eos (priv->get_size_stream)) { gchar *display_size; + gdk_threads_enter (); + display_size = modest_text_utils_get_display_size (priv->size); size_string = g_strdup_printf (" (%s)", display_size); g_free (display_size); @@ -158,10 +158,9 @@ get_size_idle_func (gpointer data) gtk_widget_queue_resize (priv->size_view); priv->get_size_stream = NULL; priv->get_size_idle_id = 0; - } - - gdk_threads_leave (); + gdk_threads_leave (); + } return (priv->get_size_stream != NULL); } diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index acf8f72..43886b6 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -1397,8 +1397,6 @@ on_focus_in (GtkWidget *self, static void idle_notify_headers_count_changed_destroy (gpointer data) { - gdk_threads_enter (); - HeadersCountChangedHelper *helper = NULL; g_return_if_fail (data != NULL); @@ -1406,15 +1404,11 @@ idle_notify_headers_count_changed_destroy (gpointer data) g_object_unref (helper->change); g_slice_free (HeadersCountChangedHelper, helper); - - gdk_threads_leave (); } static gboolean idle_notify_headers_count_changed (gpointer data) { - gdk_threads_enter (); - TnyFolder *folder = NULL; ModestHeaderViewPrivate *priv = NULL; HeadersCountChangedHelper *helper = NULL; @@ -1427,10 +1421,15 @@ idle_notify_headers_count_changed (gpointer data) folder = tny_folder_change_get_folder (helper->change); priv = MODEST_HEADER_VIEW_GET_PRIVATE (helper->self); + g_mutex_lock (priv->observers_lock); - /* Emmit signal to evaluate how headers changes affects to the window view */ - g_signal_emit (G_OBJECT(helper->self), signals[MSG_COUNT_CHANGED_SIGNAL], 0, folder, helper->change); + /* Emit signal to evaluate how headers changes affects to the window view */ + gdk_threads_enter (); + g_signal_emit (G_OBJECT(helper->self), + signals[MSG_COUNT_CHANGED_SIGNAL], + 0, folder, helper->change); + gdk_threads_leave (); /* Added or removed headers, so data stored on cliboard are invalid */ if (modest_email_clipboard_check_source_folder (priv->clipboard, folder)) @@ -1438,8 +1437,6 @@ idle_notify_headers_count_changed (gpointer data) g_mutex_unlock (priv->observers_lock); - gdk_threads_leave (); - return FALSE; } diff --git a/src/widgets/modest-window-mgr.c b/src/widgets/modest-window-mgr.c index f636dba..e8b583d 100644 --- a/src/widgets/modest-window-mgr.c +++ b/src/widgets/modest-window-mgr.c @@ -316,12 +316,10 @@ modest_window_mgr_unregister_window (ModestWindowMgr *self, handler_id = *tmp; g_hash_table_remove (priv->destroy_handlers, window); - /* Remove the reference to the window. We need to block the - destroy event handler to avoid recursive calls */ - g_signal_handler_block (window, handler_id); + /* Remove the reference to the window. Disconnect also the + delete-event handler, we won't need it anymore */ + g_signal_handler_disconnect (window, handler_id); gtk_widget_destroy (win->data); - if (G_IS_OBJECT (window)) - g_signal_handler_unblock (window, handler_id); /* If there are no more windows registered then exit program */ if (priv->window_list == NULL) { -- 1.7.9.5