From e4fed0186ac63ebf14a5d35b6f1aacfc306ad1ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Jard=C3=B3n?= Date: Mon, 5 Sep 2011 12:34:31 +0100 Subject: 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 --- configure.ac | 2 ++ src/datetime-service.c | 77 ++++++++------------------------------------------ 2 files changed, 14 insertions(+), 65 deletions(-) diff --git a/configure.ac b/configure.ac index 71fd0e9..7c7317f 100644 --- a/configure.ac +++ b/configure.ac @@ -64,6 +64,7 @@ GEOCLUE_REQUIRED_VERSION=0.12.0 ECAL_REQUIRED_VERSION=2.30 EDS_REQUIRED_VERSION=2.30 ICAL_REQUIRED_VERSION=0.44 +GNOME_DESKTOP_REQUIRED_VERSION=3.1.90 CAIRO_REQUIRED_VERSION=1.10 GDK_REQUIRED_VERSION=2.22 GLIB_REQUIRED_VERSION=2.26 @@ -100,6 +101,7 @@ PKG_CHECK_MODULES(SERVICE, indicator3-0.4 >= $INDICATOR_REQUIRED_VERSION libedataserverui-3.0 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-3.0 >= GDK_REQUIRED_VERSION + gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION gconf-2.0 >= GCONF_REQUIRED_VERSION) PKG_CHECK_MODULES(PREF, gio-2.0 >= $GIO_REQUIRED_VERSION diff --git a/src/datetime-service.c b/src/datetime-service.c index 80c0b57..8026398 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -38,6 +38,10 @@ with this program. If not, see . #include #include +#define GNOME_DESKTOP_USE_UNSTABLE_API +#include +#include + #include #include #include @@ -57,7 +61,6 @@ with this program. If not, see . static void geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * path, GError * error, gpointer user_data); static gboolean update_appointment_menu_items (gpointer user_data); static gboolean update_timezone_menu_items(gpointer user_data); -static void setup_timer (void); static void geo_client_invalid (GeoclueMasterClient * client, gpointer user_data); static void geo_address_change (GeoclueMasterClient * client, gchar * a, gchar * b, gchar * c, gchar * d, gpointer user_data); static gboolean get_greeter_mode (void); @@ -1139,67 +1142,12 @@ build_menus (DbusmenuMenuitem * root) return; } -/* Run when the timezone file changes */ static void -timezone_changed (GFileMonitor * monitor, GFile * file, GFile * otherfile, GFileMonitorEvent event, gpointer user_data) +on_clock_changed (GnomeWallClock *clock, + GParamSpec *pspec, + gpointer user_data) { - update_current_timezone(); - datetime_interface_update(DATETIME_INTERFACE(user_data)); - update_datetime(NULL); - setup_timer(); - return; -} - -/* Set up monitoring the timezone file */ -static void -build_timezone (DatetimeInterface * dbus) -{ - GFile * timezonefile = g_file_new_for_path(TIMEZONE_FILE); - GFileMonitor * monitor = g_file_monitor_file(timezonefile, G_FILE_MONITOR_NONE, NULL, NULL); - if (monitor != NULL) { - g_signal_connect(G_OBJECT(monitor), "changed", G_CALLBACK(timezone_changed), dbus); - g_debug("Monitoring timezone file: '" TIMEZONE_FILE "'"); - } else { - g_warning("Unable to monitor timezone file: '" TIMEZONE_FILE "'"); - } - return; -} - -/* Source ID for the timer */ -static guint timer = 0; - -/* Execute at a given time, update and setup a new - timer to go again. */ -static gboolean -timer_func (gpointer user_data) -{ - timer = 0; - /* Reset up each time to reduce error */ - setup_timer(); - update_datetime(NULL); - return FALSE; -} - -/* Sets up the time to launch the timer to update the - date in the datetime entry */ -static void -setup_timer (void) -{ - if (timer != 0) { - g_source_remove(timer); - timer = 0; - } - - time_t t; - t = time(NULL); - struct tm * ltime = localtime(&t); - - timer = g_timeout_add_seconds(((23 - ltime->tm_hour) * 60 * 60) + - ((59 - ltime->tm_min) * 60) + - ((60 - ltime->tm_sec)) + 60 /* one minute past */, - timer_func, NULL); - - return; + update_datetime (NULL); } static void @@ -1213,7 +1161,6 @@ session_active_change_cb (GDBusProxy * proxy, gchar * sender_name, gchar * signa if (!idle) { datetime_interface_update(DATETIME_INTERFACE(user_data)); update_datetime(NULL); - setup_timer(); } } return; @@ -1437,6 +1384,8 @@ service_shutdown (IndicatorService * service, gpointer user_data) int main (int argc, char ** argv) { + GnomeWallClock *clock; + g_type_init(); /* Acknowledging the service init and setting up the interface */ @@ -1472,11 +1421,9 @@ main (int argc, char ** argv) /* Setup dbus interface */ dbus = g_object_new(DATETIME_INTERFACE_TYPE, NULL); - /* Setup timezone watch */ - build_timezone(dbus); - /* Setup the timer */ - setup_timer(); + clock = g_object_new (GNOME_TYPE_WALL_CLOCK, NULL); + g_signal_connect (priv->clock_tracker, "notify::clock", G_CALLBACK (on_clock_changed), NULL); /* And watch for system resumes */ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, -- cgit v1.2.3 From b9e51f0108e43b19527011be762b227498b1b0c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Jard=C3=B3n?= Date: Mon, 5 Sep 2011 13:01:56 +0100 Subject: Bump gnome-desktop required version to 3.1.91 GnomeWallClock was added in this version --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 7c7317f..7b8682c 100644 --- a/configure.ac +++ b/configure.ac @@ -64,7 +64,7 @@ GEOCLUE_REQUIRED_VERSION=0.12.0 ECAL_REQUIRED_VERSION=2.30 EDS_REQUIRED_VERSION=2.30 ICAL_REQUIRED_VERSION=0.44 -GNOME_DESKTOP_REQUIRED_VERSION=3.1.90 +GNOME_DESKTOP_REQUIRED_VERSION=3.1.91 CAIRO_REQUIRED_VERSION=1.10 GDK_REQUIRED_VERSION=2.22 GLIB_REQUIRED_VERSION=2.26 -- cgit v1.2.3 From 805b0b286192282b590b4003612fdf29d2284c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Jard=C3=B3n?= Date: Mon, 5 Sep 2011 14:31:13 +0100 Subject: 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 --- configure.ac | 2 ++ src/indicator-datetime.c | 92 ++++++++++++++---------------------------------- 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 . #include #include +/* For GnomeWallClock */ +#define GNOME_DESKTOP_USE_UNSTABLE_API +#include + #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; } -- cgit v1.2.3 From b36e02a7413f025f143a3fc2a00876c665bd43ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Jard=C3=B3n?= Date: Mon, 5 Sep 2011 14:32:12 +0100 Subject: datetime-service: Fix typo --- src/datetime-service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/datetime-service.c b/src/datetime-service.c index 8026398..5a492c1 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -1423,7 +1423,7 @@ main (int argc, char ** argv) /* Setup the timer */ clock = g_object_new (GNOME_TYPE_WALL_CLOCK, NULL); - g_signal_connect (priv->clock_tracker, "notify::clock", G_CALLBACK (on_clock_changed), NULL); + g_signal_connect (clock, "notify::clock", G_CALLBACK (on_clock_changed), NULL); /* And watch for system resumes */ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, -- cgit v1.2.3 From ef6479a971ec5e8ab1c12a090e6f2a338bd0c8ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Jard=C3=B3n?= Date: Mon, 5 Sep 2011 15:17:31 +0100 Subject: indicator-datetime.c: Fix typo --- src/indicator-datetime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 2562b62..9a74ced 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -368,7 +368,7 @@ indicator_datetime_init (IndicatorDatetime *self) } self->priv->clock = g_object_new (GNOME_TYPE_WALL_CLOCK, NULL); - g_signal_connect (clock, "notify::clock", G_CALLBACK (on_clock_changed), self); + g_signal_connect (self->priv->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)); -- cgit v1.2.3 From 87eaa8d2fa412e2f28360587308530fd3e9231d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Jard=C3=B3n?= Date: Mon, 5 Sep 2011 18:18:18 +0100 Subject: indicator-datetime: Update the desktop schema when showing seconds As GnomeWallClock uses "clock-show-seconds" desktop key to update the current time --- configure.ac | 2 ++ src/indicator-datetime.c | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/configure.ac b/configure.ac index 55c4f3b..eaeb958 100644 --- a/configure.ac +++ b/configure.ac @@ -66,6 +66,7 @@ ECAL_REQUIRED_VERSION=2.30 EDS_REQUIRED_VERSION=2.30 ICAL_REQUIRED_VERSION=0.44 GNOME_DESKTOP_REQUIRED_VERSION=3.1.91 +GSETTINGS_DESKTOP_SCHEMAS_REQUIRED=3.1.4 CAIRO_REQUIRED_VERSION=1.10 GDK_REQUIRED_VERSION=2.22 GLIB_REQUIRED_VERSION=2.26 @@ -76,6 +77,7 @@ 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 + gsettings-desktop-schemas >= $GSETTINGS_DESKTOP_SCHEMAS_REQUIRED 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 9a74ced..16ad131 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -104,6 +104,7 @@ struct _IndicatorDatetimePrivate { GList * timezone_items; GSettings * settings; + GSettings * gnome_settings; GtkSizeGroup * indicator_right_group; @@ -367,6 +368,8 @@ indicator_datetime_init (IndicatorDatetime *self) g_warning("Unable to get settings for '" SETTINGS_INTERFACE "'"); } + self->priv->gnome_settings = g_settings_new ("org.gnome.desktop.interface"); + self->priv->clock = g_object_new (GNOME_TYPE_WALL_CLOCK, NULL); g_signal_connect (self->priv->clock, "notify::clock", G_CALLBACK (on_clock_changed), self); @@ -581,6 +584,9 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec update = TRUE; update_time (self); } + g_settings_set_boolean (self->priv->gnome_settings, + "clock-show-seconds", + self->priv->show_seconds); } break; } @@ -616,6 +622,9 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec update = TRUE; update_time (self); } + g_settings_set_boolean (self->priv->gnome_settings, + "clock-show-seconds", + self->priv->show_seconds); } break; } -- cgit v1.2.3 From d6580b428dacb69690def235fbdee1ed00d95b5f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 15 Sep 2011 10:02:03 -0500 Subject: 0.2.94 --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index d557006..b980185 100644 --- a/configure.ac +++ b/configure.ac @@ -1,9 +1,9 @@ AC_INIT([indicator-datetime], - [0.2.93], + [0.2.94], [http://bugs.launchpad.net/indicator-datetime], [indicator-datetime], [http://launchpad.net/indicator-datetime]) -AC_COPYRIGHT([Copyright 2009,2010 Canonical]) +AC_COPYRIGHT([Copyright 2009-2011 Canonical]) AC_PREREQ([2.64]) -- cgit v1.2.3