diff options
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkimmulticontext.c | 7 | ||||
-rw-r--r-- | gtk/gtkmain.c | 104 | ||||
-rw-r--r-- | gtk/gtkmain.h | 2 | ||||
-rw-r--r-- | gtk/gtkrc.c | 10 |
4 files changed, 79 insertions, 44 deletions
diff --git a/gtk/gtkimmulticontext.c b/gtk/gtkimmulticontext.c index 7563682015..6a2e44f301 100644 --- a/gtk/gtkimmulticontext.c +++ b/gtk/gtkimmulticontext.c @@ -24,6 +24,7 @@ #include "gtkimmulticontext.h" #include "gtkimmodule.h" +#include "gtkmain.h" #include "gtkradiomenuitem.h" #include "gtkintl.h" #include "gtkprivate.h" @@ -254,11 +255,9 @@ gtk_im_multicontext_get_slave (GtkIMMulticontext *multicontext) if (!global_context_id) { - const char *locale; - - locale = setlocale (LC_CTYPE, NULL); - + gchar *locale = _gtk_get_lc_ctype (); global_context_id = _gtk_im_module_get_default_context_id (locale); + g_free (locale); } slave = _gtk_im_module_create (global_context_id); diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 02e2361405..78dc4d1c02 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -989,8 +989,13 @@ gtk_exit (gint errorcode) * <literal>setlocale (LC_ALL, "")</literal> but also takes care of the * locale specific setup of the windowing system used by GDK. * - * Return value: a string corresponding to the locale set, as with the - * C library function <function>setlocale()</function>. + * Return: a string corresponding to the locale set, typically in the + * form lang_COUNTRY, where lang is an ISO-639 language code, and + * COUNTRY is an ISO-3166 country code. On Unix, this form matches the + * result of the <function>setlocale()</function>; it is also used on + * other machines, such as Windows, where the C library returns a + * different result. The string is owned by GTK+ and should not be + * modified or freed. **/ gchar * gtk_set_locale (void) @@ -999,55 +1004,86 @@ gtk_set_locale (void) } /** - * gtk_get_default_language: + * _gtk_get_lc_ctype: * - * Returns the #PangoLanguage for the default language currently in - * effect. (Note that this can change over the life of an - * application.) The default language is derived from the current - * locale. It determines, for example, whether GTK+ uses the - * right-to-left or left-to-right text direction. + * Return the Unix-style locale string for the language currently in + * effect. On Unix systems, this is the return value from + * <literal>setlocale(LC_CTYPE, NULL)</literal>, and the user can + * affect this through the environment variables LC_ALL, LC_CTYPE or + * LANG (checked in that order). The locale strings typically is in + * the form lang_COUNTRY, where lang is an ISO-639 language code, and + * COUNTRY is an ISO-3166 country code. For instance, sv_FI for + * Swedish as written in Finland or pt_BR for Portuguese as written in + * Brazil. * - * Return value: the default language as a #PangoLanguage, must not be - * freed - **/ -PangoLanguage * -gtk_get_default_language (void) + * On Windows, the C library doesn't use any such environment + * variables, and setting them won't affect the behaviour of functions + * like <function>ctime()</function>. The user sets the locale through + * the Regional Options in the Control Panel. The C library (in the + * <function>setlocale()</function> function) does not use country and + * language codes, but country and language names spelled out in + * English. However, this function does check the above environment + * variables, and does return a Unix-style locale string based on + * either said environment variables or the thread's current locale. + * + * Return value: a dynamically allocated string, free with g_free(). + */ + +gchar * +_gtk_get_lc_ctype (void) { - gchar *lang; - PangoLanguage *result; gchar *p; - + #ifdef G_OS_WIN32 /* Somebody might try to set the locale for this process using the * LANG or LC_ environment variables. The Microsoft C library * doesn't know anything about them. You set the locale in the * Control Panel. Setting these env vars won't have any affect on - * locale-dependent C library functions like ctime. But just for - * kicks, do obey LC_ALL, LANG and LC_CTYPE in GTK. (This also makes + * locale-dependent C library functions like ctime(). But just for + * kicks, do obey LC_ALL, LC_CTYPE and LANG in GTK. (This also makes * it easier to test GTK and Pango in various default languages, you * don't have to clickety-click in the Control Panel, you can simply * start the program with LC_ALL=something on the command line.) */ p = getenv ("LC_ALL"); if (p != NULL) - lang = g_strdup (p); - else - { - p = getenv ("LANG"); - if (p != NULL) - lang = g_strdup (p); - else - { - p = getenv ("LC_CTYPE"); - if (p != NULL) - lang = g_strdup (p); - else - lang = g_win32_getlocale (); - } - } + return g_strdup (p); + + p = getenv ("LC_CTYPE"); + if (p != NULL) + return g_strdup (p); + + p = getenv ("LANG"); + if (p != NULL) + return g_strdup (p); + + return g_win32_getlocale (); #else - lang = g_strdup (setlocale (LC_CTYPE, NULL)); + return g_strdup (setlocale (LC_CTYPE, NULL)); #endif +} + +/** + * gtk_get_default_language: + * + * Returns the #PangoLanguage for the default language currently in + * effect. (Note that this can change over the life of an + * application.) The default language is derived from the current + * locale. It determines, for example, whether GTK+ uses the + * right-to-left or left-to-right text direction. See + * _gtk_get_lc_ctype for notes on behaviour on Windows. + * + * Return value: the default language as a #PangoLanguage, must not be + * freed + **/ +PangoLanguage * +gtk_get_default_language (void) +{ + gchar *lang; + PangoLanguage *result; + gchar *p; + + lang = _gtk_get_lc_ctype (); p = strchr (lang, '.'); if (p) *p = '\0'; diff --git a/gtk/gtkmain.h b/gtk/gtkmain.h index 45527b7203..a159aff0a3 100644 --- a/gtk/gtkmain.h +++ b/gtk/gtkmain.h @@ -215,6 +215,8 @@ gchar * _gtk_find_module (const gchar *name, const gchar *type); gchar **_gtk_get_module_path (const gchar *type); +gchar *_gtk_get_lc_ctype (void); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c index ff6864e949..1c48897344 100644 --- a/gtk/gtkrc.c +++ b/gtk/gtkrc.c @@ -840,15 +840,11 @@ gtk_rc_context_parse_file (GtkRcContext *context, gchar *locale_suffixes[2]; gint n_locale_suffixes = 0; gchar *p; - const gchar *locale; + gchar *locale; gint length, j; gboolean found = FALSE; -#ifdef G_OS_WIN32 - locale = g_win32_getlocale (); -#else - locale = setlocale (LC_CTYPE, NULL); -#endif + locale = _gtk_get_lc_ctype (); if (strcmp (locale, "C") && strcmp (locale, "POSIX")) { @@ -873,6 +869,8 @@ gtk_rc_context_parse_file (GtkRcContext *context, locale_suffixes[n_locale_suffixes++] = g_strndup (locale, length); } } + + g_free (locale); gtk_rc_context_parse_one_file (context, filename, priority, reload); for (j = 0; j < n_locale_suffixes; j++) |