c2a24c5
diff -up gnome-settings-daemon-2.24.0/plugins/keyboard/gsd-keyboard-xkb.c.fix-gdm-layout gnome-settings-daemon-2.24.0/plugins/keyboard/gsd-keyboard-xkb.c
0589607
--- gnome-settings-daemon-2.24.0/plugins/keyboard/gsd-keyboard-xkb.c.fix-gdm-layout	2008-10-14 09:26:57.000000000 -0400
0589607
+++ gnome-settings-daemon-2.24.0/plugins/keyboard/gsd-keyboard-xkb.c	2008-10-14 09:27:09.000000000 -0400
0589607
@@ -142,12 +142,39 @@ apply_xkb_settings (void)
c2a24c5
 {
c2a24c5
         GConfClient *conf_client;
c2a24c5
         GkbdKeyboardConfig current_sys_kbd_config;
c2a24c5
+        int group_to_activate = -1;
0589607
+        const char *gdm_layout;
c2a24c5
 
c2a24c5
         if (!inited_ok)
c2a24c5
                 return;
ef224b3
 
ef224b3
         conf_client = gconf_client_get_default ();
ef224b3
 
ef224b3
+        /* With GDM the user can already set a layout from the login
ef224b3
+         * screen. Try to keep that setting.
ef224b3
+         * We clear gdm_keyboard_layout early, so we don't risk 
ef224b3
+         * recursion from gconf notification.
ef224b3
+         */
ef224b3
+        gdm_layout = gdm_keyboard_layout;
ef224b3
+        gdm_keyboard_layout = NULL;
ef224b3
+        if (gdm_layout != NULL) {
ef224b3
+                GSList *layouts;
ef224b3
+                layouts = gconf_client_get_list (conf_client,
ef224b3
+                                                 GKBD_KEYBOARD_CONFIG_KEY_LAYOUTS,
0589607
+                                                GCONF_VALUE_STRING,
ef224b3
+                                                 NULL);    
ef224b3
+                if (layouts == NULL) {
ef224b3
+                        layouts = g_slist_append (layouts, g_strdup (gdm_layout));
ef224b3
+                        gconf_client_set_list (conf_client,
ef224b3
+                                               GKBD_KEYBOARD_CONFIG_KEY_LAYOUTS,
ef224b3
+                                               GCONF_VALUE_STRING,
ef224b3
+                                               layouts,
ef224b3
+                                               NULL);
ef224b3
+                }
0589607
+               g_slist_foreach (layouts, (GFunc)g_free, NULL);
0589607
+                g_slist_free (layouts);
ef224b3
+        }
ef224b3
+
ef224b3
         gkbd_keyboard_config_init (&current_sys_kbd_config,
ef224b3
                                    conf_client,
ef224b3
                                    xkl_engine);
0589607
@@ -158,29 +185,20 @@ apply_xkb_settings (void)
ef224b3
         gkbd_keyboard_config_load_from_x_current (&current_sys_kbd_config,
ef224b3
                                                   NULL);
ef224b3
 
ef224b3
-        /* With GDM the user can already set a layout from the login
ef224b3
-         * screen. Try to keep that setting */
ef224b3
-        if (gdm_keyboard_layout != NULL) {
ef224b3
-                if (current_kbd_config.layouts_variants == NULL) {
ef224b3
-                        current_kbd_config.layouts_variants = g_slist_append (NULL, (char *) gdm_keyboard_layout);
ef224b3
-                        gconf_client_set_list (conf_client,
ef224b3
-                                               GKBD_KEYBOARD_CONFIG_KEY_LAYOUTS,
ef224b3
-                                               GCONF_VALUE_STRING,
ef224b3
-                                               current_kbd_config.layouts_variants,
ef224b3
-                                               NULL);
ef224b3
-                } else {
ef224b3
-                         GSList *l;
ef224b3
-                         int i;
ef224b3
-                         size_t len = strlen (gdm_keyboard_layout);
ef224b3
-                         for (i = 0, l = current_kbd_config.layouts_variants; l; i++, l = l->next) {
ef224b3
-                                 char *lv = l->data;
ef224b3
-                                 if (strncmp (lv, gdm_keyboard_layout, len) == 0 && (lv[len] == '\0' || lv[len] == '\t')) {
c2a24c5
-                                        xkl_engine_lock_group (current_config.engine, i);
ef224b3
-                                        break;
ef224b3
-                                 }
ef224b3
-                         }
ef224b3
+        if (gdm_layout != NULL) {
ef224b3
+                /* If there are multiple layouts, 
ef224b3
+                 * try to find the one closest to the gdm layout
ef224b3
+                 */
ef224b3
+                GSList *l;
ef224b3
+                int i;
ef224b3
+                size_t len = strlen (gdm_layout);
ef224b3
+                for (i = 0, l = current_kbd_config.layouts_variants; l; i++, l = l->next) {
ef224b3
+                        char *lv = l->data;
9741231
+                        if (strncmp (lv, gdm_layout, len) == 0 && (lv[len] == '\0' || lv[len] == '\t')) {
ef224b3
+                                group_to_activate = i;
ef224b3
+                                break;
ef224b3
+                        }
ef224b3
                 }
ef224b3
-                gdm_keyboard_layout = NULL;
ef224b3
         }
ef224b3
 
0589607
         /* Activate - only if different! */
0589607
@@ -199,6 +217,8 @@ apply_xkb_settings (void)
c2a24c5
                 xkl_debug (100,
c2a24c5
                            "Actual KBD configuration was not changed: redundant notification\n");
c2a24c5
 
c2a24c5
+        if (group_to_activate != -1)
c2a24c5
+                xkl_engine_lock_group (current_config.engine, group_to_activate);
c2a24c5
         gkbd_keyboard_config_term (&current_sys_kbd_config);
c2a24c5
 }
c2a24c5