File lightdm-fix-language-setting.patch of Package lightdm

# HG changeset patch
# Parent 914564e535f0a132b097bc5a066908c04892180d
Fix saving/retrieving of the language setting

Add user_get_language() for retrieving the language setting.
Remove unused user_get_locale().
Always save the language to both accountsservice and dmrc.
Actually retrieve the language setting and export the locale via LANG and
GDM_LANG environment variables.

diff --git a/src/accounts.c b/src/accounts.c
--- a/src/accounts.c
+++ b/src/accounts.c
@@ -44,9 +44,6 @@ struct UserPrivate
     /* Language */
     gchar *language;
 
-    /* Locale */
-    gchar *locale;
-
     /* X session */
     gchar *xsession;
 };
@@ -332,36 +329,59 @@ user_get_shell (User *user)
     return user->priv->shell;
 }
 
-const gchar *
-user_get_locale (User *user)
-{
-    g_return_val_if_fail (user != NULL, NULL);
-
-    g_free (user->priv->locale);
-    if (user->priv->proxy)
-        user->priv->locale = NULL;
-    else
-        user->priv->locale = get_string_from_dmrc (user->priv->name, "Desktop", "Language");
-
-    /* Treat a blank locale as unset */
-    if (g_strcmp0 (user->priv->locale, "") == 0)
-    {
-        g_free (user->priv->locale);
-        user->priv->locale = NULL;
-    }
-
-    return user->priv->locale;
-}
-
 void
 user_set_language (User *user, const gchar *language)
 {
     g_return_if_fail (user != NULL);
 
+    call_method (user->priv->proxy, "SetLanguage", g_variant_new ("(s)", language), "()", NULL);
+    save_string_to_dmrc (user->priv->name, "Desktop", "Language", language);
+}
+
+const gchar *
+user_get_language (User *user)
+{
+    GVariant *variant, *inner;
+    gboolean success;
+
+    g_return_val_if_fail (user != NULL, NULL);
+
+    g_free (user->priv->language);
     if (user->priv->proxy)
-        call_method (user->priv->proxy, "SetLanguage", g_variant_new ("(s)", language), "()", NULL);
+    {
+        /* get_property () uses g_dbus_proxy_get_cached_property () which would
+         * return the previous (cached) value of the "Language" property */
+#if 0
+        if (get_property (user->priv->proxy, "Language", "s", &variant))
+        {
+            g_variant_get (variant, "s", &user->priv->language);
+            g_variant_unref (variant);
+        }
+        else
+            user->priv->language = NULL;
+#endif
+        success = call_method (user->priv->proxy, "org.freedesktop.DBus.Properties.Get", g_variant_new ("(ss)", g_dbus_proxy_get_interface_name(user->priv->proxy), "Language"), "(v)", &variant);
+        if (success)
+        {
+            g_variant_get (variant, "(v)", &inner);
+            user->priv->language = g_variant_dup_string (inner, NULL);
+            g_variant_unref (inner);
+            g_variant_unref (variant);
+        }
+        else
+            user->priv->language = NULL;
+    }
     else
-        save_string_to_dmrc (user->priv->name, "Desktop", "Language", language);
+        user->priv->language = get_string_from_dmrc (user->priv->name, "Desktop", "Language");
+
+    /* Treat a blank language as unset */
+    if (g_strcmp0 (user->priv->language, "") == 0)
+    {
+        g_free (user->priv->language);
+        user->priv->language = NULL;
+    }
+
+    return user->priv->language;
 }
 
 void
@@ -436,6 +456,7 @@ user_finalize (GObject *object)
     g_free (self->priv->gecos);
     g_free (self->priv->home_directory);
     g_free (self->priv->shell);
+    g_free (self->priv->language);
 
     G_OBJECT_CLASS (user_parent_class)->finalize (object);  
 }
diff --git a/src/accounts.h b/src/accounts.h
--- a/src/accounts.h
+++ b/src/accounts.h
@@ -58,7 +58,7 @@ const gchar *user_get_xsession (User *us
 
 void user_set_xsession (User *user, const gchar *session);
 
-const gchar *user_get_locale (User *user);
+const gchar *user_get_language (User *user);
 
 void user_set_language (User *user, const gchar *language);
 
diff --git a/src/display.c b/src/display.c
--- a/src/display.c
+++ b/src/display.c
@@ -704,6 +704,7 @@ display_start_session (Display *display)
 {
     User *user;
     gchar *filename, *sessions_dir, *path;
+    const gchar *language;
     gchar **argv;
 
     user = session_get_user (display->priv->session);
@@ -727,6 +728,14 @@ display_start_session (Display *display)
     if (!argv)
         return TRUE;
   
+    /* Retrieve language setting */
+    language = user_get_language (user);
+    if (language != NULL && language != '\0')
+    {
+        session_set_env (display->priv->session, "LANG", language);
+        session_set_env (display->priv->session, "GDM_LANG", language);
+    }
+
     session_set_env (display->priv->session, "DESKTOP_SESSION", display->priv->user_session); // FIXME: Apparently deprecated?
     session_set_env (display->priv->session, "GDMSESSION", display->priv->user_session); // FIXME: Not cross-desktop
 
openSUSE Build Service is sponsored by