diff -urN gnome-initial-setup-3.28.0.old/gnome-initial-setup/pages/keyboard/gis-keyboard-page.c gnome-initial-setup-3.28.0/gnome-initial-setup/pages/keyboard/gis-keyboard-page.c --- gnome-initial-setup-3.28.0.old/gnome-initial-setup/pages/keyboard/gis-keyboard-page.c 2020-10-23 09:57:27.493000000 +0100 +++ gnome-initial-setup-3.28.0/gnome-initial-setup/pages/keyboard/gis-keyboard-page.c 2020-10-23 15:03:34.772000000 +0100 @@ -37,6 +37,8 @@ #include "keyboard-resources.h" #include "cc-input-chooser.h" +#include "cc-common-language.h" + #define GNOME_DESKTOP_INPUT_SOURCES_DIR "org.gnome.desktop.input-sources" #define KEY_CURRENT_INPUT_SOURCE "current" #define KEY_INPUT_SOURCES "sources" @@ -281,8 +283,7 @@ { const gchar *type; const gchar *id; - const gchar * const *locales; - const gchar *language; + gchar *language; GVariantBuilder builder; GSettings *input_settings; @@ -292,12 +293,12 @@ add_default_keyboard_layout (proxy, &builder); /* add other input sources */ - locales = g_get_language_names (); - language = locales[0]; + language = cc_common_language_get_current_language (); if (gnome_get_input_source_from_locale (language, &type, &id)) { if (!g_str_equal (type, "xkb")) g_variant_builder_add (&builder, "(ss)", type, id); } + g_free (language); g_settings_delay (input_settings); g_settings_set_value (input_settings, KEY_INPUT_SOURCES, g_variant_builder_end (&builder)); @@ -346,8 +347,12 @@ } static void -load_localed_input (GisKeyboardPage *self) +preselect_input_source (GisKeyboardPage *self) { + const gchar *type; + const gchar *id; + gchar *language; + GisKeyboardPagePrivate *priv = gis_keyboard_page_get_instance_private (self); GSList * sources = get_localed_input (priv->localed); @@ -356,11 +361,28 @@ g_slist_free_full (priv->system_sources, g_free); priv->system_sources = g_slist_reverse (sources); - /* We only pre-select the first system layout. */ - if (priv->system_sources) + /* For languages that use an input method, we will add both + * system keyboard layout and the ibus input method. For + * languages that use keyboard layout only, we will add only + * system keyboard layout. Because the keyboard layout + * information from gnome-desktop is not as accurate as system + * keyboard layout, if gnome-desktop returns keyboard layout, + * we ignore it and use system keyboard layout instead. If + * gnome-desktop instead returns an ibus input method, we will + * add both system keyboard layout and the ibus input method. */ + language = cc_common_language_get_current_language (); + + if (!priv->system_sources || + (gnome_get_input_source_from_locale (language, &type, &id) && g_strcmp0 (type, "xkb") != 0)) { + cc_input_chooser_set_input (CC_INPUT_CHOOSER (priv->input_chooser), + id, type); + } else { cc_input_chooser_set_input (CC_INPUT_CHOOSER (priv->input_chooser), (const gchar *) priv->system_sources->data, "xkb"); + } + + g_free (language); } static void @@ -395,7 +417,7 @@ priv->localed = proxy; - load_localed_input (self); + preselect_input_source (self); update_page_complete (self); }