From 9af65c8f1fbcc6d7235fdd33dc553fe71b4008db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erick=20P=C3=A9rez=20Castellanos?= Date: Sun, 21 Dec 2014 13:06:47 -0500 Subject: [PATCH] manager: hold a reference of the application's settings We need to keep on the settings the list of the disabled sources Moved code from ::init vfunc to ::constructed vfunc in order to wait for construction properties to be set --- src/gcal-application.c | 2 +- src/gcal-manager.c | 131 +++++++++++++++++++++++++++++++---------- src/gcal-manager.h | 2 +- 3 files changed, 103 insertions(+), 32 deletions(-) diff --git a/src/gcal-application.c b/src/gcal-application.c index 91e473d0..798931ca 100644 --- a/src/gcal-application.c +++ b/src/gcal-application.c @@ -211,7 +211,7 @@ gcal_application_startup (GApplication *app) g_object_unref (priv->provider); } - priv->manager = gcal_manager_new (); + priv->manager = gcal_manager_new_with_settings (priv->settings); gcal_application_set_app_menu (app); } diff --git a/src/gcal-manager.c b/src/gcal-manager.c index 275da1bc..0cdfce01 100644 --- a/src/gcal-manager.c +++ b/src/gcal-manager.c @@ -51,8 +51,12 @@ typedef struct GCancellable *async_ops; + gchar **disabled_sources; /* timezone */ icaltimezone *system_timezone; + + /* property */ + GSettings *settings; } GcalManagerPrivate; struct _MoveEventData @@ -66,6 +70,12 @@ struct _MoveEventData typedef struct _MoveEventData MoveEventData; +enum +{ + PROP_0, + PROP_SETTINGS, +}; + enum { SOURCE_ACTIVATED, @@ -112,8 +122,20 @@ static void remove_source (GcalManager *mana /* class_init && init vfuncs */ +static void gcal_manager_constructed (GObject *object); + static void gcal_manager_finalize (GObject *object); +static void gcal_manager_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); + +static void gcal_manager_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); + G_DEFINE_TYPE_WITH_PRIVATE (GcalManager, gcal_manager, G_TYPE_OBJECT) /* -- start: threading related code provided by Milan Crha */ @@ -443,7 +465,18 @@ remove_source (GcalManager *manager, static void gcal_manager_class_init (GcalManagerClass *klass) { + G_OBJECT_CLASS (klass)->constructed = gcal_manager_constructed; G_OBJECT_CLASS (klass)->finalize = gcal_manager_finalize; + G_OBJECT_CLASS (klass)->set_property = gcal_manager_set_property; + G_OBJECT_CLASS (klass)->get_property = gcal_manager_get_property; + + /* properties */ + g_object_class_install_property (G_OBJECT_CLASS (klass), 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)); /* signals */ signals[SOURCE_ACTIVATED] = g_signal_new ("source-activated", GCAL_TYPE_MANAGER, G_SIGNAL_RUN_LAST, @@ -464,24 +497,27 @@ gcal_manager_class_init (GcalManagerClass *klass) static void gcal_manager_init (GcalManager *self) +{ + ; +} + +static void +gcal_manager_constructed (GObject *object) { GcalManagerPrivate *priv; - GError *error; - GList *sources; - GList *l; + GList *sources, *l; + GError *error = NULL; - priv = gcal_manager_get_instance_private (self); + priv = gcal_manager_get_instance_private (GCAL_MANAGER (object)); + priv->disabled_sources = g_settings_get_strv (priv->settings, "disabled-sources"); priv->system_timezone = e_cal_util_get_system_timezone (); - priv->clients = g_hash_table_new_full ((GHashFunc) e_source_hash, - (GEqualFunc) e_source_equal, - g_object_unref, - (GDestroyNotify) free_unit_data); + priv->clients = g_hash_table_new_full ((GHashFunc) e_source_hash, (GEqualFunc) e_source_equal, + g_object_unref, (GDestroyNotify) free_unit_data); /* reading sources and schedule its connecting */ - error = NULL; priv->source_registry = e_source_registry_new_sync (NULL, &error); if (priv->source_registry == NULL) { @@ -490,34 +526,22 @@ gcal_manager_init (GcalManager *self) return; } - sources = e_source_registry_list_enabled (priv->source_registry, - E_SOURCE_EXTENSION_CALENDAR); - + sources = e_source_registry_list_enabled (priv->source_registry, E_SOURCE_EXTENSION_CALENDAR); for (l = sources; l != NULL; l = l->next) - load_source (self, l->data); - + load_source (GCAL_MANAGER (object), l->data); g_list_free (sources); - g_signal_connect_swapped (priv->source_registry, - "source-added", - G_CALLBACK (load_source), - self); - - g_signal_connect_swapped (priv->source_registry, - "source-removed", - G_CALLBACK (remove_source), - self); + g_signal_connect_swapped (priv->source_registry, "source-added", G_CALLBACK (load_source), object); + g_signal_connect_swapped (priv->source_registry, "source-removed", G_CALLBACK (remove_source), object); /* create data model */ priv->e_data_model = e_cal_data_model_new (submit_thread_job); priv->search_data_model = e_cal_data_model_new (submit_thread_job); e_cal_data_model_set_expand_recurrences (priv->e_data_model, TRUE); - e_cal_data_model_set_timezone (priv->e_data_model, - priv->system_timezone); + e_cal_data_model_set_timezone (priv->e_data_model, priv->system_timezone); e_cal_data_model_set_expand_recurrences (priv->search_data_model, TRUE); - e_cal_data_model_set_timezone (priv->search_data_model, - priv->system_timezone); + e_cal_data_model_set_timezone (priv->search_data_model, priv->system_timezone); } static void @@ -527,6 +551,10 @@ gcal_manager_finalize (GObject *object) priv = gcal_manager_get_instance_private (GCAL_MANAGER (object)); + if (priv->settings != NULL) + g_object_unref (priv->settings); + g_strfreev (priv->disabled_sources); + if (priv->e_data_model != NULL) g_object_unref (priv->e_data_model); if (priv->search_data_model != NULL) @@ -535,18 +563,61 @@ gcal_manager_finalize (GObject *object) g_hash_table_destroy (priv->clients); } +static void +gcal_manager_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GcalManagerPrivate *priv; + + priv = gcal_manager_get_instance_private (GCAL_MANAGER (object)); + + switch (property_id) + { + case PROP_SETTINGS: + if (priv->settings != NULL) + g_object_unref (priv->settings); + priv->settings = g_value_dup_object (value); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +gcal_manager_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GcalManagerPrivate *priv; + + priv = gcal_manager_get_instance_private (GCAL_MANAGER (object)); + + switch (property_id) + { + case PROP_SETTINGS: + g_value_set_object (value, priv->settings); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + /* Public API */ /** - * gcal_manager_new: + * gcal_manager_new_with_settings: + * @settings: * * Since: 0.0.1 * Return value: the new #GcalManager * Returns: (transfer full): **/ GcalManager* -gcal_manager_new (void) +gcal_manager_new_with_settings (GSettings *settings) { - return GCAL_MANAGER (g_object_new (GCAL_TYPE_MANAGER, NULL)); + return GCAL_MANAGER (g_object_new (GCAL_TYPE_MANAGER, "settings", settings, NULL)); } /** diff --git a/src/gcal-manager.h b/src/gcal-manager.h index 94475ead..44edfcb1 100644 --- a/src/gcal-manager.h +++ b/src/gcal-manager.h @@ -59,7 +59,7 @@ typedef struct GType gcal_manager_get_type (void); -GcalManager* gcal_manager_new (void); +GcalManager* gcal_manager_new_with_settings (GSettings *settings); GList* gcal_manager_get_sources (GcalManager *manager);