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: gdm-2.26.1/daemon/gdm-session-direct.c
|
||||||
index 75a1cec..15ea4e3 100644
|
===================================================================
|
||||||
--- a/daemon/gdm-session-direct.c
|
--- gdm-2.26.1.orig/daemon/gdm-session-direct.c
|
||||||
+++ b/daemon/gdm-session-direct.c
|
+++ gdm-2.26.1/daemon/gdm-session-direct.c
|
||||||
@@ -45,6 +45,8 @@
|
@@ -45,6 +45,8 @@
|
||||||
#include <dbus/dbus-glib.h>
|
#include <dbus/dbus-glib.h>
|
||||||
#include <dbus/dbus-glib-lowlevel.h>
|
#include <dbus/dbus-glib-lowlevel.h>
|
||||||
@ -11,106 +11,94 @@ index 75a1cec..15ea4e3 100644
|
|||||||
#include "gdm-session-direct.h"
|
#include "gdm-session-direct.h"
|
||||||
#include "gdm-session.h"
|
#include "gdm-session.h"
|
||||||
#include "gdm-session-private.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 *
|
static const char *
|
||||||
get_default_layout_name (GdmSessionDirect *session)
|
get_default_layout_name (GdmSessionDirect *session)
|
||||||
{
|
{
|
||||||
- if (session->priv->saved_layout != NULL) {
|
- if (session->priv->saved_layout != NULL) {
|
||||||
- return session->priv->saved_layout;
|
+ if (!session->priv->saved_layout)
|
||||||
+ if (!session->priv->saved_layout)
|
+ session->priv->saved_layout = _get_default_layout_name_from_sysconfig ();
|
||||||
+ session->priv->saved_layout = gdm_sysconfig_load_value ("/etc/sysconfig/keyboard", "KEYTABLE");
|
|
||||||
+
|
+
|
||||||
+ if (session->priv->saved_layout) {
|
+ if (session->priv->saved_layout)
|
||||||
+ if (g_str_has_suffix (session->priv->saved_layout, ".gz"))
|
return session->priv->saved_layout;
|
||||||
+ *(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;
|
|
||||||
}
|
|
||||||
|
|
||||||
return "us";
|
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
|
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
|
License: GPL v2 or later
|
||||||
Group: System/GUI/GNOME
|
Group: System/GUI/GNOME
|
||||||
Version: 2.26.1
|
Version: 2.26.1
|
||||||
Release: 2
|
Release: 3
|
||||||
Summary: The GNOME 2.x Display Manager
|
Summary: The GNOME 2.x Display Manager
|
||||||
Source: %{name}-%{version}.tar.bz2
|
Source: %{name}-%{version}.tar.bz2
|
||||||
Source1: gdm.pamd
|
Source1: gdm.pamd
|
||||||
@ -84,10 +84,12 @@ Patch26: gdm-fix-locale-listing.patch
|
|||||||
Patch30: gdm-dbus-allow-introspection.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
|
# 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
|
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
|
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
|
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
|
# PATCH-FIX-OPENSUSE gdm-selinux.patch -- Small changes to make it compile fine with SELinux
|
||||||
Patch60: gdm-selinux.patch
|
Patch60: gdm-selinux.patch
|
||||||
Url: http://www.gnome.org/
|
Url: http://www.gnome.org/
|
||||||
@ -176,6 +178,7 @@ gnome-patch-translation-prepare
|
|||||||
%else
|
%else
|
||||||
%patch33 -p1
|
%patch33 -p1
|
||||||
%endif
|
%endif
|
||||||
|
%patch34 -p1
|
||||||
%patch60
|
%patch60
|
||||||
gnome-patch-translation-update
|
gnome-patch-translation-update
|
||||||
|
|
||||||
@ -284,6 +287,14 @@ fi
|
|||||||
%files lang -f %{name}.lang
|
%files lang -f %{name}.lang
|
||||||
|
|
||||||
%changelog
|
%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
|
* Fri May 15 2009 vuntz@novell.com
|
||||||
- Add gdm-keyboard-from-hal.patch to read the default keyboard
|
- Add gdm-keyboard-from-hal.patch to read the default keyboard
|
||||||
layout from hal on 11.2, should fix bnc#478083 and bnc#492284.
|
layout from hal on 11.2, should fix bnc#478083 and bnc#492284.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user