diff --git a/src/core/gcal-event.c b/src/core/gcal-event.c index 86a7b361..9a1f7a7d 100644 --- a/src/core/gcal-event.c +++ b/src/core/gcal-event.c @@ -1929,3 +1929,21 @@ gcal_event_format_date (GcalEvent *self) return g_steal_pointer (&formatted_string); } + +/** + * gcal_event_overlaps: + * @self: a #GcalEvent + * @range: a #GcalRange + * + * Returns: True if the event range overlaps the @range + */ +gboolean +gcal_event_overlaps (GcalEvent *self, + GcalRange *range) +{ + GcalRangeOverlap overlap; + + g_return_val_if_fail (GCAL_IS_EVENT (self), FALSE); + overlap = gcal_range_calculate_overlap (gcal_event_get_range (self), range, NULL); + return overlap != GCAL_RANGE_NO_OVERLAP; +} diff --git a/src/core/gcal-event.h b/src/core/gcal-event.h index a5859db9..52fafe19 100644 --- a/src/core/gcal-event.h +++ b/src/core/gcal-event.h @@ -136,6 +136,9 @@ void gcal_event_get_original_timezones (GcalEvent gchar* gcal_event_format_date (GcalEvent *self); +gboolean gcal_event_overlaps (GcalEvent *self, + GcalRange *range); + G_END_DECLS #endif /* GCAL_EVENT_H */ diff --git a/src/core/gcal-timeline.c b/src/core/gcal-timeline.c index 1713b707..3eedeec7 100644 --- a/src/core/gcal-timeline.c +++ b/src/core/gcal-timeline.c @@ -411,6 +411,9 @@ calculate_changed_events (GcalTimeline *self, for (i = 0; events_to_remove && i < events_to_remove->len; i++) { GcalEvent *event = g_ptr_array_index (events_to_remove, i); + /* Do not re-remove multiday events that are part of new range */ + if (gcal_event_is_multiday (event) && gcal_event_overlaps (event, new_range)) + continue; GCAL_TRACE_MSG ("Removing event from subscriber %s due to time range change (event: '%s' (%s))", G_OBJECT_TYPE_NAME (subscriber), @@ -423,6 +426,9 @@ calculate_changed_events (GcalTimeline *self, for (i = 0; events_to_add && i < events_to_add->len; i++) { GcalEvent *event = g_ptr_array_index (events_to_add, i); + /* Do not re-add multiday events that were part of old range */ + if (gcal_event_is_multiday (event) && gcal_event_overlaps (event, old_range)) + continue; GCAL_TRACE_MSG ("Queueing event addition for subscriber %s (event: '%s' (%s))", G_OBJECT_TYPE_NAME (subscriber),