]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Fix the two bugs which prevent the language selection from working. Fixes: https...
authorGuido Berhoerster <gber@opensuse.org>
Wed, 24 Apr 2013 01:51:02 +0000 (01:51 +0000)
committerTarmac <Unknown>
Wed, 24 Apr 2013 01:51:02 +0000 (01:51 +0000)
Approved by PS Jenkins bot, Robert Ancell.

liblightdm-gobject/user.c
src/accounts.c
src/accounts.h
src/display.c

index f473e9af14d0db5e6549ce94ddcc9be945b9767c..d48cee5bd628224f976b6f8eea10af26077abe76 100644 (file)
@@ -1132,16 +1132,10 @@ load_dmrc (LightDMUser *user)
 
     // FIXME: Watch for changes
 
-    /* The Language field is actually a locale, strip the codeset off it to get the language */
+    /* The Language field contains the locale */
     if (priv->language)
         g_free (priv->language);
     priv->language = g_key_file_get_string (priv->dmrc_file, "Desktop", "Language", NULL);
-    if (priv->language)
-    {
-        gchar *codeset = strchr (priv->language, '.');
-        if (codeset)
-            *codeset = '\0';
-    }
 
     if (priv->layouts)
     {
index e974c543f187913919e54bd1de71161779f131ab..0fba56407f3789ab28d33c9815e221c7f0a4a613 100644 (file)
@@ -44,9 +44,6 @@ struct UserPrivate
     /* Language */
     gchar *language;
 
-    /* Locale */
-    gchar *locale;
-
     /* X session */
     gchar *xsession;
 };
@@ -332,36 +329,52 @@ user_get_shell (User *user)
     return user->priv->shell;
 }
 
+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_locale (User *user)
+user_get_language (User *user)
 {
+    GVariant *variant, *inner;
+    gboolean success;
+
     g_return_val_if_fail (user != NULL, NULL);
 
-    g_free (user->priv->locale);
+    g_free (user->priv->language);
     if (user->priv->proxy)
-        user->priv->locale = NULL;
+    {
+        /* the "Language" property cannot be retrieved with get_property () here since it
+         * uses g_dbus_proxy_get_cached_property () which would return the previous (cached) value
+         * of the "Language" property
+         */
+        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
-        user->priv->locale = get_string_from_dmrc (user->priv->name, "Desktop", "Language");
+        user->priv->language = get_string_from_dmrc (user->priv->name, "Desktop", "Language");
 
-    /* Treat a blank locale as unset */
-    if (g_strcmp0 (user->priv->locale, "") == 0)
+    /* Treat a blank language as unset */
+    if (g_strcmp0 (user->priv->language, "") == 0)
     {
-        g_free (user->priv->locale);
-        user->priv->locale = NULL;
+        g_free (user->priv->language);
+        user->priv->language = NULL;
     }
 
-    return user->priv->locale;
-}
-
-void
-user_set_language (User *user, const gchar *language)
-{
-    g_return_if_fail (user != NULL);
-
-    if (user->priv->proxy)
-        call_method (user->priv->proxy, "SetLanguage", g_variant_new ("(s)", language), "()", NULL);
-    else
-        save_string_to_dmrc (user->priv->name, "Desktop", "Language", language);
+    return user->priv->language;
 }
 
 void
@@ -436,6 +449,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);  
 }
index d282cbf23e931c061d2594ba9e857c97b312d204..1f9eb078fb9775f8f0369076d3c081fda231566c 100644 (file)
@@ -58,7 +58,7 @@ const gchar *user_get_xsession (User *user);
 
 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);
 
index 92c25dbaa9a1532e0af75ab8ad310d2a9e13f2e2..c935571ffd1fcddc68a3fa55cff15b4ffed2ec8b 100644 (file)
@@ -702,6 +702,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);
@@ -725,6 +726,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