[Xfce4-commits] <xfce4-panel:master> Resync tooltip and clock timeout when they are out of sync (bug #2957).

Nick Schermer noreply at xfce.org
Tue Oct 6 11:16:02 CEST 2009


Updating branch refs/heads/master
         to c00b5cc205352640eba0f7a39340cda3d9f7fdcb (commit)
       from 28b3d29138cf36b98b6467d55c79a993884ea5a8 (commit)

commit c00b5cc205352640eba0f7a39340cda3d9f7fdcb
Author: Nick Schermer <nick at xfce.org>
Date:   Tue Oct 6 11:01:55 2009 +0200

    Resync tooltip and clock timeout when they are out of sync (bug #2957).
    
    Also drop the nano second precision since it only result in a
    sync that is one second too late.

 plugins/clock/clock.c |  137 +++++++++++++++++++++++++++++++++++++++---------
 plugins/clock/clock.h |   12 ++--
 2 files changed, 117 insertions(+), 32 deletions(-)

diff --git a/plugins/clock/clock.c b/plugins/clock/clock.c
index 325fef1..b2a1988 100644
--- a/plugins/clock/clock.c
+++ b/plugins/clock/clock.c
@@ -43,7 +43,7 @@ static void         xfce_clock_util_get_debug_localtime  (struct tm       *tm);
 #endif
 static guint        xfce_clock_util_interval_from_format (const gchar     *format);
 static guint        xfce_clock_util_next_interval        (guint            timeout_interval);
-static gboolean     xfce_clock_tooltip_update            (gpointer         user_data);
+static void         xfce_clock_tooltip_update            (ClockPlugin     *plugin);
 static gboolean     xfce_clock_tooltip_sync_timeout      (gpointer         user_data);
 static gboolean     xfce_clock_widget_sync_timeout       (gpointer         user_data);
 static ClockPlugin *xfce_clock_plugin_init               (XfcePanelPlugin *panel_plugin);
@@ -152,26 +152,16 @@ static guint
 xfce_clock_util_next_interval (guint timeout_interval)
 {
     struct tm tm;
-    GTimeVal  timeval;
-    guint     interval;
-
-    /* get the precise time */
-    g_get_current_time (&timeval);
-
-    /* ms to next second */
-    interval = 1000 - (timeval.tv_usec / 1000);
-
-    /* get current time */
-    xfce_clock_util_get_localtime (&tm);
 
     /* add the interval time to the next update */
     if (timeout_interval == CLOCK_INTERVAL_MINUTE)
     {
         /* ms to next minute */
-        interval += (60 - tm.tm_sec) * CLOCK_INTERVAL_SECOND;
-	}
+        xfce_clock_util_get_localtime (&tm);
+        return 60 - tm.tm_sec;
+    }
 
-    return interval;
+    return 0;
 }
 
 
@@ -206,10 +196,9 @@ xfce_clock_util_strdup_strftime (const gchar *format,
 
 
 /** tooltip functions **/
-static gboolean
-xfce_clock_tooltip_update (gpointer user_data)
+static void
+xfce_clock_tooltip_update (ClockPlugin *plugin)
 {
-    ClockPlugin        *plugin = (ClockPlugin *) user_data;
     gchar              *string;
     struct tm           tm;
 #if !GTK_CHECK_VERSION (2,12,0)
@@ -221,7 +210,7 @@ xfce_clock_tooltip_update (gpointer user_data)
 #endif
 
     if (G_UNLIKELY (plugin->tooltip_format == NULL))
-        return TRUE;
+        return;
 
     /* get the local time */
     xfce_clock_util_get_localtime (&tm);
@@ -239,8 +228,41 @@ xfce_clock_tooltip_update (gpointer user_data)
 
     /* cleanup */
     g_free (string);
+}
 
-    return TRUE;
+
+
+static gboolean
+xfce_clock_tooltip_timeout (gpointer user_data)
+{
+    ClockPlugin *plugin = (ClockPlugin *) user_data;
+    struct tm    tm;
+
+    xfce_clock_tooltip_update (plugin);
+
+    if (plugin->tooltip_interval == CLOCK_INTERVAL_MINUTE)
+    {
+        xfce_clock_util_get_localtime (&tm);
+        plugin->tooltip_restart = tm.tm_sec != 0;
+    }
+
+    return !plugin->tooltip_restart;
+}
+
+
+
+static void
+xfce_clock_tooltip_timeout_destroyed (gpointer user_data)
+{
+    ClockPlugin *plugin = (ClockPlugin *) user_data;
+
+    plugin->tooltip_timeout_id = 0;
+
+    if (plugin->tooltip_restart)
+    {
+        plugin->tooltip_restart = FALSE;
+        xfce_clock_tooltip_sync (plugin);
+    }
 }
 
 
@@ -251,7 +273,9 @@ xfce_clock_tooltip_sync_timeout (gpointer user_data)
     ClockPlugin *plugin = (ClockPlugin *) user_data;
 
     /* start the tooltip update interval */
-    plugin->clock_timeout_id = g_timeout_add (plugin->tooltip_interval, xfce_clock_tooltip_update, plugin);
+    plugin->tooltip_timeout_id = g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, plugin->tooltip_interval * 1000,
+                                                      xfce_clock_tooltip_timeout, plugin,
+                                                      xfce_clock_tooltip_timeout_destroyed);
 
     /* manual update for this timeout */
     xfce_clock_tooltip_update (plugin);
@@ -280,8 +304,18 @@ xfce_clock_tooltip_sync (ClockPlugin *plugin)
     /* get the interval to the next update */
     interval = xfce_clock_util_next_interval (plugin->tooltip_interval);
 
-    /* start the sync timeout */
-    plugin->tooltip_timeout_id = g_timeout_add (interval, xfce_clock_tooltip_sync_timeout, plugin);
+    if (interval > 0 && plugin->tooltip_interval != CLOCK_INTERVAL_SECOND)
+    {
+         /* start the sync timeout */
+         plugin->tooltip_timeout_id = g_timeout_add (interval * 1000, xfce_clock_tooltip_sync_timeout, plugin);
+     }
+     else
+     {
+         /* start the real timeout */
+         plugin->tooltip_timeout_id = g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, plugin->tooltip_interval * 1000,
+                                                          xfce_clock_tooltip_timeout, plugin,
+                                                          xfce_clock_tooltip_timeout_destroyed);
+     }
 
     /* update the tooltip */
     xfce_clock_tooltip_update (plugin);
@@ -291,6 +325,43 @@ xfce_clock_tooltip_sync (ClockPlugin *plugin)
 
 /** clock widget functions **/
 static gboolean
+xfce_clock_widget_timeout (gpointer user_data)
+{
+    ClockPlugin *plugin = (ClockPlugin *) user_data;
+    gboolean     result;
+    struct tm    tm;
+
+    /* update the widget */
+    result = (plugin->update) (plugin->widget);
+
+    if (result && plugin->interval == CLOCK_INTERVAL_MINUTE)
+    {
+        xfce_clock_util_get_localtime (&tm);
+        plugin->restart = tm.tm_sec != 0;
+    }
+
+    return result && !plugin->restart;
+}
+
+
+
+static void
+xfce_clock_widget_timeout_destroyed (gpointer user_data)
+{
+    ClockPlugin *plugin = (ClockPlugin *) user_data;
+
+    plugin->clock_timeout_id = 0;
+
+    if (plugin->restart)
+    {
+        plugin->restart = FALSE;
+        xfce_clock_widget_sync (plugin);
+    }
+}
+
+
+
+static gboolean
 xfce_clock_widget_sync_timeout (gpointer user_data)
 {
     ClockPlugin *plugin = (ClockPlugin *) user_data;
@@ -298,7 +369,9 @@ xfce_clock_widget_sync_timeout (gpointer user_data)
     if (G_LIKELY (plugin->widget))
     {
         /* start the clock update timeout */
-        plugin->clock_timeout_id = g_timeout_add (plugin->interval, plugin->update, plugin->widget);
+        plugin->clock_timeout_id = g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, plugin->interval * 1000,
+                                                       xfce_clock_widget_timeout, plugin,
+                                                       xfce_clock_widget_timeout_destroyed);
 
         /* manual update for this interval */
         (plugin->update) (plugin->widget);
@@ -332,8 +405,20 @@ xfce_clock_widget_sync (ClockPlugin *plugin)
         /* get the interval to the next update */
         interval = xfce_clock_util_next_interval (plugin->interval);
 
-        /* start the sync timeout */
-        plugin->clock_timeout_id = g_timeout_add (interval, xfce_clock_widget_sync_timeout, plugin);
+        if (interval > 0 && plugin->interval != CLOCK_INTERVAL_SECOND)
+        {
+            /* start the sync timeout */
+            plugin->clock_timeout_id = g_timeout_add (interval * 1000, xfce_clock_widget_sync_timeout, plugin);
+        }
+        else
+        {
+            /* start the real timeout */
+            plugin->clock_timeout_id = g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, plugin->interval * 1000,
+                                                           xfce_clock_widget_timeout, plugin,
+                                                           xfce_clock_widget_timeout_destroyed);
+        }
+
+
     }
 }
 
diff --git a/plugins/clock/clock.h b/plugins/clock/clock.h
index f387bdd..8adb9d6 100644
--- a/plugins/clock/clock.h
+++ b/plugins/clock/clock.h
@@ -26,8 +26,8 @@
 
 G_BEGIN_DECLS
 
-#define CLOCK_INTERVAL_SECOND (1000)
-#define CLOCK_INTERVAL_MINUTE (60 * 1000)
+#define CLOCK_INTERVAL_SECOND (1)
+#define CLOCK_INTERVAL_MINUTE (60)
 
 #define BUFFER_SIZE            256
 #define DEFAULT_TOOLTIP_FORMAT "%A %d %B %Y"
@@ -57,19 +57,19 @@ struct _ClockPlugin
     GtkWidget       *widget;
 
     /* clock update function and timeout */
+    guint            clock_timeout_id;
     GSourceFunc      update;
     guint            interval;
+    guint            restart : 1;
 
     /* tooltip interval */
     guint            tooltip_interval;
+    guint            tooltip_timeout_id;
+    guint            tooltip_restart : 1;
 
     /* clock type */
     ClockPluginMode  mode;
 
-    /* timeouts */
-    guint            clock_timeout_id;
-    guint            tooltip_timeout_id;
-
     /* settings */
     gchar           *tooltip_format;
     gchar           *digital_format;



More information about the Xfce4-commits mailing list