[gnome-todo/gnome-3-24] eds: fix crash when changing default provider



commit 0c89621dad14db7f1af2442ae1fb78c7f7c0ad16
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Fri May 5 16:38:56 2017 -0300

    eds: fix crash when changing default provider
    
    When we change the default ESource in ESourceRegistry, it
    emits a notify:: signal that we listen to. The problem is
    that many GtdProviderEds instances were listening to the
    same ESourceRegistry signal, without checking the if the
    provider is itself.
    
    This leads to a crash when selecting a tasklist from another
    provider than the default. For example, by creating a new task
    at an Online Account list, when the default is the local one.
    
    Fix that by always checking if the provider of the new default
    task list is itself, and adjusting the order of methods when
    setting the default task list.

 plugins/eds/gtd-provider-eds.c |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)
---
diff --git a/plugins/eds/gtd-provider-eds.c b/plugins/eds/gtd-provider-eds.c
index f8ea74e..f5c0788 100644
--- a/plugins/eds/gtd-provider-eds.c
+++ b/plugins/eds/gtd-provider-eds.c
@@ -78,13 +78,17 @@ gtd_provider_eds_set_default (GtdProviderEds *self,
                               GtdTaskList    *list)
 {
   GtdProviderEdsPrivate *priv;
+  GtdManager *manager;
   ESource *source;
 
   priv = gtd_provider_eds_get_instance_private (self);
   source = gtd_task_list_eds_get_source (GTD_TASK_LIST_EDS (list));
+  manager = gtd_manager_get_default ();
 
-  gtd_manager_set_default_provider (gtd_manager_get_default (), GTD_PROVIDER (self));
   e_source_registry_set_default_task_list (priv->source_registry, source);
+
+  if (gtd_manager_get_default_provider (manager) != (GtdProvider*) self)
+    gtd_manager_set_default_provider (manager, GTD_PROVIDER (self));
 }
 
 static void
@@ -420,7 +424,7 @@ default_tasklist_changed_cb (ESourceRegistry *source_registry,
   list = g_object_get_data (G_OBJECT (default_source), "task-list");
 
   /* The list might not be loaded yet */
-  if (!list)
+  if (!list || gtd_task_list_get_provider (list) != (GtdProvider*) self)
     goto out;
 
   g_object_notify (G_OBJECT (self), "default-task-list");


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]