(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
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
ldm_greeter_restart
ldm_greeter_get_can_shutdown
ldm_greeter_shutdown
+ldm_greeter_get_user_defaults
<SUBSECTION Standard>
LDM_GREETER
LDM_IS_GREETER
@greeter:
+<!-- ##### FUNCTION ldm_greeter_get_user_defaults ##### -->
+<para>
+
+</para>
+
+@greeter:
+@username:
+@language:
+@layout:
+@session:
+@Returns:
+
+
</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>
</para>
+<!-- ##### ARG LdmUser:session ##### -->
+<para>
+
+</para>
+
<!-- ##### FUNCTION ldm_user_get_name ##### -->
<para>
@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>
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))
{
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
{
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)
{
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;
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");
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)
{
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"));
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)));
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 ();
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,
{ "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 }
};
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);
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);
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)
{
#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())
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;
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_ */
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);
* 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
* 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);
}
/**
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
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:
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;
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",
"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",
#include <glib-object.h>
+#include "greeter.h"
+
G_BEGIN_DECLS
#define LDM_TYPE_USER (ldm_user_get_type())
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);
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
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);
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);
for (i = tokens; *i; i++)
{
Display *display;
- gchar *default_user, *display_name;
+ gchar *value, *default_user, *display_name;
gint user_timeout;
XServer *xserver;
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);
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);
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);
}
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
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
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)
{
const gchar *name;
const gchar *real_name;
const gchar *image;
+ const gchar *home_dir;
gboolean logged_in;
} UserInfo;
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_ */
<!-- 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>