From 61a15e4d9dd303c23b6e44af9d084e3f3c609192 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Fri, 20 Apr 2012 15:08:17 +0200 Subject: Bug #668481 - Account order is not remembered --- mail/e-mail-ui-session.c | 62 ++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 31 deletions(-) (limited to 'mail/e-mail-ui-session.c') diff --git a/mail/e-mail-ui-session.c b/mail/e-mail-ui-session.c index fd9a4a94f2..ee0b77cfe3 100644 --- a/mail/e-mail-ui-session.c +++ b/mail/e-mail-ui-session.c @@ -78,8 +78,6 @@ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), E_TYPE_MAIL_UI_SESSION, EMailUISessionPrivate)) -typedef struct _SourceContext SourceContext; - struct _EMailUISessionPrivate { FILE *filter_logfile; EMailAccountStore *account_store; @@ -87,6 +85,8 @@ struct _EMailUISessionPrivate { EAccountList *account_list; gulong account_changed_handler_id; + + guint update_services_id; }; enum { @@ -108,11 +108,6 @@ G_DEFINE_TYPE_WITH_CODE ( E_TYPE_MAIL_SESSION, G_IMPLEMENT_INTERFACE (E_TYPE_EXTENSIBLE, NULL)) -struct _SourceContext { - EMailUISession *session; - CamelService *service; -}; - /* Support for CamelSession.alert_user() *************************************/ static gpointer user_message_dialog; @@ -462,18 +457,6 @@ main_get_filter_driver (CamelSession *session, return driver; } -static void -source_context_free (SourceContext *context) -{ - if (context->session != NULL) - g_object_unref (context->session); - - if (context->service != NULL) - g_object_unref (context->service); - - g_slice_free (SourceContext, context); -} - static void mail_ui_session_dispose (GObject *object) { @@ -613,7 +596,6 @@ mail_ui_session_constructed (GObject *object) account_list, "account-changed", G_CALLBACK (mail_ui_session_account_changed_cb), session); priv->account_changed_handler_id = handler_id; - } static gint @@ -702,12 +684,31 @@ mail_ui_session_get_property (GObject *object, } static gboolean -mail_ui_session_add_service_cb (SourceContext *context) +mail_ui_session_update_services_cb (EMailUISession *mail_session) { EMailAccountStore *store; + GList *list, *iter; + + g_return_val_if_fail (mail_session != NULL, FALSE); + + mail_session->priv->update_services_id = 0; + + store = e_mail_ui_session_get_account_store (mail_session); + e_mail_account_store_reorder_freeze (store); + + list = camel_session_list_services (CAMEL_SESSION (mail_session)); + for (iter = list; iter; iter = iter->next) { + CamelService *service = iter->data; + + if (!service || !CAMEL_IS_STORE (service)) + continue; + + if (!e_mail_account_store_has_service (store, service)) + e_mail_account_store_add_service (store, service); + } - store = e_mail_ui_session_get_account_store (context->session); - e_mail_account_store_add_service (store, context->service); + g_list_free (list); + e_mail_account_store_reorder_thaw (store); return FALSE; } @@ -729,16 +730,15 @@ mail_ui_session_add_service (CamelSession *session, * from an idle callback so the service has a chance to * fully initialize first. */ if (CAMEL_IS_STORE (service)) { - SourceContext *context; + EMailUISession *mail_session = E_MAIL_UI_SESSION (session); - context = g_slice_new0 (SourceContext); - context->session = g_object_ref (session); - context->service = g_object_ref (service); + g_return_val_if_fail (mail_session != NULL, service); - g_idle_add_full ( - G_PRIORITY_DEFAULT_IDLE, - (GSourceFunc) mail_ui_session_add_service_cb, - context, (GDestroyNotify) source_context_free); + if (mail_session->priv->update_services_id == 0) + mail_session->priv->update_services_id = g_idle_add_full ( + G_PRIORITY_DEFAULT_IDLE, + (GSourceFunc) mail_ui_session_update_services_cb, + g_object_ref (session), g_object_unref); } return service; -- cgit v1.2.3