diff --git a/src/core/gcal-calendar.c b/src/core/gcal-calendar.c index 922efa51..652790e4 100644 --- a/src/core/gcal-calendar.c +++ b/src/core/gcal-calendar.c @@ -29,6 +29,7 @@ typedef struct { GdkRGBA color; ESource *source; + ESource *parent_source; ECalClient *client; gboolean read_only; @@ -68,6 +69,7 @@ enum PROP_COLOR, PROP_ID, PROP_NAME, + PROP_PARENT_SOURCE, PROP_READ_ONLY, PROP_SOURCE, PROP_VISIBLE, @@ -345,6 +347,7 @@ gcal_calendar_finalize (GObject *object) g_clear_object (&priv->client); g_clear_object (&priv->source); + g_clear_object (&priv->parent_source); g_mutex_clear (&priv->shared.mutex); @@ -378,6 +381,10 @@ gcal_calendar_get_property (GObject *object, g_value_set_string (value, e_source_get_display_name (priv->source)); break; + case PROP_PARENT_SOURCE: + g_value_set_object (value, priv->parent_source); + break; + case PROP_READ_ONLY: g_value_set_boolean (value, gcal_calendar_is_read_only (self)); break; @@ -422,6 +429,11 @@ gcal_calendar_set_property (GObject *object, gcal_calendar_set_name (self, g_value_get_string (value)); break; + case PROP_PARENT_SOURCE: + g_assert (priv->parent_source == NULL); + priv->parent_source = g_value_dup_object (value); + break; + case PROP_READ_ONLY: g_assert_not_reached (); break; @@ -473,6 +485,10 @@ gcal_calendar_class_init (GcalCalendarClass *klass) NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + properties[PROP_PARENT_SOURCE] = g_param_spec_object ("parent-source", NULL, NULL, + E_TYPE_SOURCE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + properties[PROP_READ_ONLY] = g_param_spec_boolean ("read-only", "Read-only", "Whether the calendar is read-only or not", @@ -516,6 +532,7 @@ gcal_calendar_init (GcalCalendar *self) */ void gcal_calendar_new (ESource *source, + ESource *parent_source, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) @@ -526,6 +543,7 @@ gcal_calendar_new (ESource *source, callback, user_data, "source", source, + "parent-source", parent_source, NULL); } @@ -664,6 +682,24 @@ gcal_calendar_set_name (GcalCalendar *self, g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_NAME]); } +/** + * gcal_calendar_get_parent_source: + * @self: a #GcalCalendar + * + * Retrieves the parent #ESource of @self. + * + * Returns: (transfer none): an #ESource + */ +ESource* +gcal_calendar_get_parent_source (GcalCalendar *self) +{ + GcalCalendarPrivate *priv = gcal_calendar_get_instance_private (self); + + g_return_val_if_fail (GCAL_IS_CALENDAR (self), NULL); + + return priv->parent_source; +} + /** * gcal_calendar_is_read_only: * @self: a #GcalCalendar diff --git a/src/core/gcal-calendar.h b/src/core/gcal-calendar.h index 069d66f4..c69b104c 100644 --- a/src/core/gcal-calendar.h +++ b/src/core/gcal-calendar.h @@ -50,6 +50,7 @@ struct _GcalCalendarClass GQuark gcal_calendar_error_quark (void); void gcal_calendar_new (ESource *source, + ESource *parent_source, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); @@ -71,6 +72,8 @@ const gchar* gcal_calendar_get_name (GcalCalendar void gcal_calendar_set_name (GcalCalendar *self, const gchar *name); +ESource* gcal_calendar_get_parent_source (GcalCalendar *self); + gboolean gcal_calendar_is_read_only (GcalCalendar *self); ESource* gcal_calendar_get_source (GcalCalendar *self); diff --git a/src/core/gcal-manager.c b/src/core/gcal-manager.c index 7ad3954c..97f733cb 100644 --- a/src/core/gcal-manager.c +++ b/src/core/gcal-manager.c @@ -296,6 +296,8 @@ static void load_source (GcalManager *self, ESource *source) { + g_autoptr (ESource) parent = NULL; + GCAL_ENTRY; if (g_hash_table_contains (self->clients, source)) @@ -306,7 +308,9 @@ load_source (GcalManager *self, return; } - gcal_calendar_new (source, self->async_ops, on_calendar_created_cb, self); + parent = e_source_registry_ref_source (self->source_registry, e_source_get_parent (source)); + + gcal_calendar_new (source, parent, self->async_ops, on_calendar_created_cb, self); GCAL_EXIT; }