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 --- gnome-settings-daemon-2.24.0/plugins/keyboard/gsd-keyboard-xkb.c.fix-gdm-layout 2008-10-12 14:45:57.000000000 -0400 +++ gnome-settings-daemon-2.24.0/plugins/keyboard/gsd-keyboard-xkb.c 2008-10-12 15:11:51.000000000 -0400 @@ -142,12 +142,38 @@ apply_xkb_settings (void) { GConfClient *conf_client; GkbdKeyboardConfig current_sys_kbd_config; + int group_to_activate = -1; + const char *gdm_layout; if (!inited_ok) return; conf_client = gconf_client_get_default (); + /* With GDM the user can already set a layout from the login + * screen. Try to keep that setting. + * We clear gdm_keyboard_layout early, so we don't risk + * recursion from gconf notification. + */ + gdm_layout = gdm_keyboard_layout; + gdm_keyboard_layout = NULL; + if (gdm_layout != NULL) { + GSList *layouts; + + layouts = gconf_client_get_list (conf_client, + GKBD_KEYBOARD_CONFIG_KEY_LAYOUTS, + GCONF_VALUE_STRING, + NULL); + if (layouts == NULL) { + layouts = g_slist_append (layouts, g_strdup (gdm_layout)); + gconf_client_set_list (conf_client, + GKBD_KEYBOARD_CONFIG_KEY_LAYOUTS, + GCONF_VALUE_STRING, + layouts, + NULL); + } + } + gkbd_keyboard_config_init (¤t_sys_kbd_config, conf_client, xkl_engine); @@ -158,29 +184,20 @@ apply_xkb_settings (void) gkbd_keyboard_config_load_from_x_current (¤t_sys_kbd_config, NULL); - /* With GDM the user can already set a layout from the login - * screen. Try to keep that setting */ - if (gdm_keyboard_layout != NULL) { - if (current_kbd_config.layouts_variants == NULL) { - current_kbd_config.layouts_variants = g_slist_append (NULL, (char *) gdm_keyboard_layout); - gconf_client_set_list (conf_client, - GKBD_KEYBOARD_CONFIG_KEY_LAYOUTS, - GCONF_VALUE_STRING, - current_kbd_config.layouts_variants, - NULL); - } else { - GSList *l; - int i; - size_t len = strlen (gdm_keyboard_layout); - for (i = 0, l = current_kbd_config.layouts_variants; l; i++, l = l->next) { - char *lv = l->data; - if (strncmp (lv, gdm_keyboard_layout, len) == 0 && (lv[len] == '\0' || lv[len] == '\t')) { - xkl_engine_lock_group (current_config.engine, i); - break; - } - } + if (gdm_layout != NULL) { + /* If there are multiple layouts, + * try to find the one closest to the gdm layout + */ + GSList *l; + int i; + size_t len = strlen (gdm_layout); + for (i = 0, l = current_kbd_config.layouts_variants; l; i++, l = l->next) { + char *lv = l->data; + if (strncmp (lv, gdm_layout, len) == 0 && (lv[len] == '\0' || lv[len] == '\t')) { + group_to_activate = i; + break; + } } - gdm_keyboard_layout = NULL; } /* Ignore model if using evdev, since evdev needs its own model @@ -206,6 +223,8 @@ apply_xkb_settings (void) xkl_debug (100, "Actual KBD configuration was not changed: redundant notification\n"); + if (group_to_activate != -1) + xkl_engine_lock_group (current_config.engine, group_to_activate); gkbd_keyboard_config_term (¤t_sys_kbd_config); }