summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@jhu.edu>2007-09-19 20:53:28 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2007-09-19 20:53:28 +0000
commitef54e1c1c2d5c994e9671424e10ef911dfb0697b (patch)
treef9bf9fe6d69b11f25ecfc36149287154198512ad
parentefe7c44bb6d32724b23db404da9bc57132630d64 (diff)
downloadgdm-ef54e1c1c2d5c994e9671424e10ef911dfb0697b.tar.gz
Add lang setting capability and set initially to $LANG
2007-09-19 William Jon McCann <mccann@jhu.edu> * gui/simple-greeter/gdm-language-chooser-dialog.c: (gdm_language_chooser_dialog_init): * gui/simple-greeter/gdm-language-chooser-widget.c: (parse_locale), (construct_language_name), (select_name), (gdm_language_chooser_widget_set_current_language_name), (collect_locales_from_archive), (collect_locales_from_directory): * gui/simple-greeter/gdm-language-chooser-widget.h: * gui/simple-greeter/test-language-chooser.c: (main): Add lang setting capability and set initially to $LANG svn path=/branches/mccann-gobject/; revision=5298
-rw-r--r--ChangeLog12
-rw-r--r--gui/simple-greeter/gdm-language-chooser-dialog.c2
-rw-r--r--gui/simple-greeter/gdm-language-chooser-widget.c223
-rw-r--r--gui/simple-greeter/gdm-language-chooser-widget.h2
-rw-r--r--gui/simple-greeter/test-language-chooser.c2
5 files changed, 175 insertions, 66 deletions
diff --git a/ChangeLog b/ChangeLog
index 9f27f148..9f800103 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,18 @@
2007-09-19 William Jon McCann <mccann@jhu.edu>
* gui/simple-greeter/gdm-language-chooser-dialog.c:
+ (gdm_language_chooser_dialog_init):
+ * gui/simple-greeter/gdm-language-chooser-widget.c: (parse_locale),
+ (construct_language_name), (select_name),
+ (gdm_language_chooser_widget_set_current_language_name),
+ (collect_locales_from_archive), (collect_locales_from_directory):
+ * gui/simple-greeter/gdm-language-chooser-widget.h:
+ * gui/simple-greeter/test-language-chooser.c: (main):
+ Add lang setting capability and set initially to $LANG
+
+2007-09-19 William Jon McCann <mccann@jhu.edu>
+
+ * gui/simple-greeter/gdm-language-chooser-dialog.c:
(gdm_language_chooser_dialog_dispose):
* gui/simple-greeter/gdm-language-chooser-widget.c:
(gdm_language_chooser_widget_get_current_language_name):
diff --git a/gui/simple-greeter/gdm-language-chooser-dialog.c b/gui/simple-greeter/gdm-language-chooser-dialog.c
index 36bcb7cd..20ff64f6 100644
--- a/gui/simple-greeter/gdm-language-chooser-dialog.c
+++ b/gui/simple-greeter/gdm-language-chooser-dialog.c
@@ -154,6 +154,8 @@ gdm_language_chooser_dialog_init (GdmLanguageChooserDialog *dialog)
dialog->priv = GDM_LANGUAGE_CHOOSER_DIALOG_GET_PRIVATE (dialog);
dialog->priv->chooser_widget = gdm_language_chooser_widget_new ();
+ gdm_language_chooser_widget_set_current_language_name (GDM_LANGUAGE_CHOOSER_WIDGET (dialog->priv->chooser_widget), g_getenv ("LANG"));
+
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), dialog->priv->chooser_widget);
gtk_dialog_add_buttons (GTK_DIALOG (dialog),
diff --git a/gui/simple-greeter/gdm-language-chooser-widget.c b/gui/simple-greeter/gdm-language-chooser-widget.c
index c4a9f732..0188f0f1 100644
--- a/gui/simple-greeter/gdm-language-chooser-widget.c
+++ b/gui/simple-greeter/gdm-language-chooser-widget.c
@@ -108,6 +108,77 @@ chooser_locale_free (GdmChooserLocale *locale)
g_free (locale);
}
+/*
+ * According to http://en.wikipedia.org/wiki/Locale
+ * locale names are of the form:
+ * [language[_territory][.codeset][@modifier]]
+ */
+static void
+parse_locale (const char *name,
+ char **language_codep,
+ char **territory_codep,
+ char **codesetp,
+ char **modifierp)
+{
+ GRegex *re;
+ GMatchInfo *match_info;
+ gboolean res;
+ GError *error;
+
+ error = NULL;
+ re = g_regex_new ("(?P<language>[a-zA-Z]+)(_(?P<territory>[a-zA-Z]+))?(.(?P<codeset>[0-9a-zA-Z]+))?(@(?P<modifier>[0-9a-zA-Z]+))?", 0, 0, &error);
+ if (re == NULL) {
+ g_critical (error->message);
+ }
+
+ g_regex_match (re, name, 0, &match_info);
+
+ res = g_match_info_matches (match_info);
+ if (! res) {
+ g_warning ("Unable to parse locale: %s", name);
+ return;
+ }
+
+ if (language_codep != NULL) {
+ *language_codep = g_match_info_fetch_named (match_info, "language");
+ }
+
+ if (territory_codep != NULL) {
+ *territory_codep = g_match_info_fetch_named (match_info, "territory");
+ }
+
+ if (codesetp != NULL) {
+ *codesetp = g_match_info_fetch_named (match_info, "codeset");
+ }
+
+ if (modifierp != NULL) {
+ *modifierp = g_match_info_fetch_named (match_info, "modifier");
+ }
+
+ g_match_info_free (match_info);
+ g_regex_unref (re);
+}
+
+static char *
+construct_language_name (const char *language,
+ const char *territory,
+ const char *codeset,
+ const char *modifier)
+{
+ char *name;
+
+ /* Ignore codeset and modifier for this */
+ if (territory == NULL) {
+ name = g_strdup (language);
+ } else {
+ name = g_strdup_printf ("%s_%s",
+ language,
+ territory);
+ }
+
+ return name;
+}
+
char *
gdm_language_chooser_widget_get_current_language_name (GdmLanguageChooserWidget *widget)
{
@@ -124,6 +195,90 @@ gdm_language_chooser_widget_get_current_language_name (GdmLanguageChooserWidget
}
static void
+select_name (GdmLanguageChooserWidget *widget,
+ const char *name)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GtkTreePath *path;
+
+ path = NULL;
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget->priv->treeview));
+
+ if (name != NULL && gtk_tree_model_get_iter_first (model, &iter)) {
+
+ do {
+ GdmChooserLocale *locale;
+ gboolean found;
+
+ gtk_tree_model_get (model,
+ &iter,
+ CHOOSER_LIST_LOCALE_COLUMN, &locale,
+ -1);
+ found = (locale != NULL
+ && locale->name != NULL
+ && strcmp (locale->name, name) == 0);
+
+ if (found) {
+ path = gtk_tree_model_get_path (model, &iter);
+ break;
+ }
+
+ } while (gtk_tree_model_iter_next (model, &iter));
+ }
+
+ if (path != NULL) {
+ gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (widget->priv->treeview),
+ path,
+ gtk_tree_view_get_column (GTK_TREE_VIEW (widget->priv->treeview), 0),
+ TRUE, 0.5, 0.0);
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (widget->priv->treeview),
+ path,
+ NULL,
+ FALSE);
+
+ gtk_tree_path_free (path);
+ }
+}
+
+void
+gdm_language_chooser_widget_set_current_language_name (GdmLanguageChooserWidget *widget,
+ const char *lang_name)
+{
+ GtkTreeSelection *selection;
+
+ g_return_if_fail (GDM_IS_LANGUAGE_CHOOSER_WIDGET (widget));
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget->priv->treeview));
+
+ if (lang_name == NULL) {
+ gtk_tree_selection_unselect_all (selection);
+ } else {
+ char *name;
+ char *language_code;
+ char *territory_code;
+
+ language_code = NULL;
+ territory_code = NULL;
+
+ /* in case this is a locale name and not a short name */
+ parse_locale (lang_name,
+ &language_code,
+ &territory_code,
+ NULL,
+ NULL);
+
+ name = construct_language_name (language_code, territory_code, NULL, NULL);
+ select_name (widget, name);
+
+ g_free (name);
+ g_free (language_code);
+ g_free (territory_code);
+ }
+}
+
+static void
gdm_language_chooser_widget_set_property (GObject *object,
guint prop_id,
const GValue *value,
@@ -323,57 +478,6 @@ get_lc_identification (GdmChooserLocale *locale,
#endif
}
-/*
- * According to http://en.wikipedia.org/wiki/Locale
- * locale names are of the form:
- * [language[_territory][.codeset][@modifier]]
- */
-static void
-parse_locale (const char *name,
- char **language_codep,
- char **territory_codep,
- char **codesetp,
- char **modifierp)
-{
- GRegex *re;
- GMatchInfo *match_info;
- gboolean res;
- GError *error;
-
- error = NULL;
- re = g_regex_new ("(?P<language>[a-zA-Z]+)(_(?P<territory>[a-zA-Z]+))?(.(?P<codeset>[0-9a-zA-Z]+))?(@(?P<modifier>[0-9a-zA-Z]+))?", 0, 0, &error);
- if (re == NULL) {
- g_critical (error->message);
- }
-
- g_regex_match (re, name, 0, &match_info);
-
- res = g_match_info_matches (match_info);
- if (! res) {
- g_warning ("Unable to parse locale: %s", name);
- return;
- }
-
- if (language_codep != NULL) {
- *language_codep = g_match_info_fetch_named (match_info, "language");
- }
-
- if (territory_codep != NULL) {
- *territory_codep = g_match_info_fetch_named (match_info, "territory");
- }
-
- if (codesetp != NULL) {
- *codesetp = g_match_info_fetch_named (match_info, "codeset");
- }
-
- if (modifierp != NULL) {
- *modifierp = g_match_info_fetch_named (match_info, "modifier");
- }
-
- g_match_info_free (match_info);
- g_regex_unref (re);
-}
-
struct nameent
{
char *name;
@@ -444,14 +548,7 @@ collect_locales_from_archive (GdmLanguageChooserWidget *widget)
NULL,
NULL);
- /* Ignore codeset and modifier for this */
- if (locale->territory_code == NULL) {
- locale->name = g_strdup (locale->language_code);
- } else {
- locale->name = g_strdup_printf ("%s_%s",
- locale->language_code,
- locale->territory_code);
- }
+ locale->name = construct_language_name (locale->language_code, locale->territory_code, NULL, NULL);
if (g_hash_table_lookup (widget->priv->available_locales, locale->name) != NULL) {
chooser_locale_free (locale);
@@ -528,13 +625,7 @@ collect_locales_from_directory (GdmLanguageChooserWidget *widget)
NULL);
/* Ignore codeset and modifier for this */
- if (locale->territory_code == NULL) {
- locale->name = g_strdup (locale->language_code);
- } else {
- locale->name = g_strdup_printf ("%s_%s",
- locale->language_code,
- locale->territory_code);
- }
+ locale->name = construct_language_name (locale->language_code, locale->territory_code, NULL, NULL);
if (g_hash_table_lookup (widget->priv->available_locales, locale->name) != NULL) {
chooser_locale_free (locale);
diff --git a/gui/simple-greeter/gdm-language-chooser-widget.h b/gui/simple-greeter/gdm-language-chooser-widget.h
index 6879ca99..1d61d549 100644
--- a/gui/simple-greeter/gdm-language-chooser-widget.h
+++ b/gui/simple-greeter/gdm-language-chooser-widget.h
@@ -53,6 +53,8 @@ GType gdm_language_chooser_widget_get_type
GtkWidget * gdm_language_chooser_widget_new (void);
char * gdm_language_chooser_widget_get_current_language_name (GdmLanguageChooserWidget *widget);
+void gdm_language_chooser_widget_set_current_language_name (GdmLanguageChooserWidget *widget,
+ const char *lang_name);
G_END_DECLS
diff --git a/gui/simple-greeter/test-language-chooser.c b/gui/simple-greeter/test-language-chooser.c
index 1a4176a1..a9d7bb24 100644
--- a/gui/simple-greeter/test-language-chooser.c
+++ b/gui/simple-greeter/test-language-chooser.c
@@ -46,6 +46,8 @@ main (int argc, char *argv[])
gtk_init (&argc, &argv);
dialog = gdm_language_chooser_dialog_new ();
+ gtk_widget_set_size_request (dialog, 480, 480);
+
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) {
char *name;