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

105 lines
3.1 KiB
Diff

Index: gdm-2.26.1/daemon/gdm-session-direct.c
===================================================================
--- gdm-2.26.1.orig/daemon/gdm-session-direct.c
+++ gdm-2.26.1/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"
@@ -598,12 +600,88 @@ get_default_language_name (GdmSessionDir
return setlocale (LC_MESSAGES, NULL);
}
+static char *
+_get_layout_name_from_sax_map (const char *layout)
+{
+ char *map_file;
+ char **lines;
+ char **fields;
+ int i;
+ char *retval;
+
+ if (!layout)
+ return NULL;
+
+ if (!g_file_get_contents ("/usr/share/sax/sysp/maps/Keyboard.map",
+ &map_file, NULL, NULL))
+ return NULL;
+
+ lines = g_strsplit (map_file, "\n", 0);
+ g_free (map_file);
+
+ retval = NULL;
+ for (i = 0; lines[i] != NULL; i++) {
+ if (lines[i][0] == '\n' || lines[i][0] == '#')
+ continue;
+
+ fields = g_strsplit (lines[i], ":", 0);
+
+ g_strstrip (fields[0]);
+ if (fields[0] && fields[1] && fields[2] &&
+ strcmp (fields[0], layout) == 0) {
+ char *add_layouts;
+
+ g_strstrip (fields[2]);
+
+ add_layouts = strchr (fields[2], ',');
+ if (add_layouts)
+ add_layouts[0] = '\0';
+
+ retval = g_strdup (fields[2]);
+ g_strfreev (fields);
+ break;
+ }
+
+ g_strfreev (fields);
+ }
+
+ g_strfreev (lines);
+
+ return retval;
+}
+
+static char *
+_get_default_layout_name_from_sysconfig (void)
+{
+ char *sysconfig_layout;
+ char *layout;
+
+ sysconfig_layout = gdm_sysconfig_load_value ("/etc/sysconfig/keyboard", "KEYTABLE");
+ if (!sysconfig_layout)
+ return NULL;
+
+ if (g_str_has_suffix (sysconfig_layout, ".gz"))
+ *(sysconfig_layout + strlen (sysconfig_layout) - strlen (".gz")) = '\0';
+ if (g_str_has_suffix (sysconfig_layout, ".map"))
+ *(sysconfig_layout + strlen (sysconfig_layout) - strlen (".map")) = '\0';
+
+ layout = _get_layout_name_from_sax_map (sysconfig_layout);
+
+ if (layout) {
+ g_free (sysconfig_layout);
+ return layout;
+ } else
+ return sysconfig_layout;
+}
+
static const char *
get_default_layout_name (GdmSessionDirect *session)
{
- if (session->priv->saved_layout != NULL) {
+ if (!session->priv->saved_layout)
+ session->priv->saved_layout = _get_default_layout_name_from_sysconfig ();
+
+ if (session->priv->saved_layout)
return session->priv->saved_layout;
- }
return "us";
}