From 9e96d6be535078892351ec8a845fc46a9d0f149717cffbb7963fbe6e160ad66e Mon Sep 17 00:00:00 2001 From: OBS User unknown Date: Fri, 12 Jun 2009 16:29:28 +0000 Subject: [PATCH] OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/gdm?expand=0&rev=78 --- gdm-keyboard-from-sysconfig.patch | 186 +++++++++++++-------------- gdm-keyboard-invalid-user-data.patch | 90 +++++++++++++ gdm.changes | 11 ++ gdm.spec | 17 ++- 4 files changed, 202 insertions(+), 102 deletions(-) create mode 100644 gdm-keyboard-invalid-user-data.patch diff --git a/gdm-keyboard-from-sysconfig.patch b/gdm-keyboard-from-sysconfig.patch index 35b9f90..329063e 100644 --- a/gdm-keyboard-from-sysconfig.patch +++ b/gdm-keyboard-from-sysconfig.patch @@ -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 #include @@ -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) { diff --git a/gdm-keyboard-invalid-user-data.patch b/gdm-keyboard-invalid-user-data.patch new file mode 100644 index 0000000..5028d8f --- /dev/null +++ b/gdm-keyboard-invalid-user-data.patch @@ -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 + diff --git a/gdm.changes b/gdm.changes index bdc463b..0946851 100644 --- a/gdm.changes +++ b/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 diff --git a/gdm.spec b/gdm.spec index ccfe40b..8e7c227 100644 --- a/gdm.spec +++ b/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.