diff --git a/src/gcal-manager.c b/src/gcal-manager.c index 892e14cc..0b570f41 100644 --- a/src/gcal-manager.c +++ b/src/gcal-manager.c @@ -100,7 +100,9 @@ enum { PROP_0, PROP_DEFAULT_CALENDAR, + PROP_LOADING, PROP_SETTINGS, + NUM_PROPS }; enum @@ -109,13 +111,12 @@ enum SOURCE_CHANGED, SOURCE_REMOVED, SOURCE_ENABLED, - LOAD_COMPLETED, QUERY_COMPLETED, - GOA_CLIENT_READY, NUM_SIGNALS }; -static guint signals[NUM_SIGNALS] = { 0, }; +static guint signals[NUM_SIGNALS] = { 0, }; +static GParamSpec *properties[NUM_PROPS] = { NULL, }; /* -- start: threading related code provided by Milan Crha */ typedef struct { @@ -346,8 +347,9 @@ on_client_connected (GObject *source_object, source = e_client_get_source (E_CLIENT (source_object)); manager->sources_at_launch--; + if (manager->sources_at_launch == 0) - g_signal_emit (user_data, signals[LOAD_COMPLETED], 0); + g_object_notify_by_pspec (G_OBJECT (manager), properties[PROP_LOADING]); error = NULL; client = E_CAL_CLIENT (e_cal_client_connect_finish (result, &error)); @@ -746,8 +748,6 @@ gcal_manager_client_ready_cb (GObject *source, manager->goa_client = goa_client_new_finish (result, &error); manager->goa_client_ready = TRUE; - g_signal_emit (user_data, signals[GOA_CLIENT_READY], 0, manager->goa_client); - if (error != NULL) { g_warning ("%s: Error retrieving GoaClient: %s", @@ -757,6 +757,8 @@ gcal_manager_client_ready_cb (GObject *source, g_error_free (error); } + g_object_notify_by_pspec (G_OBJECT (manager), properties[PROP_LOADING]); + GCAL_EXIT; } @@ -972,6 +974,10 @@ gcal_manager_get_property (GObject *object, g_value_take_object (value, e_source_registry_ref_default_calendar (self->source_registry)); break; + case PROP_LOADING: + g_value_set_boolean (value, gcal_manager_get_loading (self)); + break; + case PROP_SETTINGS: g_value_set_object (value, self->settings); return; @@ -995,22 +1001,40 @@ gcal_manager_class_init (GcalManagerClass *klass) object_class->set_property = gcal_manager_set_property; object_class->get_property = gcal_manager_get_property; - /* properties */ - g_object_class_install_property (object_class, - PROP_DEFAULT_CALENDAR, - g_param_spec_object ("default-calendar", - "Default calendar", - "The default calendar", - E_TYPE_SOURCE, - G_PARAM_READWRITE)); + /** + * GcalManager:default-calendar: + * + * The default calendar. + */ + properties[PROP_DEFAULT_CALENDAR] = g_param_spec_object ("default-calendar", + "Default calendar", + "The default calendar", + E_TYPE_SOURCE, + G_PARAM_READWRITE); - g_object_class_install_property (object_class, - PROP_SETTINGS, - g_param_spec_object ("settings", - "Application settings", - "The settings of the application passed down from GcalApplication", - G_TYPE_SETTINGS, - G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); + /** + * GcalManager:loading: + * + * Whether the manager is loading or not. + */ + properties[PROP_LOADING] = g_param_spec_boolean ("loading", + "Loading", + "Whether it's still loading or not", + TRUE, + G_PARAM_READABLE); + + /** + * GcalManager:settings: + * + * The settings. + */ + properties[PROP_SETTINGS] = g_param_spec_object ("settings", + "Application settings", + "The settings of the application passed down from GcalApplication", + G_TYPE_SETTINGS, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + + g_object_class_install_properties (object_class, NUM_PROPS, properties); /* signals */ signals[SOURCE_ADDED] = g_signal_new ("source-added", @@ -1047,13 +1071,6 @@ gcal_manager_class_init (GcalManagerClass *klass) E_TYPE_SOURCE, G_TYPE_BOOLEAN); - signals[LOAD_COMPLETED] = g_signal_new ("load-completed", - GCAL_TYPE_MANAGER, - G_SIGNAL_RUN_LAST, - 0, NULL, NULL, NULL, - G_TYPE_NONE, - 0); - signals[QUERY_COMPLETED] = g_signal_new ("query-completed", GCAL_TYPE_MANAGER, G_SIGNAL_RUN_LAST, @@ -1061,14 +1078,6 @@ gcal_manager_class_init (GcalManagerClass *klass) NULL, NULL, NULL, G_TYPE_NONE, 0); - - signals[GOA_CLIENT_READY] = g_signal_new ("goa-client-ready", - GCAL_TYPE_MANAGER, - G_SIGNAL_RUN_LAST, - 0, NULL, NULL, NULL, - G_TYPE_NONE, - 1, - GOA_TYPE_CLIENT); } static void @@ -1805,11 +1814,11 @@ gcal_manager_get_events (GcalManager *manager, } gboolean -gcal_manager_load_completed (GcalManager *self) +gcal_manager_get_loading (GcalManager *self) { g_return_val_if_fail (GCAL_IS_MANAGER (self), FALSE); - return self->sources_at_launch == 0; + return !self->goa_client_ready || self->sources_at_launch > 0; } GcalEvent* @@ -1847,16 +1856,6 @@ gcal_manager_get_event_from_shell_search (GcalManager *manager, GCAL_RETURN (new_event); } -gboolean -gcal_manager_is_goa_client_ready (GcalManager *manager) -{ - g_return_val_if_fail (GCAL_IS_MANAGER (manager), FALSE); - - GCAL_ENTRY; - - GCAL_RETURN (manager->goa_client_ready); -} - GoaClient* gcal_manager_get_goa_client (GcalManager *manager) { diff --git a/src/gcal-manager.h b/src/gcal-manager.h index 507b2c36..a368546c 100644 --- a/src/gcal-manager.h +++ b/src/gcal-manager.h @@ -104,11 +104,9 @@ GList* gcal_manager_get_events (GcalManager icaltimetype *range_start, icaltimetype *range_end); -gboolean gcal_manager_load_completed (GcalManager *self); +gboolean gcal_manager_get_loading (GcalManager *self); /* Online Accounts */ -gboolean gcal_manager_is_goa_client_ready (GcalManager *manager); - GoaClient* gcal_manager_get_goa_client (GcalManager *manager); diff --git a/src/gcal-shell-search-provider.c b/src/gcal-shell-search-provider.c index 9e08a946..1fd03020 100644 --- a/src/gcal-shell-search-provider.c +++ b/src/gcal-shell-search-provider.c @@ -78,7 +78,7 @@ execute_search (GcalShellSearchProvider *search_provider) priv = search_provider->priv; - if (!gcal_manager_load_completed (priv->manager)) + if (gcal_manager_get_loading (priv->manager)) return TRUE; zone = gcal_manager_get_system_timezone (priv->manager); @@ -151,7 +151,7 @@ schedule_search (GcalShellSearchProvider *search_provider, priv->pending_search->invocation = g_object_ref (invocation); priv->pending_search->terms = g_strdupv (terms); - if (!gcal_manager_load_completed (priv->manager)) + if (gcal_manager_get_loading (priv->manager)) { priv->scheduled_search_id = g_timeout_add_seconds (1, (GSourceFunc) execute_search, search_provider); return; diff --git a/src/gcal-source-dialog.c b/src/gcal-source-dialog.c index 67f1144a..b92f0984 100644 --- a/src/gcal-source-dialog.c +++ b/src/gcal-source-dialog.c @@ -16,8 +16,9 @@ * along with this program. If not, see . */ -#define G_LOG_DOMAIN "GcaçSourceDialog" +#define G_LOG_DOMAIN "GcalSourceDialog" +#include "gcal-debug.h" #include "gcal-source-dialog.h" #include "gcal-utils.h" @@ -2143,16 +2144,24 @@ goa_account_removed_cb (GoaClient *client, } static void -goa_client_ready_cb (GcalSourceDialog *dialog, - GoaClient *client, - gpointer user_data) +loading_changed_cb (GcalSourceDialog *dialog) { + GoaClient *client; GList *accounts, *l; + GCAL_ENTRY; + g_return_if_fail (GCAL_IS_SOURCE_DIALOG (dialog)); - g_return_if_fail (GOA_IS_CLIENT (client)); + + if (gcal_manager_get_loading (dialog->manager)) + { + GCAL_TRACE_MSG ("Not loaded yet"); + GCAL_EXIT; + return; + } /* Add already fetched accounts */ + client = gcal_manager_get_goa_client (dialog->manager); accounts = goa_client_get_accounts (client); for (l = accounts; l != NULL; l = l->next) @@ -2162,7 +2171,12 @@ goa_client_ready_cb (GcalSourceDialog *dialog, g_signal_connect (client, "account-added", G_CALLBACK (goa_account_added_cb), dialog); g_signal_connect (client, "account-removed", G_CALLBACK (goa_account_removed_cb), dialog); + /* Once we loaded, no need to track it down again */ + g_signal_handlers_disconnect_by_func (dialog->manager, loading_changed_cb, dialog); + g_list_free (accounts); + + GCAL_EXIT; } /** @@ -2179,20 +2193,7 @@ gcal_source_dialog_set_manager (GcalSourceDialog *dialog, { dialog->manager = manager; - /* - * If the GoaClient is already loaded, fetch the online accounts - * directly. Otherwise, wait for it to be ready. - */ - if (gcal_manager_is_goa_client_ready (manager)) - { - goa_client_ready_cb (dialog, gcal_manager_get_goa_client (manager), NULL); - } - else - { - g_signal_connect_swapped (manager, "goa-client-ready", G_CALLBACK (goa_client_ready_cb), dialog); - } - - if (gcal_manager_load_completed (dialog->manager)) + if (!gcal_manager_get_loading (dialog->manager)) { GList *sources, *l; @@ -2201,6 +2202,13 @@ gcal_source_dialog_set_manager (GcalSourceDialog *dialog, for (l = sources; l != NULL; l = l->next) add_source (dialog->manager, l->data, gcal_manager_source_enabled (dialog->manager, l->data), dialog); } + else + { + g_signal_connect_swapped (manager, + "notify::loading", + G_CALLBACK (loading_changed_cb), + dialog); + } g_signal_connect (dialog->manager, "source-added", G_CALLBACK (add_source), dialog); g_signal_connect (dialog->manager, "source-removed", G_CALLBACK (remove_source), dialog); diff --git a/src/gcal-window.c b/src/gcal-window.c index 3e802d4f..b2a03c40 100644 --- a/src/gcal-window.c +++ b/src/gcal-window.c @@ -1242,7 +1242,7 @@ gcal_window_constructed (GObject *object) gtk_list_box_set_sort_func (GTK_LIST_BOX (window->calendar_listbox), (GtkListBoxSortFunc) calendar_listbox_sort_func, object, NULL); - if (gcal_manager_load_completed (window->manager)) + if (!gcal_manager_get_loading (window->manager)) { GList *sources, *l; sources = gcal_manager_get_sources_connected (window->manager);