← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~jjardon/indicator-datetime/fix-837440 into lp:indicator-datetime

 

Javier Jardón has proposed merging lp:~jjardon/indicator-datetime/fix-837440 into lp:indicator-datetime.

Requested reviews:
  Indicator Applet Developers (indicator-applet-developers)
Related bugs:
  Bug #837440 in Indicator Date and Time: "Use GnomeWallClock api to implement wall clocks"
  https://bugs.launchpad.net/indicator-datetime/+bug/837440

For more details, see:
https://code.launchpad.net/~jjardon/indicator-datetime/fix-837440/+merge/74123
-- 
https://code.launchpad.net/~jjardon/indicator-datetime/fix-837440/+merge/74123
Your team ayatana-commits is subscribed to branch lp:indicator-datetime.
=== modified file 'configure.ac'
--- configure.ac	2011-08-18 15:57:14 +0000
+++ configure.ac	2011-09-05 17:24:24 +0000
@@ -26,6 +26,7 @@
 LT_PREREQ([2.2])
 LT_INIT([disable-static])
 
+AC_CHECK_LIB([m],[pow])
 
 AC_ARG_ENABLE([deprecations],
   [AS_HELP_STRING([--enable-deprecations],
@@ -64,6 +65,8 @@
 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
@@ -73,6 +76,8 @@
 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)
@@ -100,6 +105,7 @@
                            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

=== modified file 'src/datetime-service.c'
--- src/datetime-service.c	2011-09-01 17:05:17 +0000
+++ src/datetime-service.c	2011-09-05 17:24:24 +0000
@@ -38,6 +38,10 @@
 #include <geoclue/geoclue-master.h>
 #include <geoclue/geoclue-master-client.h>
 
+#define GNOME_DESKTOP_USE_UNSTABLE_API
+#include <gdesktop-enums.h>
+#include <libgnome-desktop/gnome-wall-clock.h>
+
 #include <time.h>
 #include <libecal/e-cal.h>
 #include <libical/ical.h>
@@ -57,7 +61,6 @@
 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 @@
 	return;
 }
 
-/* Run when the timezone file changes */
-static void
-timezone_changed (GFileMonitor * monitor, GFile * file, GFile * otherfile, GFileMonitorEvent event, 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;
+static void
+on_clock_changed (GnomeWallClock *clock,
+                  GParamSpec     *pspec,
+                  gpointer        user_data)
+{
+  update_datetime (NULL);
 }
 
 static void
@@ -1213,7 +1161,6 @@
 		if (!idle) {
 			datetime_interface_update(DATETIME_INTERFACE(user_data));
 			update_datetime(NULL);
-			setup_timer();
 		}
 	}
 	return;
@@ -1437,6 +1384,8 @@
 int
 main (int argc, char ** argv)
 {
+	GnomeWallClock *clock;
+
 	g_type_init();
 
 	/* Acknowledging the service init and setting up the interface */
@@ -1472,11 +1421,9 @@
 	/* 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 (clock, "notify::clock", G_CALLBACK (on_clock_changed), NULL);
 
 	/* And watch for system resumes */
 	g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,

=== modified file 'src/indicator-datetime.c'
--- src/indicator-datetime.c	2011-08-25 14:46:51 +0000
+++ src/indicator-datetime.c	2011-09-05 17:24:24 +0000
@@ -45,6 +45,10 @@
 #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 _IndicatorDatetimePrivate {
 	GtkLabel * label;
-	guint timer;
 
 	gchar * time_string;
 
@@ -101,8 +104,11 @@
 	GList * timezone_items;
 
 	GSettings * settings;
+	GSettings * gnome_settings;
 
 	GtkSizeGroup * indicator_right_group;
+
+	GnomeWallClock *clock;
 };
 
 /* Enum for the properties so that they can be quickly
@@ -169,8 +175,8 @@
 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 +300,6 @@
 	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 +368,11 @@
 		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);
+
 	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 +445,9 @@
 		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 +573,7 @@
 		if (newval != self->priv->time_mode) {
 			update = TRUE;
 			self->priv->time_mode = newval;
-			setup_timer(self, NULL);			
+			update_time (self);
 		}
 		break;
 	}
@@ -572,8 +582,11 @@
 			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);
 			}
+			g_settings_set_boolean (self->priv->gnome_settings,
+			                        "clock-show-seconds",
+			                        self->priv->show_seconds);
 		}
 		break;
 	}
@@ -607,8 +620,11 @@
 			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);
 			}
+			g_settings_set_boolean (self->priv->gnome_settings,
+			                        "clock-show-seconds",
+			                        self->priv->show_seconds);
 		}
 		break;
 	}
@@ -825,11 +841,16 @@
 	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 +867,6 @@
 	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 +1486,6 @@
 		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;
 }
 


Follow ups