aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier Jardón <javier.jardon@codethink.co.uk>2011-09-05 14:31:13 +0100
committerJavier Jardón <javier.jardon@codethink.co.uk>2011-09-05 14:31:13 +0100
commit805b0b286192282b590b4003612fdf29d2284c0a (patch)
tree982633170d41ad9e514d8482610003d352e83704
parentb9e51f0108e43b19527011be762b227498b1b0c6 (diff)
downloadayatana-indicator-datetime-805b0b286192282b590b4003612fdf29d2284c0a.tar.gz
ayatana-indicator-datetime-805b0b286192282b590b4003612fdf29d2284c0a.tar.bz2
ayatana-indicator-datetime-805b0b286192282b590b4003612fdf29d2284c0a.zip
indicator-datetime.c: Use GnomeWallClock instead of periodic timeout
This class support changes in the timezone and notifications of clock skews when using a recent version of Linux (using timerfds) See https://bugzilla.gnome.org/show_bug.cgi?id=655129 Fixes https://bugs.launchpad.net/indicator-datetime/+bug/837440
-rw-r--r--configure.ac2
-rw-r--r--src/indicator-datetime.c92
2 files changed, 28 insertions, 66 deletions
diff --git a/configure.ac b/configure.ac
index 7b8682c..55c4f3b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -26,6 +26,7 @@ AC_HEADER_STDC
LT_PREREQ([2.2])
LT_INIT([disable-static])
+AC_CHECK_LIB([m],[pow])
AC_ARG_ENABLE([deprecations],
[AS_HELP_STRING([--enable-deprecations],
@@ -74,6 +75,7 @@ GCONF_REQUIRED_VERSION=2.31
AS_IF([test "x$with_gtk" = x3],
[PKG_CHECK_MODULES(INDICATOR, indicator3-0.4 >= $INDICATOR_REQUIRED_VERSION
glib-2.0 >= $GLIB_REQUIRED_VERSION
+ gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION
dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION
dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION
libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS)
diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c
index 59bcaf3..2562b62 100644
--- a/src/indicator-datetime.c
+++ b/src/indicator-datetime.c
@@ -45,6 +45,10 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <libido/libido.h>
#include <libdbusmenu-gtk3/menuitem.h>
+/* For GnomeWallClock */
+#define GNOME_DESKTOP_USE_UNSTABLE_API
+#include <libgnome-desktop/gnome-wall-clock.h>
+
#include "utils.h"
#include "dbus-shared.h"
#include "settings-shared.h"
@@ -72,7 +76,6 @@ struct _IndicatorDatetime {
struct _IndicatorDatetimePrivate {
GtkLabel * label;
- guint timer;
gchar * time_string;
@@ -103,6 +106,8 @@ struct _IndicatorDatetimePrivate {
GSettings * settings;
GtkSizeGroup * indicator_right_group;
+
+ GnomeWallClock *clock;
};
/* Enum for the properties so that they can be quickly
@@ -169,8 +174,8 @@ static gboolean bind_enum_get (GValue * value, GVariant * variant, g
static gchar * generate_format_string_now (IndicatorDatetime * self);
static void update_label (IndicatorDatetime * io, GDateTime ** datetime);
static void guess_label_size (IndicatorDatetime * self);
-static void setup_timer (IndicatorDatetime * self, GDateTime * datetime);
static void update_time (IndicatorDatetime * self);
+static void on_clock_changed (GnomeWallClock *clock, GParamSpec *pspec, gpointer user_data);
static void receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, GVariant * parameters, gpointer user_data);
static void service_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data);
static gint generate_strftime_bitmask (const char *time_str);
@@ -294,7 +299,6 @@ indicator_datetime_init (IndicatorDatetime *self)
self->priv = INDICATOR_DATETIME_GET_PRIVATE(self);
self->priv->label = NULL;
- self->priv->timer = 0;
self->priv->idle_measure = 0;
self->priv->max_width = 0;
@@ -363,6 +367,9 @@ indicator_datetime_init (IndicatorDatetime *self)
g_warning("Unable to get settings for '" SETTINGS_INTERFACE "'");
}
+ self->priv->clock = g_object_new (GNOME_TYPE_WALL_CLOCK, NULL);
+ g_signal_connect (clock, "notify::clock", G_CALLBACK (on_clock_changed), self);
+
self->priv->sm = indicator_service_manager_new_version(SERVICE_NAME, SERVICE_VERSION);
self->priv->indicator_right_group = GTK_SIZE_GROUP(gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL));
@@ -435,9 +442,9 @@ indicator_datetime_dispose (GObject *object)
self->priv->label = NULL;
}
- if (self->priv->timer != 0) {
- g_source_remove(self->priv->timer);
- self->priv->timer = 0;
+ if (self->priv->clock != NULL) {
+ g_object_unref (self->priv->clock);
+ self->priv->clock = NULL;
}
if (self->priv->idle_measure != 0) {
@@ -563,7 +570,7 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec
if (newval != self->priv->time_mode) {
update = TRUE;
self->priv->time_mode = newval;
- setup_timer(self, NULL);
+ update_time (self);
}
break;
}
@@ -572,7 +579,7 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec
self->priv->show_seconds = !self->priv->show_seconds;
if (self->priv->time_mode != SETTINGS_TIME_CUSTOM) {
update = TRUE;
- setup_timer(self, NULL);
+ update_time (self);
}
}
break;
@@ -607,7 +614,7 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec
self->priv->custom_show_seconds = (time_mask & STRFTIME_MASK_SECONDS);
if (self->priv->time_mode == SETTINGS_TIME_CUSTOM) {
update = TRUE;
- setup_timer(self, NULL);
+ update_time (self);
}
}
break;
@@ -825,11 +832,16 @@ update_time (IndicatorDatetime * self)
GDateTime * dt = NULL;
update_label(self, &dt);
timezone_update_all_labels(self);
- if (dt != NULL) {
- setup_timer(self, dt);
- g_date_time_unref(dt);
- }
- return;
+}
+
+static void
+on_clock_changed (GnomeWallClock *clock,
+ GParamSpec *pspec,
+ gpointer user_data)
+{
+ IndicatorDatetime *self = INDICATOR_DATETIME (user_data);
+
+ update_time (self);
}
/* Receives all signals from the service, routed to the appropriate functions */
@@ -846,54 +858,6 @@ receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name,
return;
}
-/* Runs every minute and updates the time */
-gboolean
-timer_func (gpointer user_data)
-{
- IndicatorDatetime * self = INDICATOR_DATETIME(user_data);
- self->priv->timer = 0;
- GDateTime * dt = NULL;
- update_label(self, &dt);
- timezone_update_all_labels(self);
- if (dt != NULL) {
- setup_timer(self, dt);
- g_date_time_unref(dt);
- }
- return FALSE;
-}
-
-/* Configure the timer to run the next time through */
-static void
-setup_timer (IndicatorDatetime * self, GDateTime * datetime)
-{
- gboolean unref = FALSE;
-
- if (self->priv->timer != 0) {
- g_source_remove(self->priv->timer);
- self->priv->timer = 0;
- }
-
- if (self->priv->show_seconds ||
- (self->priv->time_mode == SETTINGS_TIME_CUSTOM && self->priv->custom_show_seconds)) {
- self->priv->timer = g_timeout_add_full(G_PRIORITY_HIGH, 999, timer_func, self, NULL);
- } else {
- if (datetime == NULL) {
- datetime = g_date_time_new_now_local();
- unref = TRUE;
- }
-
- /* Plus 2 so we're just after the minute, don't want to be early. */
- gint seconds = (gint)g_date_time_get_seconds(datetime);
- self->priv->timer = g_timeout_add_seconds(60 - seconds + 2, timer_func, self);
-
- if (unref) {
- g_date_time_unref(datetime);
- }
- }
-
- return;
-}
-
/* Does a quick meausre of how big the string is in
pixels with a Pango layout */
static gint
@@ -1513,10 +1477,6 @@ get_label (IndicatorObject * io)
gtk_widget_set_visible(GTK_WIDGET (self->priv->label), self->priv->show_clock);
}
- if (self->priv->timer == 0) {
- setup_timer(self, NULL);
- }
-
return self->priv->label;
}