117 lines
4.1 KiB
Diff
117 lines
4.1 KiB
Diff
|
diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c
|
||
|
index 75a1cec..15ea4e3 100644
|
||
|
--- a/daemon/gdm-session-direct.c
|
||
|
+++ b/daemon/gdm-session-direct.c
|
||
|
@@ -45,6 +45,8 @@
|
||
|
#include <dbus/dbus-glib.h>
|
||
|
#include <dbus/dbus-glib-lowlevel.h>
|
||
|
|
||
|
+#include "gdm-sysconfig.h"
|
||
|
+
|
||
|
#include "gdm-session-direct.h"
|
||
|
#include "gdm-session.h"
|
||
|
#include "gdm-session-private.h"
|
||
|
@@ -600,8 +602,21 @@ get_default_language_name (GdmSessionDirect *session)
|
||
|
static const char *
|
||
|
get_default_layout_name (GdmSessionDirect *session)
|
||
|
{
|
||
|
- if (session->priv->saved_layout != NULL) {
|
||
|
- return session->priv->saved_layout;
|
||
|
+ if (!session->priv->saved_layout)
|
||
|
+ session->priv->saved_layout = gdm_sysconfig_load_value ("/etc/sysconfig/keyboard", "KEYTABLE");
|
||
|
+
|
||
|
+ if (session->priv->saved_layout) {
|
||
|
+ if (g_str_has_suffix (session->priv->saved_layout, ".gz"))
|
||
|
+ *(session->priv->saved_layout + strlen (session->priv->saved_layout) - strlen (".gz")) = '\0';
|
||
|
+ if (g_str_has_suffix (session->priv->saved_layout, ".map"))
|
||
|
+ *(session->priv->saved_layout + strlen (session->priv->saved_layout) - strlen (".map")) = '\0';
|
||
|
+
|
||
|
+ /* Lame attempt to make it map correctly from some console keymaps, e.g.
|
||
|
+ * fr-latin1, no-latin1 -> fr, no */
|
||
|
+ if (strchr (session->priv->saved_layout, '-'))
|
||
|
+ *(strchr (session->priv->saved_layout, '-')) = '\0';
|
||
|
+
|
||
|
+ return session->priv->saved_layout;
|
||
|
}
|
||
|
|
||
|
return "us";
|
||
|
diff --git a/gui/simple-greeter/gdm-layouts.c b/gui/simple-greeter/gdm-layouts.c
|
||
|
index 479d5ea..fba3147 100644
|
||
|
--- a/gui/simple-greeter/gdm-layouts.c
|
||
|
+++ b/gui/simple-greeter/gdm-layouts.c
|
||
|
@@ -70,14 +70,35 @@ xci_desc_to_utf8 (XklConfigItem * ci)
|
||
|
g_locale_to_utf8 (sd, -1, NULL, NULL, NULL);
|
||
|
}
|
||
|
|
||
|
+static gchar *
|
||
|
+canonicalize_layout_name (const gchar *name)
|
||
|
+{
|
||
|
+ gchar *canon_name;
|
||
|
+
|
||
|
+ if (!name)
|
||
|
+ return NULL;
|
||
|
+
|
||
|
+ canon_name = g_strdup (name);
|
||
|
+
|
||
|
+ if (g_str_has_suffix (canon_name, ".gz"))
|
||
|
+ *(canon_name + strlen (canon_name) - strlen (".gz")) = '\0';
|
||
|
+ if (g_str_has_suffix (canon_name, ".map"))
|
||
|
+ *(canon_name + strlen (canon_name) - strlen (".map")) = '\0';
|
||
|
+
|
||
|
+ return canon_name;
|
||
|
+}
|
||
|
+
|
||
|
static void
|
||
|
add_variant (XklConfigRegistry *config,
|
||
|
const XklConfigItem *item,
|
||
|
gpointer data)
|
||
|
{
|
||
|
LayoutData *ldata = data;
|
||
|
+ gchar *name;
|
||
|
|
||
|
- ldata->list = g_slist_prepend (ldata->list, g_strdup_printf ("%s\t%s", ldata->layout, item->name));
|
||
|
+ name = canonicalize_layout_name (item->name);
|
||
|
+ ldata->list = g_slist_prepend (ldata->list, g_strdup_printf ("%s\t%s", ldata->layout, name));
|
||
|
+ g_free (name);
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
@@ -86,11 +107,16 @@ add_layout (XklConfigRegistry *config,
|
||
|
gpointer data)
|
||
|
{
|
||
|
LayoutData *ldata = data;
|
||
|
+ gchar *name;
|
||
|
|
||
|
- ldata->layout = item->name;
|
||
|
- ldata->list = g_slist_prepend (ldata->list, g_strdup (item->name));
|
||
|
- xkl_config_registry_foreach_layout_variant (config, item->name, add_variant, data);
|
||
|
+ name = canonicalize_layout_name (item->name);
|
||
|
+
|
||
|
+ ldata->layout = name;
|
||
|
+ ldata->list = g_slist_prepend (ldata->list, g_strdup (name));
|
||
|
+ xkl_config_registry_foreach_layout_variant (config, name, add_variant, data);
|
||
|
ldata->layout = NULL;
|
||
|
+
|
||
|
+ g_free (name);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
@@ -108,7 +134,7 @@ gdm_get_layout_from_name (const char *name)
|
||
|
|
||
|
init_xkl ();
|
||
|
|
||
|
- id1 = g_strdup (name);
|
||
|
+ id1 = canonicalize_layout_name (name);
|
||
|
p = strchr (id1, '\t');
|
||
|
|
||
|
if (p != NULL) {
|
||
|
@@ -207,7 +233,7 @@ gdm_layout_activate (const char *layout)
|
||
|
config->options = g_strdupv (initial_config->options);
|
||
|
} else {
|
||
|
config->layouts = g_new0 (char *, 2);
|
||
|
- config->layouts[0] = g_strdup (layout);
|
||
|
+ config->layouts[0] = canonicalize_layout_name (layout);
|
||
|
|
||
|
p = strchr (config->layouts[0], '\t');
|
||
|
if (p != NULL) {
|