[gnome-initial-setup] Revert "Fix unsafe usage of setlocale()"



commit 00f3326066ad433f394848c2bc2347efd12f10d4
Author: Will Thompson <wjt endlessm com>
Date:   Fri Mar 1 17:13:39 2019 +0000

    Revert "Fix unsafe usage of setlocale()"
    
    This reverts commit e20c2d303184a402f5db4fde3515eddac22bd3bf, which
    caused a regression in the keyboard layout selection page where the list
    of offered keyboard layouts is based on the previous selected language,
    not the current one. (For example, if you choose Russian, then French,
    the offered keyboard layouts are suitable for entering Russian text,
    though the layout names are in French.)
    
    See #53.

 gnome-initial-setup/gis-driver.c                   | 62 +++++++---------------
 gnome-initial-setup/gis-driver.h                   |  4 +-
 .../pages/language/gis-language-page.c             |  4 +-
 .../pages/language/gis-welcome-widget.c            | 13 ++---
 gnome-initial-setup/pages/region/gis-region-page.c |  3 +-
 5 files changed, 30 insertions(+), 56 deletions(-)
---
diff --git a/gnome-initial-setup/gis-driver.c b/gnome-initial-setup/gis-driver.c
index a65c1a5..18366b2 100644
--- a/gnome-initial-setup/gis-driver.c
+++ b/gnome-initial-setup/gis-driver.c
@@ -83,8 +83,6 @@ struct _GisDriverPrivate {
   GisDriverMode mode;
   UmAccountMode account_mode;
   gboolean small_screen;
-
-  locale_t locale;
 };
 typedef struct _GisDriverPrivate GisDriverPrivate;
 
@@ -115,12 +113,6 @@ gis_driver_finalize (GObject *object)
 
   g_clear_object (&priv->user_account);
 
-  if (priv->locale != (locale_t) 0)
-    {
-      uselocale (LC_GLOBAL_LOCALE);
-      freelocale (priv->locale);
-    }
-
   G_OBJECT_CLASS (gis_driver_parent_class)->finalize (object);
 }
 
@@ -181,41 +173,6 @@ gis_driver_get_user_language (GisDriver *driver)
   return priv->lang_id;
 }
 
-static void
-gis_driver_real_locale_changed (GisDriver *driver)
-{
-  GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
-  GtkTextDirection direction;
-
-  direction = gtk_get_locale_direction ();
-  gtk_widget_set_default_direction (direction);
-
-  rebuild_pages (driver);
-  gis_assistant_locale_changed (priv->assistant);
-}
-
-static void
-gis_driver_locale_changed (GisDriver *driver)
-{
-  g_signal_emit (G_OBJECT (driver), signals[LOCALE_CHANGED], 0);
-}
-
-void
-gis_driver_set_locale (GisDriver *driver, const gchar *lang_id)
-{
-  GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
-  locale_t locale;
-
-  locale = newlocale (LC_MESSAGES_MASK, lang_id, (locale_t) 0);
-  uselocale (locale);
-
-  if (priv->locale != (locale_t) 0 && priv->locale != LC_GLOBAL_LOCALE)
-    freelocale (priv->locale);
-  priv->locale = locale;
-
-  gis_driver_locale_changed (driver);
-}
-
 void
 gis_driver_set_username (GisDriver *driver, const gchar *username)
 {
@@ -298,6 +255,25 @@ gis_driver_hide_window (GisDriver *driver)
   gtk_widget_hide (GTK_WIDGET (priv->main_window));
 }
 
+static void
+gis_driver_real_locale_changed (GisDriver *driver)
+{
+  GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
+  GtkTextDirection direction;
+
+  direction = gtk_get_locale_direction ();
+  gtk_widget_set_default_direction (direction);
+
+  rebuild_pages (driver);
+  gis_assistant_locale_changed (priv->assistant);
+}
+
+void
+gis_driver_locale_changed (GisDriver *driver)
+{
+  g_signal_emit (G_OBJECT (driver), signals[LOCALE_CHANGED], 0);
+}
+
 GisDriverMode
 gis_driver_get_mode (GisDriver *driver)
 {
diff --git a/gnome-initial-setup/gis-driver.h b/gnome-initial-setup/gis-driver.h
index e4fa612..d3a52ec 100644
--- a/gnome-initial-setup/gis-driver.h
+++ b/gnome-initial-setup/gis-driver.h
@@ -66,6 +66,7 @@ typedef enum {
 GType gis_driver_get_type (void);
 
 GisAssistant *gis_driver_get_assistant (GisDriver *driver);
+void gis_driver_locale_changed (GisDriver *driver);
 
 void gis_driver_set_user_permissions (GisDriver   *driver,
                                       ActUser     *user,
@@ -85,9 +86,6 @@ void gis_driver_set_user_language (GisDriver   *driver,
 
 const gchar *gis_driver_get_user_language (GisDriver   *driver);
 
-void gis_driver_set_locale (GisDriver   *driver,
-                            const gchar *lang_id);
-
 void gis_driver_set_username (GisDriver   *driver,
                               const gchar *username);
 const gchar *gis_driver_get_username (GisDriver *driver);
diff --git a/gnome-initial-setup/pages/language/gis-language-page.c 
b/gnome-initial-setup/pages/language/gis-language-page.c
index 0eed8a9..a4afe44 100644
--- a/gnome-initial-setup/pages/language/gis-language-page.c
+++ b/gnome-initial-setup/pages/language/gis-language-page.c
@@ -123,7 +123,7 @@ language_changed (CcLanguageChooser  *chooser,
   priv->new_locale_id = cc_language_chooser_get_language (chooser);
   driver = GIS_PAGE (page)->driver;
 
-  gis_driver_set_locale (driver, priv->new_locale_id);
+  setlocale (LC_MESSAGES, priv->new_locale_id);
   gtk_widget_set_default_direction (gtk_get_locale_direction ());
 
   if (gis_driver_get_mode (driver) == GIS_DRIVER_MODE_NEW_USER) {
@@ -157,6 +157,8 @@ language_changed (CcLanguageChooser  *chooser,
 
   gis_welcome_widget_show_locale (GIS_WELCOME_WIDGET (priv->welcome_widget),
                                   priv->new_locale_id);
+
+  gis_driver_locale_changed (driver);
 }
 
 static void
diff --git a/gnome-initial-setup/pages/language/gis-welcome-widget.c 
b/gnome-initial-setup/pages/language/gis-welcome-widget.c
index 37b000f..87b28d4 100644
--- a/gnome-initial-setup/pages/language/gis-welcome-widget.c
+++ b/gnome-initial-setup/pages/language/gis-welcome-widget.c
@@ -111,21 +111,18 @@ gis_welcome_widget_unmap (GtkWidget *widget)
 static char *
 welcome (const char *locale_id)
 {
-  locale_t locale;
-  locale_t old_locale;
+  char *current_locale_id;
   char *welcome;
 
-  locale = newlocale (LC_MESSAGES_MASK, locale_id, (locale_t) 0);
-  old_locale = uselocale (locale);
-
+  current_locale_id = g_strdup (setlocale (LC_MESSAGES, NULL));
+  setlocale (LC_MESSAGES, locale_id);
   /* Translators: This is meant to be a warm, engaging welcome message,
    * like greeting somebody at the door. If the exclamation mark is not
    * suitable for this in your language you may replace it.
    */
   welcome = _("Welcome!");
-
-  uselocale (old_locale);
-  freelocale (locale);
+  setlocale (LC_MESSAGES, current_locale_id);
+  g_free (current_locale_id);
 
   return welcome;
 }
diff --git a/gnome-initial-setup/pages/region/gis-region-page.c 
b/gnome-initial-setup/pages/region/gis-region-page.c
index 898a352..5a31b9c 100644
--- a/gnome-initial-setup/pages/region/gis-region-page.c
+++ b/gnome-initial-setup/pages/region/gis-region-page.c
@@ -120,7 +120,8 @@ region_changed (CcRegionChooser  *chooser,
   priv->new_locale_id = cc_region_chooser_get_locale (chooser);
   driver = GIS_PAGE (page)->driver;
 
-  gis_driver_set_locale (driver, priv->new_locale_id);
+  setlocale (LC_MESSAGES, priv->new_locale_id);
+  gis_driver_locale_changed (driver);
 
   if (gis_driver_get_mode (driver) == GIS_DRIVER_MODE_NEW_USER) {
       if (g_permission_get_allowed (priv->permission)) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]