From: unknown Date: Mon, 1 Nov 2010 03:30:41 +0000 (+1100) Subject: Change language/layout/session when user selected in GTK+ greeter X-Git-Url: https://rtime.felk.cvut.cz/gitweb/sojka/lightdm.git/commitdiff_plain/7dc244b7d7b3d0e2583c3c238bb334c1950638de Change language/layout/session when user selected in GTK+ greeter --- diff --git a/NEWS b/NEWS index be6fc43e..67b3ce9d 100644 --- 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 diff --git a/doc/ldmgreeter-sections.txt b/doc/ldmgreeter-sections.txt index 898dcbcb..20261d07 100644 --- a/doc/ldmgreeter-sections.txt +++ b/doc/ldmgreeter-sections.txt @@ -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 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 LDM_GREETER LDM_IS_GREETER diff --git a/doc/tmpl/greeter.sgml b/doc/tmpl/greeter.sgml index 603a62df..575537c3 100644 --- a/doc/tmpl/greeter.sgml +++ b/doc/tmpl/greeter.sgml @@ -491,3 +491,16 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @greeter: + + + + + +@greeter: +@username: +@language: +@layout: +@session: +@Returns: + + diff --git a/doc/tmpl/user.sgml b/doc/tmpl/user.sgml index 732fa76c..f685a4c8 100644 --- a/doc/tmpl/user.sgml +++ b/doc/tmpl/user.sgml @@ -47,11 +47,26 @@ A user has the following properties: + + + + + + + + + + + + + + + @@ -67,6 +82,11 @@ A user has the following properties: + + + + + @@ -103,6 +123,33 @@ A user has the following properties: @Returns: + + + + + +@user: +@Returns: + + + + + + + +@user: +@Returns: + + + + + + + +@user: +@Returns: + + diff --git a/greeters/ldm-gtk-greeter.c b/greeters/ldm-gtk-greeter.c index 6c538ba8..41e9ed6d 100644 --- a/greeters/ldm-gtk-greeter.c +++ b/greeters/ldm-gtk-greeter.c @@ -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 (); diff --git a/greeters/ldm-webkit-greeter.c b/greeters/ldm-webkit-greeter.c index 11a9f439..2b63d947 100644 --- a/greeters/ldm-webkit-greeter.c +++ b/greeters/ldm-webkit-greeter.c @@ -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 } }; diff --git a/libldmgreeter/greeter.c b/libldmgreeter/greeter.c index 589092fa..c8165d53 100644 --- a/libldmgreeter/greeter.c +++ b/libldmgreeter/greeter.c @@ -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) { diff --git a/libldmgreeter/greeter.h b/libldmgreeter/greeter.h index 93a89a26..6ac78514 100644 --- a/libldmgreeter/greeter.h +++ b/libldmgreeter/greeter.h @@ -14,11 +14,6 @@ #include -#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_ */ diff --git a/libldmgreeter/user.c b/libldmgreeter/user.c index 17f2a803..025e7b1f 100644 --- a/libldmgreeter/user.c +++ b/libldmgreeter/user.c @@ -13,19 +13,30 @@ 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", diff --git a/libldmgreeter/user.h b/libldmgreeter/user.h index ef5d3d72..db3d8d16 100644 --- a/libldmgreeter/user.h +++ b/libldmgreeter/user.h @@ -14,6 +14,8 @@ #include +#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 diff --git a/src/display-manager.c b/src/display-manager.c index 41453eb9..0fb30bec 100644 --- a/src/display-manager.c +++ b/src/display-manager.c @@ -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); diff --git a/src/display.c b/src/display.c index 3372f1df..8cb34f7d 100644 --- a/src/display.c +++ b/src/display.c @@ -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); } diff --git a/src/user-manager.c b/src/user-manager.c index e04af561..4b73ec44 100644 --- a/src/user-manager.c +++ b/src/user-manager.c @@ -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) { diff --git a/src/user-manager.h b/src/user-manager.h index c46cccad..cc3074cb 100644 --- a/src/user-manager.h +++ b/src/user-manager.h @@ -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_ */ diff --git a/src/user-manager.xml b/src/user-manager.xml index de81c8ec..a271903a 100644 --- a/src/user-manager.xml +++ b/src/user-manager.xml @@ -7,6 +7,14 @@ + + + + + + + +