[evolution-data-server] I#190 - Does not show reminders after resume from suspend



commit 60fa52112a073ddf9f78047110542b4e5f732749
Author: Milan Crha <mcrha redhat com>
Date:   Mon May 6 17:50:38 2019 +0200

    I#190 - Does not show reminders after resume from suspend
    
    Closes https://gitlab.gnome.org/GNOME/evolution-data-server/issues/109

 src/calendar/libecal/e-reminder-watcher.c | 46 +++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)
---
diff --git a/src/calendar/libecal/e-reminder-watcher.c b/src/calendar/libecal/e-reminder-watcher.c
index b08a7f301..498b6cdfa 100644
--- a/src/calendar/libecal/e-reminder-watcher.c
+++ b/src/calendar/libecal/e-reminder-watcher.c
@@ -1789,6 +1789,43 @@ e_reminder_watcher_source_disappeared_cb (EReminderWatcher *watcher,
        g_rec_mutex_unlock (&watcher->priv->lock);
 }
 
+static gboolean
+e_reminder_watcher_check_wall_clock_time_changed_cb (gpointer user_data)
+{
+       EReminderWatcher *watcher = user_data;
+       gint64 wall_clock_time;
+
+       if (g_source_is_destroyed (g_main_current_source ()))
+               return FALSE;
+
+       g_return_val_if_fail (E_IS_REMINDER_WATCHER (watcher), FALSE);
+
+       #define ADD_SECONDS(to, secs) ((to) + ((secs) * G_USEC_PER_SEC))
+
+       wall_clock_time = g_get_real_time ();
+
+       /* Use one second margin */
+       if (wall_clock_time > ADD_SECONDS (watcher->priv->expected_wall_clock_time, 1) ||
+           wall_clock_time < ADD_SECONDS (watcher->priv->expected_wall_clock_time, -1)) {
+               gint64 diff = (wall_clock_time - watcher->priv->expected_wall_clock_time) / 1000;
+
+               e_reminder_watcher_debug_print ("Current wall-clock time differs from expected by %" 
G_GINT64_FORMAT " ms, rescheduling reminders\n", diff);
+
+               /* To make sure the timer is re-scheduled */
+               watcher->priv->next_trigger = 0;
+
+               e_reminder_watcher_maybe_schedule_next_trigger (watcher, 0);
+
+               wall_clock_time = g_get_real_time ();
+       }
+
+       watcher->priv->expected_wall_clock_time = ADD_SECONDS (wall_clock_time, 60);
+
+       #undef ADD_SECONDS
+
+       return TRUE;
+}
+
 static gboolean
 e_reminder_watcher_construct_idle_cb (gpointer user_data)
 {
@@ -1815,6 +1852,15 @@ e_reminder_watcher_construct_idle_cb (gpointer user_data)
 
        e_source_registry_watcher_reclaim (watcher->priv->registry_watcher);
 
+       if (!watcher->priv->wall_clock_handler_id) {
+               /* Monotonic time doesn't change during hibernation, while the
+                * wall clock time does, thus check for wall clock time changes
+                * and reschedule alarms when it changes. */
+               watcher->priv->expected_wall_clock_time = g_get_real_time () + (60 * G_USEC_PER_SEC);
+               watcher->priv->wall_clock_handler_id = e_named_timeout_add_seconds (60,
+                       e_reminder_watcher_check_wall_clock_time_changed_cb, watcher);
+       }
+
        if (!watcher->priv->snoozed)
                watcher->priv->snoozed = e_reminder_watcher_reminders_from_key (watcher, "reminders-snoozed");
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]