SHA256
1
0
forked from pool/gdm
gdm/gdm-keyboard-from-sysconfig.patch

117 lines
4.1 KiB
Diff
Raw Normal View History

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) {