105 lines
3.1 KiB
Diff
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";
|
|
}
|