[gnome-screensaver] Use g_date_time_create_watch()



commit efaa8d00bb9fa6f1f194676dd0b1d06cae346cd2
Author: Colin Walters <walters verbum org>
Date:   Tue Aug 16 04:34:35 2011 -0400

    Use g_date_time_create_watch()
    
    This is more efficient and a better API.
    
    Note this effectively reverts:
      9f98f3a20b5eec6a1fa13e5a4972eadc2d728acf
      da2148e09ee162481a0ffbc106a37e81ff7af790
    
    https://bugzilla.gnome.org/show_bug.cgi?id=656627

 src/gs-window-x11.c |   85 ++++++++++++++-------------------------------------
 1 files changed, 23 insertions(+), 62 deletions(-)
---
diff --git a/src/gs-window-x11.c b/src/gs-window-x11.c
index 3114c3e..ab5a2c1 100644
--- a/src/gs-window-x11.c
+++ b/src/gs-window-x11.c
@@ -102,8 +102,6 @@ struct GSWindowPrivate
         guint      info_bar_timer_id;
         guint      clock_update_id;
 
-        gint64     clock_update_time;
-
         gint       lock_pid;
         gint       lock_watch_id;
         gint       dialog_response;
@@ -152,7 +150,7 @@ static guint           signals [LAST_SIGNAL] = { 0, };
 
 G_DEFINE_TYPE (GSWindow, gs_window, GTK_TYPE_WINDOW)
 
-static void queue_clock_update (GSWindow *window);
+static gboolean update_clock (gpointer data);
 
 static void
 set_invisible_cursor (GdkWindow *window,
@@ -2183,13 +2181,16 @@ on_panel_draw (GtkWidget    *widget,
         return FALSE;
 }
 
-static void
-update_clock (GSWindow *window)
+static gboolean
+update_clock (gpointer data)
 {
+        GSWindow *window = data;
+        GSource   *source;
+        GDateTime *now;
+        GDateTime *expiry;
         const char *clock_format;
         char *text;
         char *markup;
-        GDateTime *dt;
 
         /* clock */
         if (window->priv->clock_format == G_DESKTOP_CLOCK_FORMAT_24H)
@@ -2199,69 +2200,30 @@ update_clock (GSWindow *window)
                 /* Translators, this is the 12h date format used in the panel clock */
                 clock_format = _("%a %l:%M %p");
 
-        window->priv->clock_update_time = g_get_real_time ();
-        dt = g_date_time_new_from_unix_local (window->priv->clock_update_time / G_USEC_PER_SEC);
-        text = g_date_time_format (dt, clock_format);
+        now = g_date_time_new_now_local ();
+        expiry = g_date_time_add_seconds (now, 60 - g_date_time_get_second (now));
+
+        if (window->priv->clock_update_id)
+                g_source_remove (window->priv->clock_update_id);
+
+        source = g_date_time_source_new (expiry, TRUE);
+        g_source_set_priority (source, G_PRIORITY_HIGH);
+        g_source_set_callback (source, update_clock, window, NULL);
+        window->priv->clock_update_id = g_source_attach (source, NULL);
+        g_source_unref (source);
+
+        text = g_date_time_format (now, clock_format);
         markup = g_strdup_printf ("<b><span foreground=\"#ccc\">%s</span></b>", text);
         gtk_label_set_markup (GTK_LABEL (window->priv->clock), markup);
         g_free (markup);
         g_free (text);
-        g_date_time_unref (dt);
-}
-
-
-static gboolean
-update_clock_timer (GSWindow *window)
-{
-        update_clock (window);
-        queue_clock_update (window);
-        return FALSE;
-}
-
-static gboolean
-check_clock_timer (GSWindow *window)
-{
-        /* Update the panel clock when necessary.
-           This happens:
-
-           - Once a minute in the normal case
-           - When the machine resumes from suspend
-           - When the system time is adjusted
-
-           Right now this function is called much more frequently than any of the
-           above 3 events happen (see queue_clock_update ()).
 
-           We can wake up less often if bug 655129 gets fixed.  */
-        if (ABS (g_get_real_time () - window->priv->clock_update_time) > 60 * G_USEC_PER_SEC) {
-                update_clock (window);
-        }
+        g_date_time_unref (now);
+        g_date_time_unref (expiry);
 
-        queue_clock_update (window);
         return FALSE;
 }
 
-static void
-queue_clock_update (GSWindow *window)
-{
-        int timeouttime;
-        struct timeval tv;
-
-        gettimeofday (&tv, NULL);
-        timeouttime = (G_USEC_PER_SEC - tv.tv_usec) / 1000 + 1;
-
-        /* time until next minute */
-        timeouttime += 1000 * (59 - tv.tv_sec % 60);
-
-        /* If we are more than 2.5 seconds from the start of the next minute,
-           schedule less precise but more power friendly 2 second add_seconds
-           timeout to check if the system realtime clock has changed under us. */
-        if (timeouttime > 2500) {
-                window->priv->clock_update_id = g_timeout_add_seconds (2, (GSourceFunc)check_clock_timer, window);
-        } else {
-                window->priv->clock_update_id = g_timeout_add (timeouttime, (GSourceFunc)update_clock_timer, window);
-        }
-}
-
 static char *
 get_user_display_name (void)
 {
@@ -2371,7 +2333,7 @@ update_clock_format (GSettings  *settings,
         clock_format = g_settings_get_enum (settings, key);
         if (clock_format != window->priv->clock_format) {
                 window->priv->clock_format = clock_format;
-                queue_clock_update (window);
+                update_clock (window);
         }
 }
 
@@ -2429,7 +2391,6 @@ gs_window_init (GSWindow *window)
         g_signal_connect (window->priv->clock_settings, "changed::clock-format",
                           G_CALLBACK (update_clock_format), window);
         update_clock (window);
-        queue_clock_update (window);
 
         force_no_pixmap_background (window->priv->drawing_area);
 }



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