]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Change language/layout/session when user selected in GTK+ greeter
authorunknown <robert.ancell@canonical.com>
Mon, 1 Nov 2010 03:30:41 +0000 (14:30 +1100)
committerunknown <robert.ancell@canonical.com>
Mon, 1 Nov 2010 03:30:41 +0000 (14:30 +1100)
15 files changed:
NEWS
doc/ldmgreeter-sections.txt
doc/tmpl/greeter.sgml
doc/tmpl/user.sgml
greeters/ldm-gtk-greeter.c
greeters/ldm-webkit-greeter.c
libldmgreeter/greeter.c
libldmgreeter/greeter.h
libldmgreeter/user.c
libldmgreeter/user.h
src/display-manager.c
src/display.c
src/user-manager.c
src/user-manager.h
src/user-manager.xml

diff --git a/NEWS b/NEWS
index be6fc43e72e2224a1a73de2ff926e7fe1afb174b..67b3ce9db75f7e44b828bac051ab537762cbc7bd 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ Overview of changes in lightdm 0.1.3
       (set X-LightDM-Supports-Transitions=true in their xsession file)
     * Load user settings from ~/.dmrc
     * Add configuration for default language/layout
+    * Change language/layout/session when user selected in GTK+ greeter
 
 Overview of changes in lightdm 0.1.2
 
index 898dcbcbf2f13be772ae0e1e6084c4937a34210a..20261d073c8e2df4b69b2ec8fbf04e0adec4a245 100644 (file)
@@ -50,6 +50,9 @@ ldm_user_get_name
 ldm_user_get_real_name
 ldm_user_get_display_name
 ldm_user_get_image
+ldm_user_get_language
+ldm_user_get_layout
+ldm_user_get_session
 ldm_user_get_logged_in
 <SUBSECTION Standard>
 LDM_USER
@@ -124,6 +127,7 @@ ldm_greeter_get_can_restart
 ldm_greeter_restart
 ldm_greeter_get_can_shutdown
 ldm_greeter_shutdown
+ldm_greeter_get_user_defaults
 <SUBSECTION Standard>
 LDM_GREETER
 LDM_IS_GREETER
index 603a62df25a0ee7115fc414bb045e5081b2906e6..575537c39f8033cfa7202c7c66f16dbf378c0952 100644 (file)
@@ -491,3 +491,16 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
 @greeter: 
 
 
+<!-- ##### FUNCTION ldm_greeter_get_user_defaults ##### -->
+<para>
+
+</para>
+
+@greeter: 
+@username: 
+@language: 
+@layout: 
+@session: 
+@Returns: 
+
+
index 732fa76c9eadef820f9c07978abdcc2f72795d98..f685a4c849864c9ce4f582ca5c369da9ca2c2bba 100644 (file)
@@ -47,11 +47,26 @@ A user has the following properties:
 
 </para>
 
+<!-- ##### ARG LdmUser:greeter ##### -->
+<para>
+
+</para>
+
 <!-- ##### ARG LdmUser:image ##### -->
 <para>
 
 </para>
 
+<!-- ##### ARG LdmUser:language ##### -->
+<para>
+
+</para>
+
+<!-- ##### ARG LdmUser:layout ##### -->
+<para>
+
+</para>
+
 <!-- ##### ARG LdmUser:logged-in ##### -->
 <para>
 
@@ -67,6 +82,11 @@ A user has the following properties:
 
 </para>
 
+<!-- ##### ARG LdmUser:session ##### -->
+<para>
+
+</para>
+
 <!-- ##### FUNCTION ldm_user_get_name ##### -->
 <para>
 
@@ -103,6 +123,33 @@ A user has the following properties:
 @Returns: 
 
 
+<!-- ##### FUNCTION ldm_user_get_language ##### -->
+<para>
+
+</para>
+
+@user: 
+@Returns: 
+
+
+<!-- ##### FUNCTION ldm_user_get_layout ##### -->
+<para>
+
+</para>
+
+@user: 
+@Returns: 
+
+
+<!-- ##### FUNCTION ldm_user_get_session ##### -->
+<para>
+
+</para>
+
+@user: 
+@Returns: 
+
+
 <!-- ##### FUNCTION ldm_user_get_logged_in ##### -->
 <para>
 
index 6c538ba8789387ea480c02ac4c2d53bf7d5bbaa3..41e9ed6d80012f4b9e0b00faf26530f93a0c075e 100644 (file)
@@ -23,12 +23,108 @@ static GtkTreeModel *user_model;
 static GtkWidget *window, *vbox, *login_vbox, *message_label, *user_view;
 static GdkPixmap *background_pixmap;
 static GtkWidget *username_entry, *password_entry;
-static gchar *session = NULL, *language = NULL, *theme_name;
+static gchar *theme_name;
+static GSList *session_radio_list = NULL, *language_radio_list = NULL, *layout_radio_list = NULL;
+
+static gchar *
+get_language ()
+{
+    GSList *iter;
+
+    for (iter = language_radio_list; iter; iter = iter->next)
+    {
+        GtkCheckMenuItem *item = iter->data;
+        if (gtk_check_menu_item_get_active (item))
+            return g_object_get_data (G_OBJECT (item), "language");
+    }
+
+    return NULL;
+}
+
+static void
+set_language (const gchar *language)
+{
+    GSList *iter;
+
+    for (iter = language_radio_list; iter; iter = iter->next)
+    {
+        GtkCheckMenuItem *item = iter->data;
+        if (strcmp (language, g_object_get_data (G_OBJECT (item), "language")) == 0)
+            gtk_check_menu_item_set_active (item, TRUE);
+    }
+}
+
+static gchar *
+get_layout ()
+{
+    GSList *iter;
+
+    for (iter = layout_radio_list; iter; iter = iter->next)
+    {
+        GtkCheckMenuItem *item = iter->data;
+        if (gtk_check_menu_item_get_active (item))
+            return g_object_get_data (G_OBJECT (item), "layout");
+    }
+
+    return NULL;
+}
+
+static void
+set_layout (const gchar *layout)
+{
+    GSList *iter;
+
+    for (iter = layout_radio_list; iter; iter = iter->next)
+    {
+        GtkCheckMenuItem *item = iter->data;
+        if (strcmp (layout, g_object_get_data (G_OBJECT (item), "layout")) == 0)
+            gtk_check_menu_item_set_active (item, TRUE);
+    }
+}
+
+static gchar *
+get_session ()
+{
+    GSList *iter;
+
+    for (iter = session_radio_list; iter; iter = iter->next)
+    {
+        GtkCheckMenuItem *item = iter->data;
+        if (gtk_check_menu_item_get_active (item))
+            return g_object_get_data (G_OBJECT (item), "key");
+    }
+
+    return NULL;
+}
+
+static void
+set_session (const gchar *session)
+{
+    GSList *iter;
+
+    for (iter = session_radio_list; iter; iter = iter->next)
+    {
+        GtkCheckMenuItem *item = iter->data;
+        if (strcmp (session, g_object_get_data (G_OBJECT (item), "key")) == 0)
+            gtk_check_menu_item_set_active (item, TRUE);
+    }
+}
 
 static void
 start_authentication (const gchar *username)
 {
     GtkTreeIter iter;
+    gchar *language, *layout, *session;
+  
+    if (ldm_greeter_get_user_defaults (greeter, username, &language, &layout, &session))
+    {
+        set_language (language);
+        set_session (session);
+        set_layout (layout);
+        g_free (language);
+        g_free (layout);
+        g_free (session);
+    }
 
     if (user_model && gtk_tree_model_get_iter_first (GTK_TREE_MODEL (user_model), &iter))
     {
@@ -140,7 +236,7 @@ authentication_complete_cb (LdmGreeter *greeter)
   
     if (ldm_greeter_get_is_authenticated (greeter))
     {
-        ldm_greeter_login (greeter, ldm_greeter_get_authentication_user (greeter), session, language);
+        ldm_greeter_login (greeter, ldm_greeter_get_authentication_user (greeter), get_session (), get_language ());
     }
     else
     {
@@ -256,26 +352,6 @@ layout_changed_cb (GtkWidget *widget)
         ldm_greeter_set_layout (greeter, g_object_get_data (G_OBJECT (widget), "layout"));
 }
 
-static void
-session_changed_cb (GtkWidget *widget)
-{
-    if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
-    {
-        g_free (session);
-        session = g_strdup (g_object_get_data (G_OBJECT (widget), "key"));
-    }
-}
-
-static void
-language_changed_cb (GtkWidget *widget)
-{
-    if (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
-        return;
-
-    g_free (language);
-    language = g_strdup (g_object_get_data (G_OBJECT (widget), "language"));
-}
-
 static void
 a11y_font_cb (GtkWidget *widget)
 {
@@ -389,7 +465,6 @@ main(int argc, char **argv)
     gchar *theme_dir, *rc_file, *background_image;
     GdkWindow *root;
     const GList *items, *item;
-    GSList *session_radio_list = NULL, *language_radio_list = NULL, *layout_radio_list = NULL;
     GdkDisplay *display;
     GdkScreen *screen;
     gint screen_width, screen_height;
@@ -412,7 +487,6 @@ main(int argc, char **argv)
     g_signal_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
 
     ldm_greeter_connect (greeter);
-    session = g_strdup (ldm_greeter_get_default_session (greeter));
 
     theme_dir = g_path_get_dirname (ldm_greeter_get_theme (greeter));
     rc_file = ldm_greeter_get_string_property (greeter, "gtkrc");
@@ -548,11 +622,6 @@ main(int argc, char **argv)
     menu = gtk_menu_new ();
     gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), menu);
 
-    menu_item = gtk_radio_menu_item_new_with_label (language_radio_list, _("Previous language"));
-    language_radio_list = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menu_item));
-    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
-    g_signal_connect (menu_item, "toggled", G_CALLBACK (language_changed_cb), NULL);
-
     items = ldm_greeter_get_languages (greeter);
     for (item = items; item; item = item->next)
     {
@@ -572,7 +641,6 @@ main(int argc, char **argv)
             gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
 
         g_object_set_data (G_OBJECT (menu_item), "language", g_strdup (ldm_language_get_code (language)));
-        g_signal_connect (menu_item, "toggled", G_CALLBACK (language_changed_cb), NULL);
     }
 
     menu_item = gtk_menu_item_new_with_label (_("Keyboard Layout"));
@@ -588,7 +656,7 @@ main(int argc, char **argv)
         layout_radio_list = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menu_item));
         gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
 
-        if (g_str_equal (ldm_layout_get_name (layout), ldm_greeter_get_layout (greeter)))
+        if (g_str_equal (ldm_layout_get_name (layout), ldm_greeter_get_default_layout (greeter)))
             gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
 
         g_object_set_data (G_OBJECT (menu_item), "layout", g_strdup (ldm_layout_get_name (layout)));
@@ -612,7 +680,6 @@ main(int argc, char **argv)
             gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
 
         g_object_set_data (G_OBJECT (menu_item), "key", g_strdup (ldm_session_get_key (session)));
-        g_signal_connect (menu_item, "toggled", G_CALLBACK (session_changed_cb), NULL);
     }
 
     power_menu = gtk_menu_new ();
index 11a9f439348a2de3c0e8f4b2b73dcf35dde81f78..2b63d9474b3a5f593c9080cc2ab7e92e904565ea 100644 (file)
@@ -133,6 +133,57 @@ get_user_image_cb (JSContextRef context,
     return JSValueMakeString (context, string);
 }
 
+static JSValueRef
+get_user_language_cb (JSContextRef context,
+                      JSObjectRef thisObject,
+                      JSStringRef propertyName,
+                      JSValueRef *exception)
+{
+    LdmUser *user = JSObjectGetPrivate (thisObject);
+    const gchar *language = ldm_user_get_language (user);
+    JSStringRef string;
+
+    if (!language)
+        return JSValueMakeNull (context);
+
+    string = JSStringCreateWithUTF8CString (language);
+    return JSValueMakeString (context, string);
+}
+
+static JSValueRef
+get_user_layout_cb (JSContextRef context,
+                    JSObjectRef thisObject,
+                    JSStringRef propertyName,
+                    JSValueRef *exception)
+{
+    LdmUser *user = JSObjectGetPrivate (thisObject);
+    const gchar *layout = ldm_user_get_layout (user);
+    JSStringRef string;
+
+    if (!layout)
+        return JSValueMakeNull (context);
+
+    string = JSStringCreateWithUTF8CString (layout);
+    return JSValueMakeString (context, string);
+}
+
+static JSValueRef
+get_user_session_cb (JSContextRef context,
+                     JSObjectRef thisObject,
+                     JSStringRef propertyName,
+                     JSValueRef *exception)
+{
+    LdmUser *user = JSObjectGetPrivate (thisObject);
+    const gchar *session = ldm_user_get_session (user);
+    JSStringRef string;
+
+    if (!session)
+        return JSValueMakeNull (context);
+
+    string = JSStringCreateWithUTF8CString (session);
+    return JSValueMakeString (context, string);
+}
+
 static JSValueRef
 get_user_logged_in_cb (JSContextRef context,
                        JSObjectRef thisObject,
@@ -898,6 +949,9 @@ static const JSStaticValue ldm_user_values[] =
     { "real_name", get_user_real_name_cb, NULL, kJSPropertyAttributeReadOnly },
     { "display_name", get_user_display_name_cb, NULL, kJSPropertyAttributeReadOnly },
     { "image", get_user_image_cb, NULL, kJSPropertyAttributeReadOnly },
+    { "language", get_user_language_cb, NULL, kJSPropertyAttributeReadOnly },
+    { "layout", get_user_layout_cb, NULL, kJSPropertyAttributeReadOnly },
+    { "session", get_user_session_cb, NULL, kJSPropertyAttributeReadOnly },
     { "logged_in", get_user_logged_in_cb, NULL, kJSPropertyAttributeReadOnly },
     { NULL, NULL, NULL, 0 }
 };
index 589092faf0110523a6776d984c137f0159a57341..c8165d5342fecca754ba315e5c8ee739ae116087 100644 (file)
@@ -193,8 +193,10 @@ ldm_greeter_connect (LdmGreeter *greeter)
                                 G_TYPE_STRING, &greeter->priv->timed_user,
                                 G_TYPE_INT, &greeter->priv->login_delay,
                                 G_TYPE_INVALID);
-    g_debug ("Connected theme=%s default-session=%s timed-user=%s login-delay=%d",
-             greeter->priv->theme, greeter->priv->default_session, greeter->priv->timed_user, greeter->priv->login_delay);
+    g_debug ("Connected theme=%s default-language=%s default-layout=%s default-session=%s timed-user=%s login-delay=%d",
+             greeter->priv->theme,
+             greeter->priv->default_language, greeter->priv->default_layout, greeter->priv->default_session,
+             greeter->priv->timed_user, greeter->priv->login_delay);
 
     if (!result)
         g_warning ("Failed to connect to display manager: %s", error->message);
@@ -374,7 +376,7 @@ update_users (LdmGreeter *greeter)
         dbus_g_type_struct_get (&value, 0, &name, 1, &real_name, 2, &image, 3, &logged_in, G_MAXUINT);
         g_value_unset (&value);
 
-        user = ldm_user_new (name, real_name, image, logged_in);
+        user = ldm_user_new (greeter, name, real_name, image, logged_in);
         g_free (name);
         g_free (real_name);
         g_free (image);
@@ -1162,6 +1164,27 @@ ldm_greeter_shutdown (LdmGreeter *greeter)
     g_object_unref (proxy);
 }
 
+gboolean
+ldm_greeter_get_user_defaults (LdmGreeter *greeter, const gchar *username, gchar **language, gchar **layout, gchar **session)
+{
+    GError *error = NULL;
+    gboolean result;
+
+    result = dbus_g_proxy_call (greeter->priv->user_proxy, "GetUserDefaults", &error,
+                                G_TYPE_STRING, username,
+                                G_TYPE_INVALID,
+                                G_TYPE_STRING, language,
+                                G_TYPE_STRING, layout,
+                                G_TYPE_STRING, session,
+                                G_TYPE_INVALID);
+  
+    if (!result)
+        g_warning ("Failed to get user defaults: %s", error->message);
+    g_clear_error (&error);
+
+    return result;
+}
+
 static void
 ldm_greeter_init (LdmGreeter *greeter)
 {
index 93a89a26c0736379f045d9e7b66bbe0a4f67bde9..6ac7851402b7e0b722b966b3208134043d65ad7f 100644 (file)
 
 #include <glib-object.h>
 
-#include "user.h"
-#include "language.h"
-#include "layout.h"
-#include "session.h"
-
 G_BEGIN_DECLS
 
 #define LDM_TYPE_GREETER            (ldm_greeter_get_type())
@@ -32,6 +27,11 @@ typedef struct _LdmGreeter        LdmGreeter;
 typedef struct _LdmGreeterClass   LdmGreeterClass;
 typedef struct _LdmGreeterPrivate LdmGreeterPrivate;
 
+#include "user.h"
+#include "language.h"
+#include "layout.h"
+#include "session.h"
+
 struct _LdmGreeter
 {
     GObject            parent_instance;
@@ -120,6 +120,8 @@ gboolean ldm_greeter_get_can_shutdown (LdmGreeter *greeter);
 
 void ldm_greeter_shutdown (LdmGreeter *greeter);
 
+gboolean ldm_greeter_get_user_defaults (LdmGreeter *greeter, const gchar *username, gchar **language, gchar **layout, gchar **session);
+
 G_END_DECLS
 
 #endif /* _LDM_GREETER_H_ */
index 17f2a803ae5f8b790208a2706ee6ee3b5d126189..025e7b1fcdee40a95d055f84bf85b1aa5e72d37f 100644 (file)
 
 enum {
     PROP_0,
+    PROP_GREETER,
     PROP_NAME,
     PROP_REAL_NAME,
     PROP_DISPLAY_NAME,
     PROP_IMAGE,
+    PROP_LANGUAGE,
+    PROP_LAYOUT,
+    PROP_SESSION,
     PROP_LOGGED_IN
 };
 
 struct _LdmUserPrivate
 {
+    LdmGreeter *greeter;
+
     gchar *name;
     gchar *real_name;
     gchar *image;
     gboolean logged_in;
+
+    gboolean have_defaults;
+    gchar *language;
+    gchar *layout;
+    gchar *session;
 };
 
 G_DEFINE_TYPE (LdmUser, ldm_user, G_TYPE_OBJECT);
@@ -34,6 +45,7 @@ G_DEFINE_TYPE (LdmUser, ldm_user, G_TYPE_OBJECT);
  * ldm_user_new:
  * 
  * Create a new user.
+ * @greeter: The greeter the user is connected to
  * @name: The username
  * @real_name: The real name of the user
  * @image: The image URI
@@ -42,9 +54,9 @@ G_DEFINE_TYPE (LdmUser, ldm_user, G_TYPE_OBJECT);
  * Return value: the new #LdmUser
  **/
 LdmUser *
-ldm_user_new (const gchar *name, const gchar *real_name, const gchar *image, gboolean logged_in)
+ldm_user_new (LdmGreeter *greeter, const gchar *name, const gchar *real_name, const gchar *image, gboolean logged_in)
 {
-    return g_object_new (LDM_TYPE_USER, "name", name, "real-name", real_name, "image", image, "logged-in", logged_in, NULL);
+    return g_object_new (LDM_TYPE_USER, "greeter", greeter, "name", name, "real-name", real_name, "image", image, "logged-in", logged_in, NULL);
 }
 
 /**
@@ -106,6 +118,61 @@ ldm_user_get_image (LdmUser *user)
     return user->priv->image;
 }
 
+static void
+get_defaults (LdmUser *user)
+{
+    if (user->priv->have_defaults)
+        return;
+
+    if (ldm_greeter_get_user_defaults (user->priv->greeter, user->priv->name, &user->priv->language, &user->priv->layout, &user->priv->session))
+        user->priv->have_defaults = TRUE;
+}
+
+/**
+ * ldm_user_get_language
+ * @user: A #LdmUser
+ * 
+ * Get the language for a user.
+ * 
+ * Return value: The language for the given user or NULL if using system defaults.
+ **/
+const gchar *
+ldm_user_get_language (LdmUser *user)
+{
+    get_defaults (user);
+    return user->priv->language;
+}
+
+/**
+ * ldm_user_get_layout
+ * @user: A #LdmUser
+ * 
+ * Get the keyboard layout for a user.
+ * 
+ * Return value: The keyboard layoyt for the given user or NULL if using system defaults.
+ **/
+const gchar *
+ldm_user_get_layout (LdmUser *user)
+{
+    get_defaults (user);
+    return user->priv->layout;
+}
+
+/**
+ * ldm_user_get_session
+ * @user: A #LdmUser
+ * 
+ * Get the session for a user.
+ * 
+ * Return value: The session for the given user or NULL if using system defaults.
+ **/
+const gchar *
+ldm_user_get_session (LdmUser *user)
+{
+    get_defaults (user);
+    return user->priv->session; 
+}
+
 /**
  * ldm_user_get_logged_in:
  * @user: A #LdmUser
@@ -138,16 +205,16 @@ ldm_user_set_property (GObject      *object,
     self = LDM_USER (object);
 
     switch (prop_id) {
+    case PROP_GREETER:
+        self->priv->greeter = g_object_ref (g_value_get_object (value));
+        break;
     case PROP_NAME:
-        g_free (self->priv->name);
         self->priv->name = g_strdup (g_value_get_string (value));
         break;
     case PROP_REAL_NAME:
-        g_free (self->priv->real_name);
         self->priv->real_name = g_strdup (g_value_get_string (value));
         break;
     case PROP_IMAGE:
-        g_free (self->priv->image);
         self->priv->image = g_strdup (g_value_get_string (value));
         break;
     case PROP_LOGGED_IN:
@@ -182,6 +249,15 @@ ldm_user_get_property (GObject    *object,
     case PROP_IMAGE:
         g_value_set_string (value, ldm_user_get_image (self));
         break;
+    case PROP_LANGUAGE:
+        g_value_set_string (value, ldm_user_get_language (self));
+        break;
+    case PROP_LAYOUT:
+        g_value_set_string (value, ldm_user_get_layout (self));
+        break;
+    case PROP_SESSION:
+        g_value_set_string (value, ldm_user_get_session (self));
+        break;
     case PROP_LOGGED_IN:
         g_value_set_boolean (value, ldm_user_get_logged_in (self));
         break;
@@ -201,6 +277,13 @@ ldm_user_class_init (LdmUserClass *klass)
     object_class->set_property = ldm_user_set_property;
     object_class->get_property = ldm_user_get_property;
 
+    g_object_class_install_property(object_class,
+                                    PROP_GREETER,
+                                    g_param_spec_object("greeter",
+                                                        "greeter",
+                                                        "Greeter",
+                                                        LDM_TYPE_GREETER,
+                                                        G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
     g_object_class_install_property(object_class,
                                     PROP_NAME,
                                     g_param_spec_string("name",
@@ -229,6 +312,27 @@ ldm_user_class_init (LdmUserClass *klass)
                                                         "Avatar image",
                                                         NULL,
                                                         G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+    g_object_class_install_property(object_class,
+                                    PROP_LANGUAGE,
+                                    g_param_spec_string("language",
+                                                        "language",
+                                                        "Language used by this user",
+                                                        NULL,
+                                                        G_PARAM_READABLE));
+    g_object_class_install_property(object_class,
+                                    PROP_LAYOUT,
+                                    g_param_spec_string("layout",
+                                                        "layout",
+                                                        "Keyboard layout used by this user",
+                                                        NULL,
+                                                        G_PARAM_READABLE));
+    g_object_class_install_property(object_class,
+                                    PROP_SESSION,
+                                    g_param_spec_string("session",
+                                                        "session",
+                                                        "Session used by this user",
+                                                        NULL,
+                                                        G_PARAM_READABLE));
     g_object_class_install_property(object_class,
                                     PROP_LOGGED_IN,
                                     g_param_spec_boolean("logged-in",
index ef5d3d7205cfc5e338544a87a15b53a94c0d306b..db3d8d162c39da7e095f56a253935e280f85a9e4 100644 (file)
@@ -14,6 +14,8 @@
 
 #include <glib-object.h>
 
+#include "greeter.h"
+
 G_BEGIN_DECLS
 
 #define LDM_TYPE_USER            (ldm_user_get_type())
@@ -40,7 +42,7 @@ struct _LdmUserClass
 
 GType ldm_user_get_type (void);
 
-LdmUser *ldm_user_new (const gchar *name, const gchar *real_name, const gchar *image, gboolean logged_in);
+LdmUser *ldm_user_new (LdmGreeter *greeter, const gchar *name, const gchar *real_name, const gchar *image, gboolean logged_in);
 
 const gchar *ldm_user_get_name (LdmUser *user);
 
@@ -50,6 +52,12 @@ const gchar *ldm_user_get_display_name (LdmUser *user);
 
 const gchar *ldm_user_get_image (LdmUser *user);
 
+const gchar *ldm_user_get_language (LdmUser *user);
+
+const gchar *ldm_user_get_layout (LdmUser *user);
+
+const gchar *ldm_user_get_session (LdmUser *user);
+
 gboolean ldm_user_get_logged_in (LdmUser *user);
 
 G_END_DECLS
index 41453eb93ac528694293929126ad677f64dc4a98..0fb30beccb99899e5a665bf6fb0c954a9010ecf0 100644 (file)
@@ -322,7 +322,6 @@ static Display *
 add_display (DisplayManager *manager)
 {
     Display *display;
-    gchar *value;
 
     display = display_new (g_list_length (manager->priv->displays));
     g_signal_connect (display, "start-greeter", G_CALLBACK (start_greeter_cb), manager);
@@ -332,27 +331,6 @@ add_display (DisplayManager *manager)
     if (manager->priv->test_mode)
         display_set_greeter_user (display, NULL);
 
-    value = g_key_file_get_string (manager->priv->config, "Greeter", "language", NULL);
-    if (value)
-        display_set_default_language (display, value);
-    g_free (value);
-    value = g_key_file_get_string (manager->priv->config, "Greeter", "layout", NULL);
-    if (value)
-        display_set_default_layout (display, value);
-    g_free (value);
-    value = g_key_file_get_string (manager->priv->config, "Greeter", "session", NULL);
-    if (value)
-        display_set_default_session (display, value);
-    g_free (value);
-    value = g_key_file_get_string (manager->priv->config, "Greeter", "user", NULL);
-    if (value)
-        display_set_greeter_user (display, value);
-    g_free (value);
-    value = g_key_file_get_string (manager->priv->config, "Greeter", "theme", NULL);
-    if (value)
-        display_set_greeter_theme (display, value);
-    g_free (value);
-
     manager->priv->displays = g_list_append (manager->priv->displays, display);
 
     g_signal_emit (manager, signals[DISPLAY_ADDED], 0, display);
@@ -502,7 +480,7 @@ display_manager_start (DisplayManager *manager)
     for (i = tokens; *i; i++)
     {
         Display *display;
-        gchar *default_user, *display_name;
+        gchar *value, *default_user, *display_name;
         gint user_timeout;
         XServer *xserver;
 
@@ -511,6 +489,27 @@ display_manager_start (DisplayManager *manager)
 
         display = add_display (manager);
 
+        value = g_key_file_get_string (manager->priv->config, display_name, "language", NULL);
+        if (value)
+            display_set_default_language (display, value);
+        g_free (value);
+        value = g_key_file_get_string (manager->priv->config, display_name, "layout", NULL);
+        if (value)
+            display_set_default_layout (display, value);
+        g_free (value);
+        value = g_key_file_get_string (manager->priv->config, display_name, "session", NULL);
+        if (value)
+            display_set_default_session (display, value);
+        g_free (value);
+        value = g_key_file_get_string (manager->priv->config, display_name, "user", NULL);
+        if (value)
+            display_set_greeter_user (display, value);
+        g_free (value);
+        value = g_key_file_get_string (manager->priv->config, display_name, "theme", NULL);
+        if (value)
+            display_set_greeter_theme (display, value);
+        g_free (value);
+      
         /* Automatically log in or start a greeter session */
         default_user = g_key_file_get_string (manager->priv->config, display_name, "default-user", NULL);
         user_timeout = g_key_file_get_integer (manager->priv->config, display_name, "default-user-timeout", NULL);
index 3372f1df4b58f22eac609d3f3056368ba23ebb74..8cb34f7d5bb8b5ca16332a47e7ded06fdc3ffc82 100644 (file)
@@ -420,7 +420,6 @@ start_user_session (Display *display, const gchar *session, const gchar *languag
             display->priv->user_session = session_new (pam_session_get_username (display->priv->user_pam_session), command);
 
             session_language = g_key_file_get_string (dmrc_file, "Desktop", "Language", NULL);
-            g_debug ("session_language='%s'", session_language);
 
             layout = g_key_file_get_string (dmrc_file, "Desktop", "Layout", NULL);
 
@@ -882,7 +881,7 @@ display_init (Display *display)
     display->priv = G_TYPE_INSTANCE_GET_PRIVATE (display, DISPLAY_TYPE, DisplayPrivate);
     display->priv->greeter_user = g_strdup (GREETER_USER);
     display->priv->greeter_theme = g_strdup (GREETER_THEME);
-    display->priv->default_language = getenv ("LANG") ? getenv ("LANG") : g_strdup ("C");
+    display->priv->default_language = getenv ("LANG") ? g_strdup (getenv ("LANG")) : g_strdup ("C");
     display->priv->default_layout = g_strdup ("us"); // FIXME: Is there a better default to get?
     display->priv->default_session = g_strdup (DEFAULT_SESSION);
 }
index e04af561fdcda23355243fa5a02da4bf65a7bade..4b73ec44a2cce891338bb22731bfe67152d46804 100644 (file)
@@ -127,8 +127,10 @@ update_users (UserManager *manager)
         else
             user->real_name = NULL;
         g_strfreev (tokens);
+      
+        user->home_dir = g_strdup (entry->pw_dir);
 
-        image_path = g_build_filename ("/home", user->name, ".face", NULL);
+        image_path = g_build_filename (user->home_dir, ".face", NULL);
         if (g_file_test (image_path, G_FILE_TEST_EXISTS))
             user->image = g_filename_to_uri (image_path, NULL, NULL);
         else
@@ -156,6 +158,23 @@ user_manager_get_num_users (UserManager *manager)
     return g_list_length (manager->priv->users);
 }
 
+const UserInfo *
+user_manager_get_user (UserManager *manager, const gchar *username)
+{
+    GList *link;
+
+    update_users (manager);
+
+    for (link = manager->priv->users; link; link = link->next)
+    {
+        UserInfo *info = link->data;
+        if (strcmp (info->name, username) == 0)
+            return info;
+    }
+
+    return NULL;
+}
+
 #define TYPE_USER dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_INVALID)
 
 gboolean
@@ -180,6 +199,50 @@ user_manager_get_users (UserManager *manager, GPtrArray **users, GError *error)
     return TRUE;
 }
 
+gboolean
+user_manager_get_user_defaults (UserManager *manager, gchar *username, gchar **language, gchar **layout, gchar **session, GError *error)
+{
+    const UserInfo *info;
+    GKeyFile *dmrc_file;
+    gboolean have_dmrc;
+    gchar *path;
+
+    info = user_manager_get_user (manager, username);
+    if (!info)
+        return FALSE;
+
+    dmrc_file = g_key_file_new ();
+    g_key_file_set_string (dmrc_file, "Desktop", "Language", "");
+    g_key_file_set_string (dmrc_file, "Desktop", "Layout", "");
+    g_key_file_set_string (dmrc_file, "Desktop", "Session", "");
+
+    /* Load the users login settings (~/.dmrc) */  
+    path = g_build_filename (info->home_dir, ".dmrc", NULL);
+    have_dmrc = g_key_file_load_from_file (dmrc_file, path, G_KEY_FILE_NONE, NULL);
+    g_free (path);
+
+    /* If no .dmrc, then load from the cache */
+    if (!have_dmrc)
+    {
+        gchar *filename;
+
+        filename = g_strdup_printf ("%s.dmrc", username);
+        path = g_build_filename (CACHE_DIR, "dmrc", filename, NULL);
+        g_free (filename);
+        have_dmrc = g_key_file_load_from_file (dmrc_file, path, G_KEY_FILE_NONE, NULL);
+        g_free (path);
+    }
+
+    *language = g_key_file_get_string (dmrc_file, "Desktop", "Language", NULL);
+    *layout = g_key_file_get_string (dmrc_file, "Desktop", "Layout", NULL);
+    *session = g_key_file_get_string (dmrc_file, "Desktop", "Session", NULL);
+
+    g_key_file_free (dmrc_file);
+
+    return TRUE;
+}
+
+
 static void
 user_manager_init (UserManager *manager)
 {
index c46cccad86a9de3c7dce9c7daf7ecb67f644cea9..cc3074cb35948d6c806a403263843487212ce7cb 100644 (file)
@@ -37,6 +37,7 @@ typedef struct
     const gchar *name;
     const gchar *real_name;
     const gchar *image;
+    const gchar *home_dir;
     gboolean logged_in;
 } UserInfo;
 
@@ -46,8 +47,12 @@ UserManager *user_manager_new (GKeyFile *config_file);
 
 gint user_manager_get_num_users (UserManager *manager);
 
+const UserInfo *user_manager_get_user (UserManager *manager, const gchar *username);
+
 gboolean user_manager_get_users (UserManager *manager, GPtrArray **users, GError *error);
 
+gboolean user_manager_get_user_defaults (UserManager *manager, gchar *username, gchar **language, gchar **layout, gchar **session, GError *error);
+
 G_END_DECLS
 
 #endif /* _USER_MANAGER_H_ */
index de81c8ec74dffb6170bc49c029714b754046c40d..a271903a4a553b209e9181ea4cbac747afade1ae 100644 (file)
@@ -7,6 +7,14 @@
       <!-- name,real name,image,logged in -->
       <arg name="users" direction="out" type="a(sssb)"/>
     </method>
+    
+    <!-- Method to get user default information -->
+    <method name="GetUserDefaults">
+      <arg name="username" direction="in" type="s"/>    
+      <arg name="language" direction="out" type="s"/>
+      <arg name="layout" direction="out" type="s"/>
+      <arg name="session" direction="out" type="s"/>
+    </method>
 
   </interface>
 </node>