]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Add ability to set the language of a user from the greeter
authorRobert Ancell <robert.ancell@canonical.com>
Tue, 20 Sep 2011 00:25:04 +0000 (10:25 +1000)
committerRobert Ancell <robert.ancell@canonical.com>
Tue, 20 Sep 2011 00:25:04 +0000 (10:25 +1000)
NEWS
liblightdm-gobject/greeter.c
liblightdm-gobject/lightdm/greeter.h
liblightdm-qt/QLightDM/Greeter
liblightdm-qt/greeter.cpp
src/greeter.c

diff --git a/NEWS b/NEWS
index b1938f36430bc070d7288883e834e9755734494f..4e3f1f231935a474e0b559fe7821e2c99fbe6de7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,7 @@ Overview of changes in lightdm 0.9.8
     * Fix up script hooks, add regression tests for them
     * Complete removal of X code from the core of LightDM, so it can better
       support various display types
+    * Add ability to set the language of a user from the greeter
 
 Overview of changes in lightdm 0.9.7
 
index 0b2b630200dfcbb71043c79505443e84ff189a66..d0819c8c36d937f0ae348877fd2ba92adfba8c87 100644 (file)
@@ -74,7 +74,8 @@ typedef enum
     GREETER_MESSAGE_AUTHENTICATE_AS_GUEST,
     GREETER_MESSAGE_CONTINUE_AUTHENTICATION,
     GREETER_MESSAGE_START_SESSION,
-    GREETER_MESSAGE_CANCEL_AUTHENTICATION
+    GREETER_MESSAGE_CANCEL_AUTHENTICATION,
+    GREETER_MESSAGE_SET_LANGUAGE
 } GreeterMessage;
 
 /* Messages from the server to the greeter */
@@ -855,6 +856,31 @@ lightdm_greeter_get_authentication_user (LightDMGreeter *greeter)
     return GET_PRIVATE (greeter)->authentication_user;
 }
 
+/**
+ * lightdm_greeter_set_language:
+ * @greeter: A #LightDMGreeter
+ * @language: The language to use for this user.
+ *
+ * Set the language for the currently authenticated user.
+ **/
+void
+lightdm_greeter_set_language (LightDMGreeter *greeter, const gchar *language)
+{
+    LightDMGreeterPrivate *priv;
+    guint8 message[MAX_MESSAGE_LENGTH];
+    gsize offset = 0;
+
+    g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
+
+    priv = GET_PRIVATE (greeter);
+
+    g_return_if_fail (priv->connected);
+
+    write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SET_LANGUAGE, 0, &offset);
+    write_string (message, MAX_MESSAGE_LENGTH, language, &offset);
+    write_message (greeter, message, offset);
+}
+
 /**
  * lightdm_greeter_start_session_sync:
  * @greeter: A #LightDMGreeter
index 52b43311dc0bf22724cfbf0c5a6668f223bf11f5..c1b281d5281f4765c4d005a8685269ed860f2154 100644 (file)
@@ -108,6 +108,8 @@ gboolean lightdm_greeter_get_is_authenticated (LightDMGreeter *greeter);
 
 const gchar *lightdm_greeter_get_authentication_user (LightDMGreeter *greeter);
 
+void lightdm_greeter_set_language (LightDMGreeter *greeter, const gchar *language);
+
 gboolean lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *session, GError **error);
 
 G_END_DECLS
index 2f41f8687f2556427231e730c719b01100cccdb8..5e892fd80eec6bee97b1cd4396ec04b49f16b2cc 100644 (file)
@@ -64,6 +64,7 @@ namespace QLightDM
         void authenticateAsGuest();
         void respond(const QString &response);
         void cancelAuthentication();
+        void setLanguage (QString language);
         bool startSessionSync(const QString &session=QString());
 
     signals:
index 9083495e22df0f530777ced995557c4679448b24..e59257638244d20a9704ec363719a66a902912a8 100644 (file)
@@ -35,7 +35,8 @@ typedef enum
     GREETER_MESSAGE_AUTHENTICATE_AS_GUEST,
     GREETER_MESSAGE_CONTINUE_AUTHENTICATION,
     GREETER_MESSAGE_START_SESSION,
-    GREETER_MESSAGE_CANCEL_AUTHENTICATION
+    GREETER_MESSAGE_CANCEL_AUTHENTICATION,
+    GREETER_MESSAGE_SET_LANGUAGE
 } GreeterMessage;
 
 /* Messages from the server to the greeter */
@@ -284,6 +285,13 @@ QString Greeter::authenticationUser() const
     return d->authenticationUser;
 }
 
+void Greeter::setLanguage (QString language)
+{
+    writeHeader(GREETER_MESSAGE_SET_LANGUAGE, 0);
+    writeString (language);
+    flush();
+}
+
 bool Greeter::startSessionSync(const QString &session)
 {
     if (session == "")
index 392555c16d5fa87e89103ce7b2e869d5bcdf52b8..a1e2871222074dcf4608149fb59ca9f31dccdc95 100644 (file)
@@ -68,7 +68,8 @@ typedef enum
     GREETER_MESSAGE_AUTHENTICATE_AS_GUEST,
     GREETER_MESSAGE_CONTINUE_AUTHENTICATION,
     GREETER_MESSAGE_START_SESSION,
-    GREETER_MESSAGE_CANCEL_AUTHENTICATION
+    GREETER_MESSAGE_CANCEL_AUTHENTICATION,
+    GREETER_MESSAGE_SET_LANGUAGE
 } GreeterMessage;
 
 /* Messages from the server to the greeter */
@@ -408,6 +409,28 @@ handle_start_session (Greeter *greeter, const gchar *session)
     }
 }
 
+static void
+handle_set_language (Greeter *greeter, const gchar *language)
+{
+    User *user;
+
+    if (!greeter->priv->guest_account_authenticated && !pam_session_get_is_authenticated (greeter->priv->authentication))
+    {
+        g_debug ("Ignoring set language request, user is not authorized");
+        return;
+    }
+
+    // FIXME: Could use this
+    if (greeter->priv->guest_account_authenticated)
+    {
+        g_debug ("Ignoring set language request for guest user");
+        return;
+    }
+
+    user = pam_session_get_user (greeter->priv->authentication);
+    user_set_language (user, language);
+}
+
 static guint32
 read_int (Greeter *greeter, gsize *offset)
 {
@@ -453,7 +476,7 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data)
     GIOStatus status;
     int id, n_secrets, i;
     guint32 sequence_number;
-    gchar *version, *username, *session_name;
+    gchar *version, *username, *session_name, *language;
     gchar **secrets;
     GError *error = NULL;
 
@@ -539,6 +562,11 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data)
         handle_start_session (greeter, session_name);
         g_free (session_name);
         break;
+    case GREETER_MESSAGE_SET_LANGUAGE:
+        language = read_string (greeter, &offset);
+        handle_set_language (greeter, language);
+        g_free (language);
+        break;
     default:
         g_warning ("Unknown message from greeter: %d", id);
         break;