OBS User unknown 2009-06-12 16:29:28 +00:00 committed by Git OBS Bridge
parent f9899d2713
commit 9e96d6be53
4 changed files with 202 additions and 102 deletions

View File

@ -1,7 +1,7 @@
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
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>
@ -11,106 +11,94 @@ index 75a1cec..15ea4e3 100644
#include "gdm-session-direct.h"
#include "gdm-session.h"
#include "gdm-session-private.h"
@@ -600,8 +602,21 @@ get_default_language_name (GdmSessionDirect *session)
@@ -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) {
- 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)
+ session->priv->saved_layout = _get_default_layout_name_from_sysconfig ();
+
+ 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;
}
+ if (session->priv->saved_layout)
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) {

View File

@ -0,0 +1,90 @@
diff --git a/gui/simple-greeter/gdm-greeter-panel.c b/gui/simple-greeter/gdm-greeter-panel.c
index 6aded10..a5bf2c8 100644
--- a/gui/simple-greeter/gdm-greeter-panel.c
+++ b/gui/simple-greeter/gdm-greeter-panel.c
@@ -724,6 +724,20 @@ gdm_greeter_panel_set_default_layout_name (GdmGreeterPanel *panel,
g_return_if_fail (GDM_IS_GREETER_PANEL (panel));
if (layout_name != NULL &&
+ !gdm_layout_is_valid (layout_name)) {
+ const char *init_layout;
+
+ init_layout = gdm_layout_get_init_layout ();
+
+ g_debug ("GdmGreeterPanel: default layout %s is invalid, resetting to: %s",
+ layout_name, init_layout ? init_layout : "null");
+
+ g_signal_emit (panel, signals[LAYOUT_SELECTED], 0, init_layout);
+
+ layout_name = init_layout;
+ }
+
+ if (layout_name != NULL &&
!gdm_option_widget_lookup_item (GDM_OPTION_WIDGET (panel->priv->layout_option_widget),
layout_name, NULL, NULL, NULL)) {
gdm_recent_option_widget_add_item (GDM_RECENT_OPTION_WIDGET (panel->priv->layout_option_widget),
diff --git a/gui/simple-greeter/gdm-layouts.c b/gui/simple-greeter/gdm-layouts.c
index dc35094..59f6706 100644
--- a/gui/simple-greeter/gdm-layouts.c
+++ b/gui/simple-greeter/gdm-layouts.c
@@ -189,6 +189,41 @@ gdm_get_all_layout_names (void)
#endif
}
+gboolean
+gdm_layout_is_valid (const char *layout)
+{
+#ifdef HAVE_LIBXKLAVIER
+ XklConfigItem *item;
+ gboolean retval;
+
+ item = xkl_config_item_new ();
+ g_snprintf (item->name, XKL_MAX_CI_NAME_LENGTH, "%s", layout);
+
+ retval = xkl_config_registry_find_layout (config_registry, item);
+
+ g_object_unref (item);
+
+ return retval;
+#else
+ return TRUE;
+#endif
+}
+
+const char *
+gdm_layout_get_init_layout (void)
+{
+#ifdef HAVE_LIBXKLAVIER
+ init_xkl ();
+
+ if (initial_config->layouts)
+ return initial_config->layouts[0];
+ else
+ return NULL;
+#else
+ return NULL;
+#endif
+}
+
void
gdm_layout_activate (const char *layout)
{
diff --git a/gui/simple-greeter/gdm-layouts.h b/gui/simple-greeter/gdm-layouts.h
index a87b620..bf1afba 100644
--- a/gui/simple-greeter/gdm-layouts.h
+++ b/gui/simple-greeter/gdm-layouts.h
@@ -24,9 +24,11 @@
G_BEGIN_DECLS
-char * gdm_get_layout_from_name (const char *name);
-char ** gdm_get_all_layout_names (void);
-void gdm_layout_activate (const char *layout);
+char * gdm_get_layout_from_name (const char *name);
+char ** gdm_get_all_layout_names (void);
+gboolean gdm_layout_is_valid (const char *layout);
+const char * gdm_layout_get_init_layout (void);
+void gdm_layout_activate (const char *layout);
G_END_DECLS

View File

@ -1,3 +1,14 @@
-------------------------------------------------------------------
Tue Jun 9 23:54:48 CEST 2009 - vuntz@novell.com
- Update gdm-keyboard-from-sysconfig.patch: we correctly interpret
the keyboard layout specified in sysconfig thanks to a map file
from sax that we use to convert the layout name to a X layout.
- Add gdm-keyboard-invalid-user-data.patch: the old gdm was not
setting a valid keyboard layout in some cases, and this invalid
layout ended up in ~/.dmrc. This patch makes gdm detect this and
revert the user data to the default layout.
-------------------------------------------------------------------
Fri May 15 11:04:57 CEST 2009 - vuntz@novell.com

View File

@ -42,7 +42,7 @@ BuildRequires: zenity
License: GPL v2 or later
Group: System/GUI/GNOME
Version: 2.26.1
Release: 2
Release: 3
Summary: The GNOME 2.x Display Manager
Source: %{name}-%{version}.tar.bz2
Source1: gdm.pamd
@ -84,10 +84,12 @@ Patch26: gdm-fix-locale-listing.patch
Patch30: gdm-dbus-allow-introspection.patch
# PATCH-FIX-OPENSUSE gdm-gconf-path.patch vuntz@novell.com -- Fix gconf paths to be consistent with the ones used in openSUSE
Patch31: gdm-gconf-path.patch
# PATCH-FIX-OPENSUSE gdm-keyboard-from-hal.patch bnc492284 bnc478083 vuntz@novell.com -- Read the keyboard layout from hal
# PATCH-FIX-UPSTREAM gdm-keyboard-from-hal.patch bnc492284 bnc478083 vuntz@novell.com -- Read the keyboard layout from hal
Patch32: gdm-keyboard-from-hal.patch
# PATCH-FIX-UPSTREAM gdm-keyboard-from-sysconfig.patch bnc432360 bnc478083 hpj@novell.com -- Read keyboard options from sysconfig (for openSUSE <= 11.1, since keyboard layout wasn't in hal)
# PATCH-FIX-OPENSUSE gdm-keyboard-from-sysconfig.patch bnc432360 bnc478083 hpj@novell.com -- Read keyboard options from sysconfig (for openSUSE <= 11.1, since keyboard layout wasn't in hal)
Patch33: gdm-keyboard-from-sysconfig.patch
# PATCH-FIX-UPSTREAM gdm-keyboard-invalid-user-data.patch bgo585263 vuntz@novell.com -- Ignore invalid keyboard layout from ~/.dmrc
Patch34: gdm-keyboard-invalid-user-data.patch
# PATCH-FIX-OPENSUSE gdm-selinux.patch -- Small changes to make it compile fine with SELinux
Patch60: gdm-selinux.patch
Url: http://www.gnome.org/
@ -176,6 +178,7 @@ gnome-patch-translation-prepare
%else
%patch33 -p1
%endif
%patch34 -p1
%patch60
gnome-patch-translation-update
@ -284,6 +287,14 @@ fi
%files lang -f %{name}.lang
%changelog
* Tue Jun 09 2009 vuntz@novell.com
- Update gdm-keyboard-from-sysconfig.patch: we correctly interpret
the keyboard layout specified in sysconfig thanks to a map file
from sax that we use to convert the layout name to a X layout.
- Add gdm-keyboard-invalid-user-data.patch: the old gdm was not
setting a valid keyboard layout in some cases, and this invalid
layout ended up in ~/.dmrc. This patch makes gdm detect this and
revert the user data to the default layout.
* Fri May 15 2009 vuntz@novell.com
- Add gdm-keyboard-from-hal.patch to read the default keyboard
layout from hal on 11.2, should fix bnc#478083 and bnc#492284.