From e009a67e30ffcaf6dbebf524d00b5cba8bdf26ab Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Thu, 22 Jan 2015 09:53:19 -0200 Subject: [PATCH] utils: better search for the first week day We were relying on _NL_TIME_FIRST_WEEKDAY, which is a glibc extension. It doesn't work with non-glibc systems, such as FreeBSD. This commit makes it carefully search for the first weekday. Fixes bug #743327. --- src/gcal-utils.c | 52 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/src/gcal-utils.c b/src/gcal-utils.c index 9ce10a9d..849454fe 100644 --- a/src/gcal-utils.c +++ b/src/gcal-utils.c @@ -398,15 +398,59 @@ get_uuid_from_component (ESource *source, return uuid; } +/** + * get_first_weekday: + * + * Copied from Clocks, which by itself is + * copied from GtkCalendar. + * + * Returns: the first weekday, from 0 to 6 + */ gint get_first_weekday (void) { - const char *const s = nl_langinfo(_NL_TIME_FIRST_WEEKDAY); + int week_start; +#ifdef HAVE__NL_TIME_FIRST_WEEKDAY + union { unsigned int word; char *string; } langinfo; + int week_1stday = 0; + int first_weekday = 1; + guint week_origin; +#else + char *gtk_week_start; +#endif - if (s && *s >= 1 && *s <= 7) - return ((int)*s) - 1; +#ifdef HAVE__NL_TIME_FIRST_WEEKDAY + langinfo.string = nl_langinfo (_NL_TIME_FIRST_WEEKDAY); + first_weekday = langinfo.string[0]; + langinfo.string = nl_langinfo (_NL_TIME_WEEK_1STDAY); + week_origin = langinfo.word; + if (week_origin == 19971130) /* Sunday */ + week_1stday = 0; + else if (week_origin == 19971201) /* Monday */ + week_1stday = 1; + else + g_warning ("Unknown value of _NL_TIME_WEEK_1STDAY.\n"); - return 0; + week_start = (week_1stday + first_weekday - 1) % 7; +#else + /* Use a define to hide the string from xgettext */ +# define GTK_WEEK_START "calendar:week_start:0" + gtk_week_start = dgettext ("gtk30", GTK_WEEK_START); + + if (strncmp (gtk_week_start, "calendar:week_start:", 20) == 0) + week_start = *(gtk_week_start + 20) - '0'; + else + week_start = -1; + + if (week_start < 0 || week_start > 6) + { + g_warning ("Whoever translated calendar:week_start:0 for GTK+ " + "did so wrongly.\n"); + week_start = 0; + } +#endif + + return week_start; } /**