This commit is contained in:
parent
f9899d2713
commit
9e96d6be53
@ -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");
|
||||
+ 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) {
|
||||
|
90
gdm-keyboard-invalid-user-data.patch
Normal file
90
gdm-keyboard-invalid-user-data.patch
Normal 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
|
||||
|
11
gdm.changes
11
gdm.changes
@ -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
|
||||
|
||||
|
17
gdm.spec
17
gdm.spec
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user