summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Untz <vuntz@gnome.org>2009-06-09 23:45:54 +0200
committerVincent Untz <vuntz@gnome.org>2009-06-15 18:16:35 +0200
commit966a59bf0680152fe92f8f08d4db9b3df7a8eeec (patch)
tree52c44a7bf9f92b2d73c1b46614e1c2cbe0cd2947
parent74cdbc6d71120f2d9c91965ead989f68cadb4bac (diff)
downloadgdm-966a59bf0680152fe92f8f08d4db9b3df7a8eeec.tar.gz
Correctly handle invalid xkb layout from ~/.dmrc
We check that the xkb layout/variant that the daemon gives us is valid, and if it's not, we use the default layout/variant (ie, what was set when X started). This is useful for users that have a broken ~/.dmrc. http://bugzilla.gnome.org/show_bug.cgi?id=585263
-rw-r--r--gui/simple-greeter/gdm-greeter-panel.c14
-rw-r--r--gui/simple-greeter/gdm-layouts.c50
-rw-r--r--gui/simple-greeter/gdm-layouts.h8
3 files changed, 69 insertions, 3 deletions
diff --git a/gui/simple-greeter/gdm-greeter-panel.c b/gui/simple-greeter/gdm-greeter-panel.c
index 6aded10e..0ae1c545 100644
--- a/gui/simple-greeter/gdm-greeter-panel.c
+++ b/gui/simple-greeter/gdm-greeter-panel.c
@@ -724,6 +724,20 @@ gdm_greeter_panel_set_default_layout_name (GdmGreeterPanel *panel,
g_return_if_fail (GDM_IS_GREETER_PANEL (panel));
if (layout_name != NULL &&
+ !gdm_layout_is_valid (layout_name)) {
+ const char *default_layout;
+
+ default_layout = gdm_layout_get_default_layout ();
+
+ g_debug ("GdmGreeterPanel: default layout %s is invalid, resetting to: %s",
+ layout_name, default_layout ? default_layout : "null");
+
+ g_signal_emit (panel, signals[LAYOUT_SELECTED], 0, default_layout);
+
+ layout_name = default_layout;
+ }
+
+ if (layout_name != NULL &&
!gdm_option_widget_lookup_item (GDM_OPTION_WIDGET (panel->priv->layout_option_widget),
layout_name, NULL, NULL, NULL)) {
gdm_recent_option_widget_add_item (GDM_RECENT_OPTION_WIDGET (panel->priv->layout_option_widget),
diff --git a/gui/simple-greeter/gdm-layouts.c b/gui/simple-greeter/gdm-layouts.c
index dc350944..07554e6d 100644
--- a/gui/simple-greeter/gdm-layouts.c
+++ b/gui/simple-greeter/gdm-layouts.c
@@ -189,6 +189,56 @@ gdm_get_all_layout_names (void)
#endif
}
+gboolean
+gdm_layout_is_valid (const char *layout_variant)
+{
+#ifdef HAVE_LIBXKLAVIER
+ XklConfigItem *item;
+ char *layout;
+ char *variant;
+ gboolean retval;
+
+ layout = g_strdup (layout_variant);
+ variant = strchr (layout, '\t');
+ if (variant != NULL) {
+ variant[0] = '\0';
+ variant++;
+ }
+
+ item = xkl_config_item_new ();
+ g_snprintf (item->name, XKL_MAX_CI_NAME_LENGTH, "%s", layout);
+
+ retval = xkl_config_registry_find_layout (config_registry, item);
+
+ if (retval && variant != NULL) {
+ g_snprintf (item->name, XKL_MAX_CI_NAME_LENGTH, "%s", variant);
+ retval = xkl_config_registry_find_variant (config_registry, layout, item);
+ }
+
+ g_object_unref (item);
+ g_free (layout);
+
+ return retval;
+#else
+ return TRUE;
+#endif
+}
+
+const char *
+gdm_layout_get_default_layout (void)
+{
+#ifdef HAVE_LIBXKLAVIER
+ init_xkl ();
+
+ if (initial_config->layouts)
+ return initial_config->layouts[0];
+ else
+ return NULL;
+#else
+ return NULL;
+#endif
+}
+
void
gdm_layout_activate (const char *layout)
{
diff --git a/gui/simple-greeter/gdm-layouts.h b/gui/simple-greeter/gdm-layouts.h
index a87b620a..9e1b99ba 100644
--- a/gui/simple-greeter/gdm-layouts.h
+++ b/gui/simple-greeter/gdm-layouts.h
@@ -24,9 +24,11 @@
G_BEGIN_DECLS
-char * gdm_get_layout_from_name (const char *name);
-char ** gdm_get_all_layout_names (void);
-void gdm_layout_activate (const char *layout);
+char * gdm_get_layout_from_name (const char *name);
+char ** gdm_get_all_layout_names (void);
+gboolean gdm_layout_is_valid (const char *layout);
+const char * gdm_layout_get_default_layout (void);
+void gdm_layout_activate (const char *layout);
G_END_DECLS