From 5b0e54097b6ebd972aed91f9a16610e08853ab3f Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Sat, 24 Oct 2020 06:08:51 +0000 Subject: [PATCH] import gnome-initial-setup-3.28.0-9.el8 --- .gitignore | 1 + .gnome-initial-setup.metadata | 1 + SOURCES/allow-weak-passwords.patch | 30 + ...l-setup-3.28.0-fix-japanese-defaults.patch | 91 ++ SOURCES/honor-firstboot-disabled.patch | 88 ++ SOURCES/quacks-like-fedora.patch | 24 + SOURCES/reduce-initial-setup-redundancy.patch | 974 ++++++++++++++++++ SOURCES/vendor.conf | 3 + SPECS/gnome-initial-setup.spec | 469 +++++++++ 9 files changed, 1681 insertions(+) create mode 100644 .gitignore create mode 100644 .gnome-initial-setup.metadata create mode 100644 SOURCES/allow-weak-passwords.patch create mode 100644 SOURCES/gnome-initial-setup-3.28.0-fix-japanese-defaults.patch create mode 100644 SOURCES/honor-firstboot-disabled.patch create mode 100644 SOURCES/quacks-like-fedora.patch create mode 100644 SOURCES/reduce-initial-setup-redundancy.patch create mode 100644 SOURCES/vendor.conf create mode 100644 SPECS/gnome-initial-setup.spec diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ddb4942 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/gnome-initial-setup-3.28.0.tar.xz diff --git a/.gnome-initial-setup.metadata b/.gnome-initial-setup.metadata new file mode 100644 index 0000000..01d9151 --- /dev/null +++ b/.gnome-initial-setup.metadata @@ -0,0 +1 @@ +79d6f8ce89086aba95c1fd519053af523d4409ea SOURCES/gnome-initial-setup-3.28.0.tar.xz diff --git a/SOURCES/allow-weak-passwords.patch b/SOURCES/allow-weak-passwords.patch new file mode 100644 index 0000000..c3203c3 --- /dev/null +++ b/SOURCES/allow-weak-passwords.patch @@ -0,0 +1,30 @@ +From 985f2a009ddf5179482e7551400cf8065553707e Mon Sep 17 00:00:00 2001 +From: Michael Catanzaro +Date: Wed, 11 Apr 2018 22:16:54 -0500 +Subject: Revert "Revert "Don't hard-enforce strong passwords"" + +This reverts commit 0c67a9800c7832dd55c046adc372833a96a96cf0. + +This is a requirement for Fedora, but I suspect few distros want to +irritate users right off the bat by dictating which passwords may be +used. +--- + gnome-initial-setup/pages/password/gis-password-page.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gnome-initial-setup/pages/password/gis-password-page.c b/gnome-initial-setup/pages/password/gis-password-page.c +index cf3db9e..731666d 100644 +--- a/gnome-initial-setup/pages/password/gis-password-page.c ++++ b/gnome-initial-setup/pages/password/gis-password-page.c +@@ -59,7 +59,7 @@ page_validate (GisPasswordPage *page) + { + GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page); + +- return priv->valid_confirm && priv->valid_password; ++ return priv->valid_confirm; + } + + static void +-- +cgit v0.12 + diff --git a/SOURCES/gnome-initial-setup-3.28.0-fix-japanese-defaults.patch b/SOURCES/gnome-initial-setup-3.28.0-fix-japanese-defaults.patch new file mode 100644 index 0000000..71755da --- /dev/null +++ b/SOURCES/gnome-initial-setup-3.28.0-fix-japanese-defaults.patch @@ -0,0 +1,91 @@ +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); + } + diff --git a/SOURCES/honor-firstboot-disabled.patch b/SOURCES/honor-firstboot-disabled.patch new file mode 100644 index 0000000..958d1d9 --- /dev/null +++ b/SOURCES/honor-firstboot-disabled.patch @@ -0,0 +1,88 @@ +From b2659246f3e2afcbf51a92ee6839775de4e6487a Mon Sep 17 00:00:00 2001 +From: Rui Matos +Date: Mon, 23 Jan 2017 19:42:44 +0100 +Subject: [PATCH] Exit gracefully if we are disabled systemwide + +Sysadmins might want to disable any kind of initial setup for their +users, perhaps because they pre-configure their environments. We +should provide an easy way to do it. + +At least the anaconda installer provides an option to skip any kind +post-install setup tools so, for now we're only adding support for +that but more might be added in the future. + +https://bugzilla.gnome.org/show_bug.cgi?id=777707 +--- + gnome-initial-setup/Makefile.am | 3 ++- + gnome-initial-setup/gnome-initial-setup.c | 34 +++++++++++++++++++++++++++++++ + 2 files changed, 36 insertions(+), 1 deletion(-) + +diff --git a/gnome-initial-setup/Makefile.am b/gnome-initial-setup/Makefile.am +index d275dda..465b598 100644 +--- a/gnome-initial-setup/Makefile.am ++++ b/gnome-initial-setup/Makefile.am +@@ -11,7 +11,8 @@ AM_CPPFLAGS = \ + -DUIDIR="\"$(uidir)\"" \ + -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \ + -DLIBLOCALEDIR=\""$(prefix)/lib/locale"\" \ +- -DDATADIR=\""$(datadir)"\" ++ -DDATADIR=\""$(datadir)"\" \ ++ -DSYSCONFDIR=\""$(sysconfdir)"\" + + libexec_PROGRAMS = gnome-initial-setup gnome-initial-setup-copy-worker + +diff --git a/gnome-initial-setup/gnome-initial-setup.c b/gnome-initial-setup/gnome-initial-setup.c +index 2ec91b9..10b5f84 100644 +--- a/gnome-initial-setup/gnome-initial-setup.c ++++ b/gnome-initial-setup/gnome-initial-setup.c +@@ -186,6 +186,31 @@ get_mode (void) + return GIS_DRIVER_MODE_NEW_USER; + } + ++static gboolean ++initial_setup_disabled_by_anaconda (void) ++{ ++ GKeyFile *key_file; ++ const gchar *file_name = SYSCONFDIR "/sysconfig/anaconda"; ++ gboolean disabled = FALSE; ++ GError *error = NULL; ++ ++ key_file = g_key_file_new (); ++ if (!g_key_file_load_from_file (key_file, file_name, G_KEY_FILE_NONE, &error)) { ++ if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT) && ++ !g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND)) { ++ g_warning ("Could not read %s: %s", file_name, error->message); ++ } ++ g_error_free (error); ++ goto out; ++ } ++ ++ disabled = g_key_file_get_boolean (key_file, "General", ++ "post_install_tools_disabled", NULL); ++ out: ++ g_key_file_unref (key_file); ++ return disabled; ++} ++ + int + main (int argc, char *argv[]) + { +@@ -226,6 +251,15 @@ main (int argc, char *argv[]) + + mode = get_mode (); + ++ /* We only do this in existing-user mode, because if gdm launches us ++ * in new-user mode and we just exit, gdm's special g-i-s session ++ * never terminates. */ ++ if (initial_setup_disabled_by_anaconda () && ++ mode == GIS_DRIVER_MODE_EXISTING_USER) { ++ gis_ensure_stamp_files (); ++ exit (EXIT_SUCCESS); ++ } ++ + /* When we are running as the gnome-initial-setup user we + * dont have a normal user session and need to initialize + * the keyring manually so that we can pass the credentials +-- +2.9.3 + diff --git a/SOURCES/quacks-like-fedora.patch b/SOURCES/quacks-like-fedora.patch new file mode 100644 index 0000000..2d88d8e --- /dev/null +++ b/SOURCES/quacks-like-fedora.patch @@ -0,0 +1,24 @@ +diff -up gnome-initial-setup-3.28.0/gnome-initial-setup/pages/language/gis-language-page.c.quacks_like_fedora gnome-initial-setup-3.28.0/gnome-initial-setup/pages/language/gis-language-page.c +--- gnome-initial-setup-3.28.0/gnome-initial-setup/pages/language/gis-language-page.c.quacks_like_fedora 2019-02-18 11:06:22.404874101 -0500 ++++ gnome-initial-setup-3.28.0/gnome-initial-setup/pages/language/gis-language-page.c 2019-02-18 13:29:59.069513421 -0500 +@@ -227,11 +227,18 @@ update_distro_logo (GisLanguagePage *pag + + if (g_file_get_contents ("/etc/os-release", &buffer, NULL, NULL)) + { +- id = get_item (buffer, "ID"); ++ id = get_item (buffer, "ID_LIKE"); ++ ++ if (id == NULL) ++ id = get_item (buffer, "ID"); ++ + g_free (buffer); + } + +- if (g_strcmp0 (id, "fedora") == 0) ++ if (id != NULL && ++ (strcmp (id, "fedora") == 0 || ++ strstr (id, " fedora") != NULL || ++ strstr (id, "fedora ") != NULL)) + { + g_object_set (priv->logo, "icon-name", "fedora-logo-icon", NULL); + } diff --git a/SOURCES/reduce-initial-setup-redundancy.patch b/SOURCES/reduce-initial-setup-redundancy.patch new file mode 100644 index 0000000..a34470b --- /dev/null +++ b/SOURCES/reduce-initial-setup-redundancy.patch @@ -0,0 +1,974 @@ +From de07cbc69b8f64b1a7708f454f029814d3c48b10 Mon Sep 17 00:00:00 2001 +From: Michael Catanzaro +Date: Thu, 15 Feb 2018 21:08:38 -0600 +Subject: [PATCH] Reduce initial setup redundancy + +This contains patches from these bugs: + +https://bugzilla.gnome.org/show_bug.cgi?id=793501 +https://bugzilla.gnome.org/show_bug.cgi?id=794166 + +modified a bit to not conflict with each other. + +This is a combination of work by Peng Wu and Michael Catanzaro. +--- + gnome-initial-setup/gis-assistant.c | 3 +- + gnome-initial-setup/gis-page.c | 8 + + gnome-initial-setup/gis-page.h | 2 + + gnome-initial-setup/gnome-initial-setup.c | 77 +++++++-- + .../pages/account/gis-account-page.h | 2 - + .../pages/account/gis-account-pages.c | 9 +- + .../pages/account/gis-account-pages.h | 2 +- + gnome-initial-setup/pages/eulas/gis-eula-pages.c | 16 +- + gnome-initial-setup/pages/eulas/gis-eula-pages.h | 2 +- + gnome-initial-setup/pages/goa/gis-goa-page.c | 9 +- + gnome-initial-setup/pages/goa/gis-goa-page.h | 2 +- + .../pages/keyboard/gis-keyboard-page.c | 185 ++++++++++++++++----- + .../pages/keyboard/gis-keyboard-page.h | 2 +- + .../pages/language/gis-language-page.c | 24 ++- + .../pages/language/gis-language-page.h | 3 +- + .../pages/language/gis-language-page.ui | 4 +- + .../pages/network/gis-network-page.c | 9 +- + .../pages/network/gis-network-page.h | 2 +- + .../pages/password/gis-password-page.c | 9 +- + .../pages/password/gis-password-page.h | 2 +- + .../pages/privacy/gis-privacy-page.c | 9 +- + .../pages/privacy/gis-privacy-page.h | 2 +- + gnome-initial-setup/pages/region/gis-region-page.c | 9 +- + gnome-initial-setup/pages/region/gis-region-page.h | 2 +- + .../pages/software/gis-software-page.c | 14 +- + .../pages/software/gis-software-page.h | 2 +- + .../pages/summary/gis-summary-page.c | 9 +- + .../pages/summary/gis-summary-page.h | 2 +- + .../pages/timezone/gis-timezone-page.c | 9 +- + .../pages/timezone/gis-timezone-page.h | 2 +- + 30 files changed, 296 insertions(+), 136 deletions(-) + +diff --git a/gnome-initial-setup/gis-assistant.c b/gnome-initial-setup/gis-assistant.c +index 37ed563..0a3bd05 100644 +--- a/gnome-initial-setup/gis-assistant.c ++++ b/gnome-initial-setup/gis-assistant.c +@@ -302,7 +302,8 @@ gis_assistant_add_page (GisAssistant *assistant, + + gtk_container_add (GTK_CONTAINER (priv->stack), GTK_WIDGET (page)); + +- if (priv->current_page->assistant_priv->link == link->prev) ++ if (priv->current_page && ++ priv->current_page->assistant_priv->link == link->prev) + update_navigation_buttons (assistant); + } + +diff --git a/gnome-initial-setup/gis-page.c b/gnome-initial-setup/gis-page.c +index e28f573..8564935 100644 +--- a/gnome-initial-setup/gis-page.c ++++ b/gnome-initial-setup/gis-page.c +@@ -382,3 +382,11 @@ gis_page_shown (GisPage *page) + if (GIS_PAGE_GET_CLASS (page)->shown) + GIS_PAGE_GET_CLASS (page)->shown (page); + } ++ ++gboolean ++gis_page_skip (GisPage *page) ++{ ++ if (GIS_PAGE_GET_CLASS (page)->skip) ++ return GIS_PAGE_GET_CLASS (page)->skip (page); ++ return TRUE; ++} +diff --git a/gnome-initial-setup/gis-page.h b/gnome-initial-setup/gis-page.h +index 02e3085..1f11578 100644 +--- a/gnome-initial-setup/gis-page.h ++++ b/gnome-initial-setup/gis-page.h +@@ -60,6 +60,7 @@ struct _GisPageClass + GCancellable *cancellable); + void (*save_data) (GisPage *page); + void (*shown) (GisPage *page); ++ gboolean (*skip) (GisPage *page); + }; + + GType gis_page_get_type (void); +@@ -80,6 +81,7 @@ void gis_page_apply_complete (GisPage *page, gboolean valid); + gboolean gis_page_get_applying (GisPage *page); + void gis_page_save_data (GisPage *page); + void gis_page_shown (GisPage *page); ++gboolean gis_page_skip (GisPage *page); + + G_END_DECLS + +diff --git a/gnome-initial-setup/gnome-initial-setup.c b/gnome-initial-setup/gnome-initial-setup.c +index 5a988a3..4558810 100644 +--- a/gnome-initial-setup/gnome-initial-setup.c ++++ b/gnome-initial-setup/gnome-initial-setup.c +@@ -50,11 +50,15 @@ + #include "pages/summary/gis-summary-page.h" + + #define VENDOR_PAGES_GROUP "pages" +-#define VENDOR_PAGES_SKIP_KEY "skip" ++#define VENDOR_SKIP_KEY "skip" ++#define VENDOR_NEW_USER_ONLY_KEY "new_user_only" ++#define VENDOR_EXISTING_USER_ONLY_KEY "existing_user_only" + + static gboolean force_existing_user_mode; + +-typedef void (*PreparePage) (GisDriver *driver); ++static GPtrArray *skipped_pages; ++ ++typedef GisPage *(*PreparePage) (GisDriver *driver); + + typedef struct { + const gchar *page_id; +@@ -101,21 +105,40 @@ should_skip_page (GisDriver *driver, + } + + static gchar ** +-pages_to_skip_from_file (void) ++strv_append (gchar **a, ++ gchar **b) ++{ ++ guint n = g_strv_length (a); ++ guint m = g_strv_length (b); ++ ++ a = g_renew (gchar *, a, n + m + 1); ++ for (guint i = 0; i < m; i++) ++ a[n + i] = g_strdup (b[i]); ++ a[n + m] = NULL; ++ ++ return a; ++} ++ ++static gchar ** ++pages_to_skip_from_file (gboolean is_new_user) + { + GKeyFile *skip_pages_file; + gchar **skip_pages = NULL; ++ gchar **additional_skip_pages = NULL; + GError *error = NULL; + + /* VENDOR_CONF_FILE points to a keyfile containing vendor customization + * options. This code will look for options under the "pages" group, and + * supports the following keys: +- * - skip (optional): list of pages to be skipped. ++ * - skip (optional): list of pages to be skipped always ++ * - new_user_only (optional): list of pages to be skipped in existing user mode ++ * - existing_user_only (optional): list of pages to be skipped in new user mode + * +- * This is how this file would look on a vendor image: ++ * This is how this file might look on a vendor image: + * + * [pages] +- * skip=language ++ * skip=timezone ++ * existing_user_only=language;keyboard + */ + skip_pages_file = g_key_file_new (); + if (!g_key_file_load_from_file (skip_pages_file, VENDOR_CONF_FILE, +@@ -127,8 +150,20 @@ pages_to_skip_from_file (void) + goto out; + } + +- skip_pages = g_key_file_get_string_list (skip_pages_file, VENDOR_PAGES_GROUP, +- VENDOR_PAGES_SKIP_KEY, NULL, NULL); ++ skip_pages = g_key_file_get_string_list (skip_pages_file, ++ VENDOR_PAGES_GROUP, ++ VENDOR_SKIP_KEY, NULL, NULL); ++ additional_skip_pages = g_key_file_get_string_list (skip_pages_file, ++ VENDOR_PAGES_GROUP, ++ is_new_user ? VENDOR_EXISTING_USER_ONLY_KEY : VENDOR_NEW_USER_ONLY_KEY, ++ NULL, NULL); ++ ++ if (!skip_pages && additional_skip_pages) { ++ skip_pages = additional_skip_pages; ++ } else if (skip_pages && additional_skip_pages) { ++ skip_pages = strv_append (skip_pages, additional_skip_pages); ++ g_strfreev (additional_skip_pages); ++ } + + out: + g_key_file_free (skip_pages_file); +@@ -159,16 +194,14 @@ static void + rebuild_pages_cb (GisDriver *driver) + { + PageData *page_data; ++ GisPage *page; + GisAssistant *assistant; + GisPage *current_page; + gchar **skip_pages; +- gboolean is_new_user; ++ gboolean is_new_user, skipped; + + assistant = gis_driver_get_assistant (driver); + current_page = gis_assistant_get_current_page (assistant); +- +- skip_pages = pages_to_skip_from_file (); +- + page_data = page_table; + + if (current_page != NULL) { +@@ -182,14 +215,23 @@ rebuild_pages_cb (GisDriver *driver) + } + + is_new_user = (gis_driver_get_mode (driver) == GIS_DRIVER_MODE_NEW_USER); ++ skip_pages = pages_to_skip_from_file (is_new_user); ++ + for (; page_data->page_id != NULL; ++page_data) { +- if (page_data->new_user_only && !is_new_user) +- continue; ++ skipped = FALSE; ++ ++ if ((page_data->new_user_only && !is_new_user) || ++ (should_skip_page (driver, page_data->page_id, skip_pages))) ++ skipped = TRUE; + +- if (should_skip_page (driver, page_data->page_id, skip_pages)) ++ page = page_data->prepare_page_func (driver); ++ if (!page) + continue; + +- page_data->prepare_page_func (driver); ++ if (skipped && gis_page_skip (page)) ++ g_ptr_array_add (skipped_pages, page); ++ else ++ gis_driver_add_page (driver, page); + } + + g_strfreev (skip_pages); +@@ -267,6 +309,7 @@ main (int argc, char *argv[]) + } + #endif + ++ skipped_pages = g_ptr_array_new_with_free_func ((GDestroyNotify)gtk_widget_destroy); + mode = get_mode (); + + /* We only do this in existing-user mode, because if gdm launches us +@@ -290,6 +333,8 @@ main (int argc, char *argv[]) + g_signal_connect (driver, "rebuild-pages", G_CALLBACK (rebuild_pages_cb), NULL); + status = g_application_run (G_APPLICATION (driver), argc, argv); + ++ g_ptr_array_free (skipped_pages, TRUE); ++ + g_object_unref (driver); + g_option_context_free (context); + return status; +diff --git a/gnome-initial-setup/pages/account/gis-account-page.h b/gnome-initial-setup/pages/account/gis-account-page.h +index cc34304..7629e1a 100644 +--- a/gnome-initial-setup/pages/account/gis-account-page.h ++++ b/gnome-initial-setup/pages/account/gis-account-page.h +@@ -50,8 +50,6 @@ struct _GisAccountPageClass + + GType gis_account_page_get_type (void); + +-void gis_prepare_account_page (GisDriver *driver); +- + G_END_DECLS + + #endif /* __GIS_ACCOUNT_PAGE_H__ */ +diff --git a/gnome-initial-setup/pages/account/gis-account-pages.c b/gnome-initial-setup/pages/account/gis-account-pages.c +index 5f4411b..d9cc8d9 100644 +--- a/gnome-initial-setup/pages/account/gis-account-pages.c ++++ b/gnome-initial-setup/pages/account/gis-account-pages.c +@@ -23,11 +23,10 @@ + #include "gis-account-pages.h" + #include "gis-account-page.h" + +-void ++GisPage * + gis_prepare_account_page (GisDriver *driver) + { +- gis_driver_add_page (driver, +- g_object_new (GIS_TYPE_ACCOUNT_PAGE, +- "driver", driver, +- NULL)); ++ return g_object_new (GIS_TYPE_ACCOUNT_PAGE, ++ "driver", driver, ++ NULL); + } +diff --git a/gnome-initial-setup/pages/account/gis-account-pages.h b/gnome-initial-setup/pages/account/gis-account-pages.h +index 20d615a..394421b 100644 +--- a/gnome-initial-setup/pages/account/gis-account-pages.h ++++ b/gnome-initial-setup/pages/account/gis-account-pages.h +@@ -28,7 +28,7 @@ + + G_BEGIN_DECLS + +-void gis_prepare_account_page (GisDriver *driver); ++GisPage *gis_prepare_account_page (GisDriver *driver); + + G_END_DECLS + +diff --git a/gnome-initial-setup/pages/eulas/gis-eula-pages.c b/gnome-initial-setup/pages/eulas/gis-eula-pages.c +index 8c989c2..3de6653 100644 +--- a/gnome-initial-setup/pages/eulas/gis-eula-pages.c ++++ b/gnome-initial-setup/pages/eulas/gis-eula-pages.c +@@ -25,7 +25,7 @@ + #include "gis-eula-pages.h" + #include "gis-eula-page.h" + +-void ++GisPage * + gis_prepare_eula_page (GisDriver *driver) + { + gchar *eulas_dir_path; +@@ -33,6 +33,7 @@ gis_prepare_eula_page (GisDriver *driver) + GError *error = NULL; + GFileEnumerator *enumerator = NULL; + GFileInfo *info; ++ GisPage *page = NULL; + + eulas_dir_path = g_build_filename (PKGDATADIR, "eulas", NULL); + eulas_dir = g_file_new_for_path (eulas_dir_path); +@@ -52,11 +53,12 @@ gis_prepare_eula_page (GisDriver *driver) + + while ((info = g_file_enumerator_next_file (enumerator, NULL, &error)) != NULL) { + GFile *eula = g_file_enumerator_get_child (enumerator, info); +- gis_driver_add_page (driver, +- g_object_new (GIS_TYPE_EULA_PAGE, +- "driver", driver, +- "eula", eula, +- NULL)); ++ ++ page = g_object_new (GIS_TYPE_EULA_PAGE, ++ "driver", driver, ++ "eula", eula, ++ NULL); ++ + g_object_unref (eula); + } + +@@ -71,4 +73,6 @@ gis_prepare_eula_page (GisDriver *driver) + + g_object_unref (eulas_dir); + g_clear_object (&enumerator); ++ ++ return page; + } +diff --git a/gnome-initial-setup/pages/eulas/gis-eula-pages.h b/gnome-initial-setup/pages/eulas/gis-eula-pages.h +index 9424a6d..54906bc 100644 +--- a/gnome-initial-setup/pages/eulas/gis-eula-pages.h ++++ b/gnome-initial-setup/pages/eulas/gis-eula-pages.h +@@ -28,7 +28,7 @@ + + G_BEGIN_DECLS + +-void gis_prepare_eula_page (GisDriver *driver); ++GisPage *gis_prepare_eula_page (GisDriver *driver); + + G_END_DECLS + +diff --git a/gnome-initial-setup/pages/goa/gis-goa-page.c b/gnome-initial-setup/pages/goa/gis-goa-page.c +index fcdcabe..3ed4e98 100644 +--- a/gnome-initial-setup/pages/goa/gis-goa-page.c ++++ b/gnome-initial-setup/pages/goa/gis-goa-page.c +@@ -363,11 +363,10 @@ gis_goa_page_init (GisGoaPage *page) + gtk_widget_init_template (GTK_WIDGET (page)); + } + +-void ++GisPage * + gis_prepare_goa_page (GisDriver *driver) + { +- gis_driver_add_page (driver, +- g_object_new (GIS_TYPE_GOA_PAGE, +- "driver", driver, +- NULL)); ++ return g_object_new (GIS_TYPE_GOA_PAGE, ++ "driver", driver, ++ NULL); + } +diff --git a/gnome-initial-setup/pages/goa/gis-goa-page.h b/gnome-initial-setup/pages/goa/gis-goa-page.h +index e65aa28..31918bf 100644 +--- a/gnome-initial-setup/pages/goa/gis-goa-page.h ++++ b/gnome-initial-setup/pages/goa/gis-goa-page.h +@@ -48,7 +48,7 @@ struct _GisGoaPageClass + + GType gis_goa_page_get_type (void); + +-void gis_prepare_goa_page (GisDriver *driver); ++GisPage *gis_prepare_goa_page (GisDriver *driver); + + G_END_DECLS + +diff --git a/gnome-initial-setup/pages/keyboard/gis-keyboard-page.c b/gnome-initial-setup/pages/keyboard/gis-keyboard-page.c +index 91d9a25..445da30 100644 +--- a/gnome-initial-setup/pages/keyboard/gis-keyboard-page.c ++++ b/gnome-initial-setup/pages/keyboard/gis-keyboard-page.c +@@ -30,6 +30,9 @@ + #include + #include + ++#define GNOME_DESKTOP_USE_UNSTABLE_API ++#include ++ + #include "gis-keyboard-page.h" + #include "keyboard-resources.h" + #include "cc-input-chooser.h" +@@ -208,53 +211,145 @@ gis_keyboard_page_apply (GisPage *page, + return FALSE; + } + ++static GSList * ++get_localed_input (GDBusProxy *proxy) ++{ ++ GVariant *v; ++ const gchar *s; ++ gchar *id; ++ guint i, n; ++ gchar **layouts = NULL; ++ gchar **variants = NULL; ++ GSList *sources = NULL; ++ ++ if (!proxy) ++ return NULL; ++ ++ v = g_dbus_proxy_get_cached_property (proxy, "X11Layout"); ++ if (v) { ++ s = g_variant_get_string (v, NULL); ++ layouts = g_strsplit (s, ",", -1); ++ g_variant_unref (v); ++ } ++ ++ v = g_dbus_proxy_get_cached_property (proxy, "X11Variant"); ++ if (v) { ++ s = g_variant_get_string (v, NULL); ++ if (s && *s) ++ variants = g_strsplit (s, ",", -1); ++ g_variant_unref (v); ++ } ++ ++ if (variants && variants[0]) ++ n = MIN (g_strv_length (layouts), g_strv_length (variants)); ++ else if (layouts && layouts[0]) ++ n = g_strv_length (layouts); ++ else ++ n = 0; ++ ++ for (i = 0; i < n && layouts[i][0]; i++) { ++ if (variants && variants[i] && variants[i][0]) ++ id = g_strdup_printf ("%s+%s", layouts[i], variants[i]); ++ else ++ id = g_strdup (layouts[i]); ++ sources = g_slist_prepend (sources, id); ++ } ++ ++ g_strfreev (variants); ++ g_strfreev (layouts); ++ ++ return sources; ++} ++ + static void +-load_localed_input (GisKeyboardPage *self) ++add_default_keyboard_layout (GDBusProxy *proxy, ++ GVariantBuilder *builder) + { +- GisKeyboardPagePrivate *priv = gis_keyboard_page_get_instance_private (self); +- GVariant *v; +- const gchar *s; +- gchar *id; +- guint i, n; +- gchar **layouts = NULL; +- gchar **variants = NULL; +- GSList *sources = NULL; ++ GSList *sources = get_localed_input (proxy); ++ sources = g_slist_reverse (sources); + +- if (!priv->localed) +- return; ++ for (; sources; sources = sources->next) ++ g_variant_builder_add (builder, "(ss)", "xkb", ++ (const gchar *) sources->data); + +- v = g_dbus_proxy_get_cached_property (priv->localed, "X11Layout"); +- if (v) { +- s = g_variant_get_string (v, NULL); +- layouts = g_strsplit (s, ",", -1); +- g_variant_unref (v); +- } ++ g_slist_free_full (sources, g_free); ++} + +- v = g_dbus_proxy_get_cached_property (priv->localed, "X11Variant"); +- if (v) { +- s = g_variant_get_string (v, NULL); +- if (s && *s) +- variants = g_strsplit (s, ",", -1); +- g_variant_unref (v); +- } ++static void ++add_default_input_sources (GisKeyboardPage *self, ++ GDBusProxy *proxy) ++{ ++ const gchar *type; ++ const gchar *id; ++ const gchar * const *locales; ++ const gchar *language; ++ GVariantBuilder builder; ++ GSettings *input_settings; ++ ++ input_settings = g_settings_new (GNOME_DESKTOP_INPUT_SOURCES_DIR); ++ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(ss)")); ++ ++ add_default_keyboard_layout (proxy, &builder); ++ ++ /* add other input sources */ ++ locales = g_get_language_names (); ++ language = locales[0]; ++ 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_settings_delay (input_settings); ++ g_settings_set_value (input_settings, KEY_INPUT_SOURCES, g_variant_builder_end (&builder)); ++ g_settings_set_uint (input_settings, KEY_CURRENT_INPUT_SOURCE, 0); ++ g_settings_apply (input_settings); ++ ++ g_object_unref (input_settings); ++} + +- if (variants && variants[0]) +- n = MIN (g_strv_length (layouts), g_strv_length (variants)); +- else if (layouts && layouts[0]) +- n = g_strv_length (layouts); +- else +- n = 0; +- +- for (i = 0; i < n && layouts[i][0]; i++) { +- if (variants && variants[i] && variants[i][0]) +- id = g_strdup_printf ("%s+%s", layouts[i], variants[i]); +- else +- id = g_strdup (layouts[i]); +- sources = g_slist_prepend (sources, id); +- } ++static void ++skip_proxy_ready (GObject *source, ++ GAsyncResult *res, ++ gpointer data) ++{ ++ GisKeyboardPage *self = data; ++ GDBusProxy *proxy; ++ GError *error = NULL; ++ ++ proxy = g_dbus_proxy_new_finish (res, &error); ++ ++ if (!proxy) { ++ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ g_warning ("Failed to contact localed: %s", error->message); ++ g_error_free (error); ++ return; ++ } ++ ++ add_default_input_sources (self, proxy); ++ ++ g_object_unref (proxy); ++} + +- g_strfreev (variants); +- g_strfreev (layouts); ++static gboolean ++gis_keyboard_page_skip (GisPage *self) ++{ ++ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, ++ G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES, ++ NULL, ++ "org.freedesktop.locale1", ++ "/org/freedesktop/locale1", ++ "org.freedesktop.locale1", ++ NULL, ++ (GAsyncReadyCallback) skip_proxy_ready, ++ self); ++ return TRUE; ++} ++ ++static void ++load_localed_input (GisKeyboardPage *self) ++{ ++ GisKeyboardPagePrivate *priv = gis_keyboard_page_get_instance_private (self); ++ GSList * sources = get_localed_input (priv->localed); + + /* These will be added silently after the user selection when + * writing out the settings. */ +@@ -375,6 +470,7 @@ gis_keyboard_page_class_init (GisKeyboardPageClass * klass) + + page_class->page_id = PAGE_ID; + page_class->apply = gis_keyboard_page_apply; ++ page_class->skip = gis_keyboard_page_skip; + page_class->locale_changed = gis_keyboard_page_locale_changed; + object_class->constructed = gis_keyboard_page_constructed; + object_class->finalize = gis_keyboard_page_finalize; +@@ -389,11 +485,10 @@ gis_keyboard_page_init (GisKeyboardPage *self) + gtk_widget_init_template (GTK_WIDGET (self)); + } + +-void ++GisPage * + gis_prepare_keyboard_page (GisDriver *driver) + { +- gis_driver_add_page (driver, +- g_object_new (GIS_TYPE_KEYBOARD_PAGE, +- "driver", driver, +- NULL)); ++ return g_object_new (GIS_TYPE_KEYBOARD_PAGE, ++ "driver", driver, ++ NULL); + } +diff --git a/gnome-initial-setup/pages/keyboard/gis-keyboard-page.h b/gnome-initial-setup/pages/keyboard/gis-keyboard-page.h +index 832473f..d5710a0 100644 +--- a/gnome-initial-setup/pages/keyboard/gis-keyboard-page.h ++++ b/gnome-initial-setup/pages/keyboard/gis-keyboard-page.h +@@ -63,7 +63,7 @@ struct _GisKeyboardPageClass + + GType gis_keyboard_page_get_type (void) G_GNUC_CONST; + +-void gis_prepare_keyboard_page (GisDriver *driver); ++GisPage *gis_prepare_keyboard_page (GisDriver *driver); + + G_END_DECLS + +diff --git a/gnome-initial-setup/pages/language/gis-language-page.c b/gnome-initial-setup/pages/language/gis-language-page.c +index 6e246f9..c5f895c 100644 +--- a/gnome-initial-setup/pages/language/gis-language-page.c ++++ b/gnome-initial-setup/pages/language/gis-language-page.c +@@ -267,6 +267,8 @@ gis_language_page_constructed (GObject *object) + + update_distro_logo (page); + ++ gtk_widget_show (priv->language_chooser); ++ + g_signal_connect (priv->language_chooser, "notify::language", + G_CALLBACK (language_changed), page); + g_signal_connect (priv->language_chooser, "confirm", +@@ -288,7 +290,7 @@ gis_language_page_constructed (GObject *object) + (GAsyncReadyCallback) localed_proxy_ready, + object); + g_object_unref (bus); +- } ++ } + + gis_page_set_complete (GIS_PAGE (page), TRUE); + gtk_widget_show (GTK_WIDGET (page)); +@@ -300,6 +302,16 @@ gis_language_page_locale_changed (GisPage *page) + gis_page_set_title (GIS_PAGE (page), _("Welcome")); + } + ++static gboolean ++gis_language_page_skip (GisPage *page) ++{ ++ GisLanguagePagePrivate *priv = gis_language_page_get_instance_private (GIS_LANGUAGE_PAGE (page)); ++ ++ gtk_widget_hide (priv->language_chooser); ++ ++ return FALSE; ++} ++ + static void + gis_language_page_dispose (GObject *object) + { +@@ -327,6 +339,7 @@ gis_language_page_class_init (GisLanguagePageClass *klass) + + page_class->page_id = PAGE_ID; + page_class->locale_changed = gis_language_page_locale_changed; ++ page_class->skip = gis_language_page_skip; + object_class->constructed = gis_language_page_constructed; + object_class->dispose = gis_language_page_dispose; + } +@@ -341,11 +354,10 @@ gis_language_page_init (GisLanguagePage *page) + gtk_widget_init_template (GTK_WIDGET (page)); + } + +-void ++GisPage * + gis_prepare_language_page (GisDriver *driver) + { +- gis_driver_add_page (driver, +- g_object_new (GIS_TYPE_LANGUAGE_PAGE, +- "driver", driver, +- NULL)); ++ return g_object_new (GIS_TYPE_LANGUAGE_PAGE, ++ "driver", driver, ++ NULL); + } +diff --git a/gnome-initial-setup/pages/language/gis-language-page.h b/gnome-initial-setup/pages/language/gis-language-page.h +index 37b33ab..a5b78ff 100644 +--- a/gnome-initial-setup/pages/language/gis-language-page.h ++++ b/gnome-initial-setup/pages/language/gis-language-page.h +@@ -50,7 +50,8 @@ struct _GisLanguagePageClass + + GType gis_language_page_get_type (void); + +-void gis_prepare_language_page (GisDriver *driver); ++GisPage *gis_prepare_language_page (GisDriver *driver); ++GisPage *gis_prepare_language_page_without_language_selection (GisDriver *driver); + + G_END_DECLS + +diff --git a/gnome-initial-setup/pages/language/gis-language-page.ui b/gnome-initial-setup/pages/language/gis-language-page.ui +index 1b98a6d..d5e962a 100644 +--- a/gnome-initial-setup/pages/language/gis-language-page.ui ++++ b/gnome-initial-setup/pages/language/gis-language-page.ui +@@ -7,7 +7,7 @@ + True + vertical + center +- fill ++ center + +