From 2ea743ab466703091a44a74e1a4ac7db983c0bca Mon Sep 17 00:00:00 2001 From: Rafal Luzynski Date: Sat, 10 Feb 2018 14:07:56 +0100 Subject: [PATCH] calendar: Use the new "%OB" format if supported Due to the recent changes introduced in glibc 2.27 "%OB" is the correct format to obtain a month name as used in the calendar header. The same rule has been working in BSD family (including OS X) since 1990s. This simple hack checks whether "%OB" is supported at runtime and uses it if it is, falls back to the old "%B" otherwise. Closes: #9 --- gtk/gtkcalendar.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/gtk/gtkcalendar.c b/gtk/gtkcalendar.c index 2dd68d6394..28baba16f1 100644 --- a/gtk/gtkcalendar.c +++ b/gtk/gtkcalendar.c @@ -689,6 +689,7 @@ gtk_calendar_init (GtkCalendar *calendar) #ifdef G_OS_WIN32 wchar_t wbuffer[100]; #else + static const char *month_format = NULL; char buffer[255]; time_t tmp_time; #endif @@ -714,7 +715,7 @@ gtk_calendar_init (GtkCalendar *calendar) { #ifndef G_OS_WIN32 tmp_time= (i+3)*86400; - strftime ( buffer, sizeof (buffer), "%a", gmtime (&tmp_time)); + strftime (buffer, sizeof (buffer), "%a", gmtime (&tmp_time)); default_abbreviated_dayname[i] = g_locale_to_utf8 (buffer, -1, NULL, NULL, NULL); #else if (!GetLocaleInfoW (GetThreadLocale (), LOCALE_SABBREVDAYNAME1 + (i+6)%7, @@ -730,7 +731,21 @@ gtk_calendar_init (GtkCalendar *calendar) { #ifndef G_OS_WIN32 tmp_time=i*2764800; - strftime ( buffer, sizeof (buffer), "%B", gmtime (&tmp_time)); + if (G_UNLIKELY (month_format == NULL)) + { + buffer[0] = '\0'; + month_format = "%OB"; + strftime (buffer, sizeof (buffer), month_format, gmtime (&tmp_time)); + /* "%OB" is not supported in Linux with glibc < 2.27 */ + if (!strcmp (buffer, "%OB") || !strcmp (buffer, "OB") || !strcmp (buffer, "")) + { + month_format = "%B"; + strftime (buffer, sizeof (buffer), month_format, gmtime (&tmp_time)); + } + } + else + strftime (buffer, sizeof (buffer), month_format, gmtime (&tmp_time)); + default_monthname[i] = g_locale_to_utf8 (buffer, -1, NULL, NULL, NULL); #else if (!GetLocaleInfoW (GetThreadLocale (), LOCALE_SMONTHNAME1 + i,