From 82aa5fadb0cac63c1c7dc6648985a341a5484dee Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Sat, 18 Mar 2017 03:40:22 +0530 Subject: [PATCH] week-header: correctly check for updatable events When comparing events' dates against week dates, we must be careful to compare UTC with UTC. Otherwise, some events will be left, specially at the first and last days. --- src/views/gcal-week-header.c | 47 ++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c index 5919c399..b546899b 100644 --- a/src/views/gcal-week-header.c +++ b/src/views/gcal-week-header.c @@ -765,22 +765,24 @@ add_event_to_grid (GcalWeekHeader *self, static void update_unchanged_events (GcalWeekHeader *self, - icaltimetype *old_icaldt, icaltimetype *new_icaldt) { - GDateTime *old_week_start, *old_week_end; - GDateTime *new_week_start, *new_week_end; + g_autoptr (GDateTime) new_week_start, new_week_end; + g_autoptr (GDateTime) utc_week_start, utc_week_end; GList *events_to_update, *l; gint weekday; events_to_update = NULL; - old_week_start = get_start_of_week (old_icaldt); - old_week_end = get_end_of_week (old_icaldt); - new_week_start = get_start_of_week (new_icaldt); new_week_end = get_end_of_week (new_icaldt); + utc_week_start = g_date_time_new_utc (g_date_time_get_year (new_week_start), + g_date_time_get_month (new_week_start), + g_date_time_get_day_of_month (new_week_start), + 0, 0, 0); + utc_week_end = g_date_time_add_days (utc_week_start, 7); + for (weekday = 0; weekday < 7; weekday++) { GList *events; @@ -790,17 +792,36 @@ update_unchanged_events (GcalWeekHeader *self, for (l = events; l != NULL; l = l->next) { g_autoptr (GDateTime) event_start, event_end; + GDateTime *week_start, *week_end; - event_start = g_date_time_to_local (gcal_event_get_date_start (l->data)); - event_end = g_date_time_to_local (gcal_event_get_date_end (l->data)); + /* + * When the event is all day, we must be careful to compare its dates + * against the UTC variants of the week start and end dates. + */ + if (gcal_event_get_all_day (l->data)) + { + event_start = g_date_time_ref (gcal_event_get_date_start (l->data)); + event_end = g_date_time_ref (gcal_event_get_date_end (l->data)); + + week_start = utc_week_start; + week_end = utc_week_end; + } + else + { + event_start = g_date_time_to_local (gcal_event_get_date_start (l->data)); + event_end = g_date_time_to_local (gcal_event_get_date_end (l->data)); + + week_start = new_week_start; + week_end = new_week_end; + } /* * Check if the event must be updated. If we're going to the future, updatable events * are events that started somewhere in the past, and are still present. If we're * going to the past, updatable events are events that started */ - if (g_date_time_compare (event_start, new_week_end) <= 0 && - g_date_time_compare (event_end, new_week_start) > 0 && + if (g_date_time_compare (event_start, week_end) < 0 && + g_date_time_compare (event_end, week_start) > 0 && !g_list_find (events_to_update, l->data)) { events_to_update = g_list_append (events_to_update, l->data); @@ -815,10 +836,6 @@ update_unchanged_events (GcalWeekHeader *self, } g_clear_pointer (&events_to_update, g_list_free); - g_clear_pointer (&new_week_start, g_date_time_unref); - g_clear_pointer (&old_week_start, g_date_time_unref); - g_clear_pointer (&new_week_end, g_date_time_unref); - g_clear_pointer (&old_week_end, g_date_time_unref); } /* Header */ @@ -1088,7 +1105,7 @@ gcal_week_header_set_property (GObject *object, gtk_widget_queue_draw (GTK_WIDGET (self)); if (old_date) - update_unchanged_events (self, old_date, self->active_date); + update_unchanged_events (self, self->active_date); g_clear_pointer (&old_date, g_free); break;