diff options
author | Brian Cameron <brian.cameron@sun.com> | 2007-06-04 04:18:18 +0000 |
---|---|---|
committer | Brian Cameron <bcameron@src.gnome.org> | 2007-06-04 04:18:18 +0000 |
commit | 09f6d13e4c9954ae7be1ece502aed80ee81be772 (patch) | |
tree | 2eab0189b009129ee456e16eaa479a95a86288c2 | |
parent | 8aa8d7369ef21014430e8fd28c809a747ae20bcf (diff) | |
download | gdm-09f6d13e4c9954ae7be1ece502aed80ee81be772.tar.gz |
Now only display languages where the locale is actually installed on the
2007-06-04 Brian Cameron <brian.cameron@sun.com>
* gui/gdmlanguages.c, gui/gdmcommon.[ch]: Now only display languages
where the locale is actually installed on the machine. Fixes bug
#426653. Patch by Ray Strode <rstrode@redhat.com>.
svn path=/trunk/; revision=4951
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | gui/gdmcommon.c | 94 | ||||
-rw-r--r-- | gui/gdmcommon.h | 2 | ||||
-rw-r--r-- | gui/gdmlanguages.c | 5 |
4 files changed, 106 insertions, 1 deletions
@@ -1,5 +1,11 @@ 2007-06-04 Brian Cameron <brian.cameron@sun.com> + * gui/gdmlanguages.c, gui/gdmcommon.[ch]: Now only display languages + where the locale is actually installed on the machine. Fixes bug + #426653. Patch by Ray Strode <rstrode@redhat.com>. + +2007-06-04 Brian Cameron <brian.cameron@sun.com> + * configure.ac, daemon/verify-pam.c: Add Linux auditing support. Patch by Ray Strode <rstrode@redhat.com>. Fixes bug #349835. * daemon/gdm-daemon-config.c, daemon/verify-pam.c, diff --git a/gui/gdmcommon.c b/gui/gdmcommon.c index 37a7428e..5e7956dd 100644 --- a/gui/gdmcommon.c +++ b/gui/gdmcommon.c @@ -32,6 +32,8 @@ #include <sys/types.h> #include <signal.h> +#include <fontconfig/fontconfig.h> + #include <glib/gi18n.h> #include <gdk/gdkx.h> #include <gtk/gtk.h> @@ -928,3 +930,95 @@ gdm_common_expand_text (const gchar *text) return g_string_free (str, FALSE); } +typedef enum +{ + LOCALE_UP_TO_LANGUAGE = 0, + LOCALE_UP_TO_COUNTRY, + LOCALE_UP_TO_ENCODING, + LOCALE_UP_TO_MODIFIER, +} LocaleScope; + +static char * +get_less_specific_locale (const char *locale, + LocaleScope scope) +{ + char *generalized_locale; + char *end; + + generalized_locale = strdup (locale); + + end = strchr (generalized_locale, '_'); + + if (end != NULL && scope <= LOCALE_UP_TO_LANGUAGE) + { + *end = '\0'; + return generalized_locale; + } + + end = strchr (generalized_locale, '.'); + + if (end != NULL && scope <= LOCALE_UP_TO_COUNTRY) + { + *end = '\0'; + return generalized_locale; + } + + end = strchr (generalized_locale, '@'); + + if (end != NULL && scope <= LOCALE_UP_TO_ENCODING) + { + *end = '\0'; + return generalized_locale; + } + + return generalized_locale; +} + +gboolean +gdm_common_locale_is_displayable (const gchar *locale) +{ + char *language_code; + gboolean is_displayable; + + FcPattern *pattern; + FcObjectSet *object_set; + FcFontSet *font_set; + + is_displayable = FALSE; + pattern = NULL; + object_set = NULL; + font_set = NULL; + + language_code = get_less_specific_locale (locale, LOCALE_UP_TO_LANGUAGE); + + pattern = FcPatternBuild (NULL, FC_LANG, FcTypeString, language_code, NULL); + + if (pattern == NULL) + goto done; + + object_set = FcObjectSetBuild (NULL, NULL); + + if (object_set == NULL) + goto done; + + font_set = FcFontList (NULL, pattern, object_set); + + if (font_set == NULL) + goto done; + + is_displayable = (font_set->nfont > 0); + +done: + + if (font_set != NULL) + FcFontSetDestroy (font_set); + + if (object_set != NULL) + FcObjectSetDestroy (object_set); + + if (pattern != NULL) + FcPatternDestroy (pattern); + + g_free (language_code); + return is_displayable; +} diff --git a/gui/gdmcommon.h b/gui/gdmcommon.h index e299b15b..815337e0 100644 --- a/gui/gdmcommon.h +++ b/gui/gdmcommon.h @@ -70,5 +70,5 @@ void gdm_common_pre_fetch_launch (void); void gdm_common_atspi_launch (void); gchar* gdm_common_expand_text (const gchar *text); gchar* gdm_common_get_clock (struct tm **the_tm); - +gboolean gdm_common_locale_is_displayable (const gchar *locale); #endif /* GDM_COMMON_H */ diff --git a/gui/gdmlanguages.c b/gui/gdmlanguages.c index 30b1db75..a590549b 100644 --- a/gui/gdmlanguages.c +++ b/gui/gdmlanguages.c @@ -701,6 +701,11 @@ gdm_lang_initialize_model (gchar * locale_file) li->data = NULL; + if (!gdm_common_locale_is_displayable (lang)) { + g_free (lang); + continue; + } + name = gdm_lang_name (lang, FALSE /* never_encoding */, TRUE /* no_group */, |