gnome-settings-daemon/fix-gdm-layout.patch
Matthias Clasen 9741231ded fix patch
2008-10-14 13:42:27 +00:00

96 lines
4.7 KiB
Diff

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-14 09:26:57.000000000 -0400
+++ gnome-settings-daemon-2.24.0/plugins/keyboard/gsd-keyboard-xkb.c 2008-10-14 09:27:09.000000000 -0400
@@ -142,12 +142,39 @@ 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);
+ }
+ g_slist_foreach (layouts, (GFunc)g_free, NULL);
+ g_slist_free (layouts);
+ }
+
gkbd_keyboard_config_init (&current_sys_kbd_config,
conf_client,
xkl_engine);
@@ -158,29 +185,20 @@ apply_xkb_settings (void)
gkbd_keyboard_config_load_from_x_current (&current_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;
}
/* Activate - only if different! */
@@ -199,6 +217,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 (&current_sys_kbd_config);
}