gnome-initial-setup/0003-language-Don-t-proceed-until-localed-has-set-locale.patch
2023-09-09 18:44:37 -04:00

296 lines
9.4 KiB
Diff

From 3f4db2669b673eec3bd90bb00eac8dc3be3b9563 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Fri, 8 Sep 2023 11:02:39 -0400
Subject: [PATCH 03/12] language: Don't proceed until localed has set locale
In sysmte modes, the keyboard page requires reading the locale from
localed, so we need to make sure the setting has been applied before
proceeding to the keyboard page from the language page.
This commit changes the Next button to desensitize if a set locale
operation is pending.
---
.../pages/language/gis-language-page.c | 31 +++++++++++++++++--
1 file changed, 28 insertions(+), 3 deletions(-)
diff --git a/gnome-initial-setup/pages/language/gis-language-page.c b/gnome-initial-setup/pages/language/gis-language-page.c
index 87b9f2d8..26a01257 100644
--- a/gnome-initial-setup/pages/language/gis-language-page.c
+++ b/gnome-initial-setup/pages/language/gis-language-page.c
@@ -29,181 +29,204 @@
#define GNOME_SYSTEM_LOCALE_DIR "org.gnome.system.locale"
#define REGION_KEY "region"
#include "config.h"
#include "language-resources.h"
#include "gis-welcome-widget.h"
#include "cc-language-chooser.h"
#include "gis-language-page.h"
#include <act/act-user-manager.h>
#include <polkit/polkit.h>
#include <locale.h>
#include <gtk/gtk.h>
struct _GisLanguagePagePrivate
{
GtkWidget *logo;
GtkWidget *welcome_widget;
GtkWidget *language_chooser;
GDBusProxy *localed;
GPermission *permission;
const gchar *new_locale_id;
GCancellable *cancellable;
};
typedef struct _GisLanguagePagePrivate GisLanguagePagePrivate;
G_DEFINE_TYPE_WITH_PRIVATE (GisLanguagePage, gis_language_page, GIS_TYPE_PAGE);
+static void
+on_locale_set (GDBusProxy *proxy,
+ GAsyncResult *result,
+ GisLanguagePage *self)
+{
+ g_autoptr(GError) error = NULL;
+ g_autoptr(GVariant) call_result = NULL;
+
+ call_result = g_dbus_proxy_call_finish (proxy, result, &error);
+
+ if (error != NULL) {
+ g_warning ("Could not set system locale: %s", error->message);
+ }
+
+ gis_page_set_complete (GIS_PAGE (self), TRUE);
+}
+
static void
set_localed_locale (GisLanguagePage *self)
{
GisLanguagePagePrivate *priv = gis_language_page_get_instance_private (self);
GVariantBuilder *b;
gchar *s;
b = g_variant_builder_new (G_VARIANT_TYPE ("as"));
s = g_strconcat ("LANG=", priv->new_locale_id, NULL);
g_variant_builder_add (b, "s", s);
g_free (s);
g_dbus_proxy_call (priv->localed,
"SetLocale",
g_variant_new ("(asb)", b, TRUE),
G_DBUS_CALL_FLAGS_NONE,
- -1, NULL, NULL, NULL);
+ -1, priv->cancellable,
+ (GAsyncReadyCallback) on_locale_set,
+ self);
g_variant_builder_unref (b);
}
static void
change_locale_permission_acquired (GObject *source,
GAsyncResult *res,
gpointer data)
{
GisLanguagePage *page = GIS_LANGUAGE_PAGE (data);
GisLanguagePagePrivate *priv = gis_language_page_get_instance_private (page);
GError *error = NULL;
gboolean allowed;
allowed = g_permission_acquire_finish (priv->permission, res, &error);
if (error) {
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
g_warning ("Failed to acquire permission: %s", error->message);
g_error_free (error);
return;
}
if (allowed)
set_localed_locale (page);
}
static void
user_loaded (GObject *object,
GParamSpec *pspec,
gpointer user_data)
{
gchar *new_locale_id = user_data;
act_user_set_language (ACT_USER (object), new_locale_id);
g_free (new_locale_id);
}
static void
language_changed (CcLanguageChooser *chooser,
GParamSpec *pspec,
GisLanguagePage *page)
{
GisLanguagePagePrivate *priv = gis_language_page_get_instance_private (page);
GisDriver *driver;
GSettings *region_settings;
ActUser *user;
priv->new_locale_id = cc_language_chooser_get_language (chooser);
driver = GIS_PAGE (page)->driver;
gis_driver_set_user_language (driver, priv->new_locale_id, TRUE);
gtk_widget_set_default_direction (gtk_get_locale_direction ());
if (gis_driver_get_mode (driver) == GIS_DRIVER_MODE_NEW_USER) {
+
+ gis_page_set_complete (GIS_PAGE (page), FALSE);
+
if (g_permission_get_allowed (priv->permission)) {
set_localed_locale (page);
}
else if (g_permission_get_can_acquire (priv->permission)) {
g_permission_acquire_async (priv->permission,
NULL,
change_locale_permission_acquired,
page);
}
}
/* Ensure we won't override the selected language for format strings */
region_settings = g_settings_new (GNOME_SYSTEM_LOCALE_DIR);
g_settings_reset (region_settings, REGION_KEY);
g_object_unref (region_settings);
user = act_user_manager_get_user (act_user_manager_get_default (),
g_get_user_name ());
if (act_user_is_loaded (user))
act_user_set_language (user, priv->new_locale_id);
else
g_signal_connect (user,
"notify::is-loaded",
G_CALLBACK (user_loaded),
g_strdup (priv->new_locale_id));
gis_welcome_widget_show_locale (GIS_WELCOME_WIDGET (priv->welcome_widget),
priv->new_locale_id);
}
static void
localed_proxy_ready (GObject *source,
GAsyncResult *res,
gpointer data)
{
GisLanguagePage *self = data;
GisLanguagePagePrivate *priv = gis_language_page_get_instance_private (self);
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;
}
priv->localed = proxy;
+ gis_page_set_complete (GIS_PAGE (self), TRUE);
}
static void
update_distro_logo (GisLanguagePage *page)
{
GisLanguagePagePrivate *priv = gis_language_page_get_instance_private (page);
g_autofree char *id = g_get_os_info (G_OS_INFO_KEY_ID);
gsize i;
static const struct {
const char *id;
const char *logo;
} id_to_logo[] = {
{ "debian", "emblem-debian" },
{ "fedora", "fedora-logo-icon" },
{ "ubuntu", "ubuntu-logo-icon" },
{ "openSUSE Tumbleweed", "opensuse-logo-icon" },
{ "openSUSE Leap", "opensuse-logo-icon" },
{ "SLED", "suse-logo-icon" },
{ "SLES", "suse-logo-icon" },
};
for (i = 0; i < G_N_ELEMENTS (id_to_logo); i++)
{
if (g_strcmp0 (id, id_to_logo[i].id) == 0)
{
g_object_set (priv->logo, "icon-name", id_to_logo[i].logo, NULL);
break;
}
}
@@ -224,62 +247,64 @@ gis_language_page_constructed (GObject *object)
GDBusConnection *bus;
g_type_ensure (CC_TYPE_LANGUAGE_CHOOSER);
G_OBJECT_CLASS (gis_language_page_parent_class)->constructed (object);
update_distro_logo (page);
g_signal_connect (priv->language_chooser, "notify::language",
G_CALLBACK (language_changed), page);
g_signal_connect (priv->language_chooser, "confirm",
G_CALLBACK (language_confirmed), page);
/* If we're in new user mode then we're manipulating system settings */
if (gis_driver_get_mode (GIS_PAGE (page)->driver) == GIS_DRIVER_MODE_NEW_USER)
{
priv->permission = polkit_permission_new_sync ("org.freedesktop.locale1.set-locale", NULL, NULL, NULL);
bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL);
g_dbus_proxy_new (bus,
G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES,
NULL,
"org.freedesktop.locale1",
"/org/freedesktop/locale1",
"org.freedesktop.locale1",
priv->cancellable,
(GAsyncReadyCallback) localed_proxy_ready,
object);
g_object_unref (bus);
}
-
- gis_page_set_complete (GIS_PAGE (page), TRUE);
+ else
+ {
+ gis_page_set_complete (GIS_PAGE (page), TRUE);
+ }
gtk_widget_set_visible (GTK_WIDGET (page), TRUE);
}
static void
gis_language_page_locale_changed (GisPage *page)
{
gis_page_set_title (GIS_PAGE (page), _("Welcome"));
}
static void
gis_language_page_dispose (GObject *object)
{
GisLanguagePage *page = GIS_LANGUAGE_PAGE (object);
GisLanguagePagePrivate *priv = gis_language_page_get_instance_private (page);
g_clear_object (&priv->permission);
g_clear_object (&priv->localed);
g_clear_object (&priv->cancellable);
G_OBJECT_CLASS (gis_language_page_parent_class)->dispose (object);
}
static void
gis_language_page_class_init (GisLanguagePageClass *klass)
{
GisPageClass *page_class = GIS_PAGE_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (klass), "/org/gnome/initial-setup/gis-language-page.ui");
--
2.41.0