← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~mterry/indicator-datetime/can-haz-dublin into lp:indicator-datetime

 

Michael Terry has proposed merging lp:~mterry/indicator-datetime/can-haz-dublin into lp:indicator-datetime.

Requested reviews:
  Indicator Applet Developers (indicator-applet-developers)

For more details, see:
https://code.launchpad.net/~mterry/indicator-datetime/can-haz-dublin/+merge/66157

This one goes out to the folks Rallying in Dublin.

There are two things preventing setting your timezone to work correctly in oneiric:

1) gnome-settings-daemon changed from accepting full paths for timezones to merely timezone identifiers over DBus.  So this branch now follows suit.

2) The indicator was relying on GLib to give it back the very latest timezone value when it called g_time_zone_new(NULL).  GLib likes to cache that value, depending on whether anyone else has a copy of a time zone extant or not.  It's not very robust to assume that GLib will give us the right answer here for a long-running process like an indicator.  So this branch looks it up from /etc/timezone directly, like the service does.
-- 
https://code.launchpad.net/~mterry/indicator-datetime/can-haz-dublin/+merge/66157
Your team ayatana-commits is subscribed to branch lp:indicator-datetime.
=== modified file 'src/Makefile.am'
--- src/Makefile.am	2011-02-23 20:13:42 +0000
+++ src/Makefile.am	2011-06-28 14:36:07 +0000
@@ -34,6 +34,7 @@
 libdatetime_la_CFLAGS = \
 	$(INDICATOR_CFLAGS) \
 	-Wall -Werror \
+	-DTIMEZONE_FILE="\"/etc/timezone\"" \
 	-DG_LOG_DOMAIN=\"Indicator-Datetime\"
 libdatetime_la_LIBADD = \
 	$(INDICATOR_LIBS)
@@ -55,6 +56,7 @@
 	-Werror \
 	-I$(top_srcdir)/libmap \
 	$(PREF_CFLAGS) \
+	-DTIMEZONE_FILE="\"/etc/timezone\"" \
 	-DPKGDATADIR="\"$(pkgdatadir)\""
 indicator_datetime_preferences_LDADD = \
 	 $(top_builddir)/libmap/libmap.la \

=== modified file 'src/datetime-prefs.c'
--- src/datetime-prefs.c	2011-06-15 14:44:57 +0000
+++ src/datetime-prefs.c	2011-06-28 14:36:07 +0000
@@ -223,10 +223,8 @@
   if (location == NULL)
     return;
 
-  gchar * file = g_build_filename ("/usr/share/zoneinfo", location->zone, NULL);
-  g_dbus_proxy_call (proxy, "SetTimezone", g_variant_new ("(s)", file),
+  g_dbus_proxy_call (proxy, "SetTimezone", g_variant_new ("(s)", location->zone),
                      G_DBUS_CALL_FLAGS_NONE, -1, NULL, dbus_set_answered, "timezone");
-  g_free (file);
 
   sync_entry (location->zone);
 }

=== modified file 'src/datetime-service.c'
--- src/datetime-service.c	2011-04-13 19:32:18 +0000
+++ src/datetime-service.c	2011-06-28 14:36:07 +0000
@@ -221,29 +221,15 @@
 		current_timezone = NULL;
 	}
 
-	GError * error = NULL;
-	gchar * tempzone = NULL;
-	if (!g_file_get_contents(TIMEZONE_FILE, &tempzone, NULL, &error)) {
-		g_warning("Unable to read timezone file '" TIMEZONE_FILE "': %s", error->message);
-		g_error_free(error);
+	current_timezone = read_timezone ();
+	if (current_timezone == NULL) {
 		return;
 	}
 
-	/* This shouldn't happen, so let's make it a big boom! */
-	g_return_if_fail(tempzone != NULL);
-
-	/* Note: this really makes sense as strstrip works in place
-	   so we end up with something a little odd without the dup
-	   so we have the dup to make sure everything is as expected
-	   for everyone else. */
-	current_timezone = g_strdup(g_strstrip(tempzone));
-	g_free(tempzone);
-
 	g_debug("System timezone is: %s", current_timezone);
 
 	check_timezone_sync();
 
-    if (error != NULL) g_error_free(error);
 	return;
 }
 
@@ -276,10 +262,8 @@
 		return;
 	}
 
-	gchar * file = g_build_filename ("/usr/share/zoneinfo", (char *)zone, NULL);
-	g_dbus_proxy_call (proxy, "SetTimezone", g_variant_new ("(s)", file),
+	g_dbus_proxy_call (proxy, "SetTimezone", g_variant_new ("(s)", zone),
 	                   G_DBUS_CALL_FLAGS_NONE, -1, NULL, quick_set_tz_cb, NULL);
-	g_free (file);
 	g_free (zone);
 	g_object_unref (proxy);
 }

=== modified file 'src/indicator-datetime.c'
--- src/indicator-datetime.c	2011-06-05 18:45:28 +0000
+++ src/indicator-datetime.c	2011-06-28 14:36:07 +0000
@@ -761,11 +761,18 @@
                            GTimeZone * tz, const gchar * format,
                            GDateTime ** datetime)
 {
+	gboolean unref_tz = FALSE;
+	if (tz == NULL) {
+		gchar * zone = read_timezone ();
+		if (zone == NULL)
+			return;
+		tz = g_time_zone_new(zone);
+		unref_tz = TRUE;
+		g_free (zone);
+	}
+
 	GDateTime * datetime_now;
-	if (tz == NULL)
-		datetime_now = g_date_time_new_now_local();
-	else
-		datetime_now = g_date_time_new_now(tz);
+	datetime_now = g_date_time_new_now(tz);
 
 	gchar * timestr;
 	if (format == NULL) {
@@ -793,6 +800,9 @@
 	else
 		g_date_time_unref(datetime_now);
 
+	if (unref_tz)
+		g_time_zone_unref(tz);
+
 	return;
 }
 

=== modified file 'src/utils.c'
--- src/utils.c	2011-04-07 15:48:50 +0000
+++ src/utils.c	2011-06-28 14:36:07 +0000
@@ -117,6 +117,30 @@
   return rv;
 }
 
+gchar *
+read_timezone ()
+{
+	GError * error = NULL;
+	gchar * tempzone = NULL;
+	if (!g_file_get_contents(TIMEZONE_FILE, &tempzone, NULL, &error)) {
+		g_warning("Unable to read timezone file '" TIMEZONE_FILE "': %s", error->message);
+		g_error_free(error);
+		return NULL;
+	}
+
+	/* This shouldn't happen, so let's make it a big boom! */
+	g_return_val_if_fail(tempzone != NULL, NULL);
+
+	/* Note: this really makes sense as strstrip works in place
+	   so we end up with something a little odd without the dup
+	   so we have the dup to make sure everything is as expected
+	   for everyone else. */
+	gchar * rv = g_strdup(g_strstrip(tempzone));
+	g_free(tempzone);
+
+  return rv;
+}
+
 /* Translate msg according to the locale specified by LC_TIME */
 static char *
 T_(const char *msg)

=== modified file 'src/utils.h'
--- src/utils.h	2011-04-07 15:48:50 +0000
+++ src/utils.h	2011-06-28 14:36:07 +0000
@@ -30,6 +30,7 @@
 gboolean is_locale_12h (void);
 void split_settings_location (const gchar * location, gchar ** zone, gchar ** name);
 gchar * get_current_zone_name (const gchar * location);
+gchar * read_timezone ();
 gchar * generate_format_string_full (gboolean show_day, gboolean show_date);
 gchar * generate_format_string_at_time (GDateTime * time);
 


Follow ups