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 #include +#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"; }