summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Cameron <brian.cameron@sun.com>2007-06-04 04:18:18 +0000
committerBrian Cameron <bcameron@src.gnome.org>2007-06-04 04:18:18 +0000
commit09f6d13e4c9954ae7be1ece502aed80ee81be772 (patch)
tree2eab0189b009129ee456e16eaa479a95a86288c2
parent8aa8d7369ef21014430e8fd28c809a747ae20bcf (diff)
downloadgdm-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--ChangeLog6
-rw-r--r--gui/gdmcommon.c94
-rw-r--r--gui/gdmcommon.h2
-rw-r--r--gui/gdmlanguages.c5
4 files changed, 106 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 6738ccb7..99129e12 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 */,