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



commit 8f190f12e6e2f8551168261744e303d4e6ceaec1
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 3345d4c..b7b33e7 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
@@ -424,7 +428,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]