diff --git a/.gitignore b/.gitignore index 70a5fc9..da13619 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ gdm-2.30.2.tar.bz2 /gdm-2.32.0.tar.bz2 /gdm-2.91.4.tar.bz2 /gdm-2.91.6.tar.bz2 +/gdm-2.91.91.tar.bz2 diff --git a/0001-Make-sure-to-disable-g-s-d-plugins-in-greeter.patch b/0001-Make-sure-to-disable-g-s-d-plugins-in-greeter.patch deleted file mode 100644 index 704442d..0000000 --- a/0001-Make-sure-to-disable-g-s-d-plugins-in-greeter.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 408d82df9e264e37d0dec7f049b2a64ea22032ab Mon Sep 17 00:00:00 2001 -From: Bastien Nocera -Date: Mon, 7 Feb 2011 16:24:27 +0000 -Subject: [PATCH] Make sure to disable g-s-d plugins in greeter - -By grepping for the right plugins. ---- - data/make-dconf-override-db.sh | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/data/make-dconf-override-db.sh b/data/make-dconf-override-db.sh -index 6fd7cbd..07de694 100755 ---- a/data/make-dconf-override-db.sh -+++ b/data/make-dconf-override-db.sh -@@ -38,7 +38,7 @@ gsettings set org.gnome.settings-daemon.plugins.media-keys search '""' - gsettings set org.gnome.settings-daemon.plugins.media-keys stop '""' - gsettings set org.gnome.settings-daemon.plugins.media-keys www '""' - --gsettings list-schemas | egrep '^org\.gnome\.gnome-settings-daemon\.plugins\.' | while read schema; do -+gsettings list-schemas | egrep '^org\.gnome\.settings-daemon\.plugins\.' | while read schema; do - gsettings set $schema active false - done - --- -1.7.4 - diff --git a/accounts-service.patch b/accounts-service.patch deleted file mode 100644 index d8599fe..0000000 --- a/accounts-service.patch +++ /dev/null @@ -1,2863 +0,0 @@ -From 04a77f1fbb48138a6dfe0a1a20027fd3af6773fe Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Thu, 11 Mar 2010 09:07:21 -0500 -Subject: [PATCH 01/22] Add new gdm_user_is_logged_in method - -Before we were doing - -if (gdm_user_get_num_sessions > 0) - -all over the place. This is slightly -more clear. ---- - gui/simple-greeter/gdm-user-chooser-widget.c | 4 ++-- - gui/simple-greeter/gdm-user.c | 6 ++++++ - gui/simple-greeter/gdm-user.h | 1 + - 3 files changed, 9 insertions(+), 2 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c -index 77e06a7..9658c2b 100644 ---- a/gui/simple-greeter/gdm-user-chooser-widget.c -+++ b/gui/simple-greeter/gdm-user-chooser-widget.c -@@ -385,7 +385,7 @@ add_user (GdmUserChooserWidget *widget, - tooltip = g_strdup_printf (_("Log in as %s"), - gdm_user_get_user_name (user)); - -- is_logged_in = gdm_user_get_num_sessions (user) > 0; -+ is_logged_in = gdm_user_is_logged_in (user); - - g_debug ("GdmUserChooserWidget: User added name:%s logged-in:%d pixbuf:%p", - gdm_user_get_user_name (user), -@@ -453,7 +453,7 @@ on_user_is_logged_in_changed (GdmUserManager *manager, - g_debug ("GdmUserChooserWidget: User logged in changed: %s", gdm_user_get_user_name (user)); - - user_name = gdm_user_get_user_name (user); -- is_logged_in = gdm_user_get_num_sessions (user) > 0; -+ is_logged_in = gdm_user_is_logged_in (user); - - gdm_chooser_widget_set_item_in_use (GDM_CHOOSER_WIDGET (widget), - user_name, -diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c -index 276a867..e182c2a 100644 ---- a/gui/simple-greeter/gdm-user.c -+++ b/gui/simple-greeter/gdm-user.c -@@ -992,6 +992,12 @@ frame_pixbuf (GdkPixbuf *source) - return dest; - } - -+gboolean -+gdm_user_is_logged_in (GdmUser *user) -+{ -+ return user->sessions != NULL; -+} -+ - GdkPixbuf * - gdm_user_render_icon (GdmUser *user, - gint icon_size) -diff --git a/gui/simple-greeter/gdm-user.h b/gui/simple-greeter/gdm-user.h -index 9f153d9..c0b27ca 100644 ---- a/gui/simple-greeter/gdm-user.h -+++ b/gui/simple-greeter/gdm-user.h -@@ -47,6 +47,7 @@ G_CONST_RETURN char *gdm_user_get_home_directory (GdmUser *user); - G_CONST_RETURN char *gdm_user_get_shell (GdmUser *user); - guint gdm_user_get_num_sessions (GdmUser *user); - GList *gdm_user_get_sessions (GdmUser *user); -+gboolean gdm_user_is_logged_in (GdmUser *user); - gulong gdm_user_get_login_frequency (GdmUser *user); - - GdkPixbuf *gdm_user_render_icon (GdmUser *user, --- -1.6.5.2 - - -From c40b580ed71f206e8bcf0b2772011b4c944d1832 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 15 Mar 2010 13:21:24 -0400 -Subject: [PATCH 02/22] Don't match users as dupes of themselves - ---- - gui/simple-greeter/gdm-user-manager.c | 6 +++--- - 1 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index 01dc507..fe9d13d 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -746,9 +746,9 @@ match_real_name_cmpfunc (gconstpointer a, - static gboolean - match_real_name_hrfunc (gpointer key, - gpointer value, -- gpointer user_data) -+ gpointer user) - { -- return (g_strcmp0 (user_data, gdm_user_get_real_name (value)) == 0); -+ return (value != user && g_strcmp0 (gdm_user_get_real_name (user), gdm_user_get_real_name (value)) == 0); - } - - static void -@@ -760,7 +760,7 @@ add_user (GdmUserManager *manager, - add_sessions_for_user (manager, user); - dup = g_hash_table_find (manager->priv->users, - match_real_name_hrfunc, -- (char *) gdm_user_get_real_name (user)); -+ user); - if (dup != NULL) { - _gdm_user_show_full_display_name (user); - _gdm_user_show_full_display_name (dup); --- -1.6.5.2 - - -From 4f766f1a7be43b0b8d20159651371b462a1f9301 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 15 Mar 2010 13:56:38 -0400 -Subject: [PATCH 03/22] Move get_primary_session_id to gdm-user.h - -It makes more sense there, and this will allow -us to drop get_sessions eventually. ---- - gui/simple-greeter/gdm-user-manager.c | 61 +++++--------------------------- - gui/simple-greeter/gdm-user.c | 30 ++++++++++++++++ - gui/simple-greeter/gdm-user.h | 1 + - 3 files changed, 41 insertions(+), 51 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index fe9d13d..0bb868f 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -150,55 +150,6 @@ start_new_login_session (GdmUserManager *manager) - return res; - } - --/* needs to stay in sync with gdm-slave */ --static char * --_get_primary_user_session_id (GdmUserManager *manager, -- GdmUser *user) --{ -- gboolean can_activate_sessions; -- GList *sessions; -- GList *l; -- char *primary_ssid; -- -- if (manager->priv->seat_id == NULL || manager->priv->seat_id[0] == '\0') { -- g_debug ("GdmUserManager: display seat ID is not set; can't switch sessions"); -- return NULL; -- } -- -- primary_ssid = NULL; -- sessions = NULL; -- -- can_activate_sessions = gdm_user_manager_can_switch (manager); -- -- if (! can_activate_sessions) { -- g_debug ("GdmUserManager: seat is unable to activate sessions"); -- goto out; -- } -- -- sessions = gdm_user_get_sessions (user); -- if (sessions == NULL) { -- g_warning ("unable to determine sessions for user: %s", -- gdm_user_get_user_name (user)); -- goto out; -- } -- -- for (l = sessions; l != NULL; l = l->next) { -- const char *ssid; -- -- ssid = l->data; -- -- /* FIXME: better way to choose? */ -- if (ssid != NULL) { -- primary_ssid = g_strdup (ssid); -- break; -- } -- } -- -- out: -- -- return primary_ssid; --} -- - static gboolean - activate_session_id (GdmUserManager *manager, - const char *seat_id, -@@ -439,15 +390,23 @@ gdm_user_manager_activate_user_session (GdmUserManager *manager, - GdmUser *user) - { - gboolean ret; -- char *ssid; -+ const char *ssid; - gboolean res; - -+ gboolean can_activate_sessions; - g_return_val_if_fail (GDM_IS_USER_MANAGER (manager), FALSE); - g_return_val_if_fail (GDM_IS_USER (user), FALSE); - - ret = FALSE; - -- ssid = _get_primary_user_session_id (manager, user); -+ can_activate_sessions = gdm_user_manager_can_switch (manager); -+ -+ if (! can_activate_sessions) { -+ g_debug ("GdmUserManager: seat is unable to activate sessions"); -+ goto out; -+ } -+ -+ ssid = gdm_user_get_primary_session_id (user); - if (ssid == NULL) { - goto out; - } -diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c -index e182c2a..2c62334 100644 ---- a/gui/simple-greeter/gdm-user.c -+++ b/gui/simple-greeter/gdm-user.c -@@ -1065,3 +1065,33 @@ gdm_user_render_icon (GdmUser *user, - - return pixbuf; - } -+ -+G_CONST_RETURN char * -+gdm_user_get_primary_session_id (GdmUser *user) -+{ -+ GList *l; -+ const char *primary_ssid; -+ -+ primary_ssid = NULL; -+ -+ if (!gdm_user_is_logged_in (user)) { -+ g_debug ("User %s is not logged in, so has no primary session", -+ gdm_user_get_user_name (user)); -+ goto out; -+ } -+ -+ for (l = user->sessions; l != NULL; l = l->next) { -+ const char *ssid; -+ -+ ssid = l->data; -+ -+ /* FIXME: better way to choose? */ -+ if (ssid != NULL) { -+ primary_ssid = ssid; -+ break; -+ } -+ } -+out: -+ return primary_ssid; -+} -+ -diff --git a/gui/simple-greeter/gdm-user.h b/gui/simple-greeter/gdm-user.h -index c0b27ca..3e448dd 100644 ---- a/gui/simple-greeter/gdm-user.h -+++ b/gui/simple-greeter/gdm-user.h -@@ -49,6 +49,7 @@ guint gdm_user_get_num_sessions (GdmUser *user); - GList *gdm_user_get_sessions (GdmUser *user); - gboolean gdm_user_is_logged_in (GdmUser *user); - gulong gdm_user_get_login_frequency (GdmUser *user); -+G_CONST_RETURN char *gdm_user_get_primary_session_id (GdmUser *user); - - GdkPixbuf *gdm_user_render_icon (GdmUser *user, - gint icon_size); --- -1.6.5.2 - - -From c9e7a8b8410ef7788c05c4937d4263a5308ae568 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 15 Mar 2010 14:05:58 -0400 -Subject: [PATCH 04/22] Don't track manager from user object - -We don't need it, and it's a bit backward anyway. ---- - gui/simple-greeter/gdm-user-manager.c | 2 +- - gui/simple-greeter/gdm-user.c | 21 --------------------- - 2 files changed, 1 insertions(+), 22 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index 0bb868f..aadb147 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -683,7 +683,7 @@ create_user (GdmUserManager *manager) - { - GdmUser *user; - -- user = g_object_new (GDM_TYPE_USER, "manager", manager, NULL); -+ user = g_object_new (GDM_TYPE_USER, NULL); - g_signal_connect (user, - "sessions-changed", - G_CALLBACK (on_user_sessions_changed), -diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c -index 2c62334..65ca7b5 100644 ---- a/gui/simple-greeter/gdm-user.c -+++ b/gui/simple-greeter/gdm-user.c -@@ -30,7 +30,6 @@ - #include - #include - --#include "gdm-user-manager.h" - #include "gdm-user-private.h" - - #define GDM_USER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDM_TYPE_USER, GdmUserClass)) -@@ -44,7 +43,6 @@ - - enum { - PROP_0, -- PROP_MANAGER, - PROP_REAL_NAME, - PROP_DISPLAY_NAME, - PROP_USER_NAME, -@@ -62,8 +60,6 @@ enum { - struct _GdmUser { - GObject parent; - -- GdmUserManager *manager; -- - uid_t uid; - char *user_name; - char *real_name; -@@ -170,10 +166,6 @@ gdm_user_set_property (GObject *object, - user = GDM_USER (object); - - switch (param_id) { -- case PROP_MANAGER: -- user->manager = g_value_get_object (value); -- g_assert (user->manager); -- break; - case PROP_LOGIN_FREQUENCY: - _gdm_user_set_login_frequency (user, g_value_get_ulong (value)); - break; -@@ -194,9 +186,6 @@ gdm_user_get_property (GObject *object, - user = GDM_USER (object); - - switch (param_id) { -- case PROP_MANAGER: -- g_value_set_object (value, user->manager); -- break; - case PROP_USER_NAME: - g_value_set_string (value, user->user_name); - break; -@@ -236,15 +225,6 @@ gdm_user_class_init (GdmUserClass *class) - gobject_class->finalize = gdm_user_finalize; - - g_object_class_install_property (gobject_class, -- PROP_MANAGER, -- g_param_spec_object ("manager", -- _("Manager"), -- _("The user manager object this user is controlled by."), -- GDM_TYPE_USER_MANAGER, -- (G_PARAM_READWRITE | -- G_PARAM_CONSTRUCT_ONLY))); -- -- g_object_class_install_property (gobject_class, - PROP_REAL_NAME, - g_param_spec_string ("real-name", - "Real Name", -@@ -311,7 +291,6 @@ gdm_user_class_init (GdmUserClass *class) - static void - gdm_user_init (GdmUser *user) - { -- user->manager = NULL; - user->user_name = NULL; - user->real_name = NULL; - user->display_name = NULL; --- -1.6.5.2 - - -From 321e40e627b9c8f570d7e293571f56892f8758c1 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 15 Mar 2010 14:21:56 -0400 -Subject: [PATCH 05/22] Drop user properties in favor of a "changed" signal - -This is less specific, but good enough, and will make -changing out the backend easier. ---- - gui/simple-greeter/gdm-user.c | 165 +++++--------------------------------- - gui/user-switch-applet/applet.c | 28 ++----- - 2 files changed, 29 insertions(+), 164 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c -index 65ca7b5..182ef72 100644 ---- a/gui/simple-greeter/gdm-user.c -+++ b/gui/simple-greeter/gdm-user.c -@@ -42,17 +42,7 @@ - #define MINIMAL_UID 100 - - enum { -- PROP_0, -- PROP_REAL_NAME, -- PROP_DISPLAY_NAME, -- PROP_USER_NAME, -- PROP_UID, -- PROP_HOME_DIR, -- PROP_SHELL, -- PROP_LOGIN_FREQUENCY, --}; -- --enum { -+ CHANGED, - SESSIONS_CHANGED, - LAST_SIGNAL - }; -@@ -148,136 +138,22 @@ gdm_user_get_sessions (GdmUser *user) - } - - static void --_gdm_user_set_login_frequency (GdmUser *user, -- gulong login_frequency) --{ -- user->login_frequency = login_frequency; -- g_object_notify (G_OBJECT (user), "login-frequency"); --} -- --static void --gdm_user_set_property (GObject *object, -- guint param_id, -- const GValue *value, -- GParamSpec *pspec) --{ -- GdmUser *user; -- -- user = GDM_USER (object); -- -- switch (param_id) { -- case PROP_LOGIN_FREQUENCY: -- _gdm_user_set_login_frequency (user, g_value_get_ulong (value)); -- break; -- default: -- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); -- break; -- } --} -- --static void --gdm_user_get_property (GObject *object, -- guint param_id, -- GValue *value, -- GParamSpec *pspec) --{ -- GdmUser *user; -- -- user = GDM_USER (object); -- -- switch (param_id) { -- case PROP_USER_NAME: -- g_value_set_string (value, user->user_name); -- break; -- case PROP_REAL_NAME: -- g_value_set_string (value, user->real_name); -- break; -- case PROP_DISPLAY_NAME: -- g_value_set_string (value, user->display_name); -- break; -- case PROP_HOME_DIR: -- g_value_set_string (value, user->home_dir); -- break; -- case PROP_UID: -- g_value_set_ulong (value, user->uid); -- break; -- case PROP_SHELL: -- g_value_set_string (value, user->shell); -- break; -- case PROP_LOGIN_FREQUENCY: -- g_value_set_ulong (value, user->login_frequency); -- break; -- default: -- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); -- break; -- } --} -- --static void - gdm_user_class_init (GdmUserClass *class) - { - GObjectClass *gobject_class; - - gobject_class = G_OBJECT_CLASS (class); - -- gobject_class->set_property = gdm_user_set_property; -- gobject_class->get_property = gdm_user_get_property; - gobject_class->finalize = gdm_user_finalize; - -- g_object_class_install_property (gobject_class, -- PROP_REAL_NAME, -- g_param_spec_string ("real-name", -- "Real Name", -- "The real name to display for this user.", -- NULL, -- G_PARAM_READABLE)); -- -- g_object_class_install_property (gobject_class, -- PROP_DISPLAY_NAME, -- g_param_spec_string ("display-name", -- "Display Name", -- "The unique name to display for this user.", -- NULL, -- G_PARAM_READABLE)); -- -- g_object_class_install_property (gobject_class, -- PROP_UID, -- g_param_spec_ulong ("uid", -- "User ID", -- "The UID for this user.", -- 0, G_MAXULONG, 0, -- G_PARAM_READABLE)); -- g_object_class_install_property (gobject_class, -- PROP_USER_NAME, -- g_param_spec_string ("user-name", -- "User Name", -- "The login name for this user.", -- NULL, -- G_PARAM_READABLE)); -- g_object_class_install_property (gobject_class, -- PROP_HOME_DIR, -- g_param_spec_string ("home-directory", -- "Home Directory", -- "The home directory for this user.", -- NULL, -- G_PARAM_READABLE)); -- g_object_class_install_property (gobject_class, -- PROP_SHELL, -- g_param_spec_string ("shell", -- "Shell", -- "The shell for this user.", -- NULL, -- G_PARAM_READABLE)); -- g_object_class_install_property (gobject_class, -- PROP_LOGIN_FREQUENCY, -- g_param_spec_ulong ("login-frequency", -- "login frequency", -- "login frequency", -- 0, -- G_MAXULONG, -- 0, -- G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); -- -+ signals [CHANGED] = -+ g_signal_new ("changed", -+ G_TYPE_FROM_CLASS (class), -+ G_SIGNAL_RUN_LAST, -+ 0, -+ NULL, NULL, -+ g_cclosure_marshal_VOID__VOID, -+ G_TYPE_NONE, 0); - signals [SESSIONS_CHANGED] = - g_signal_new ("sessions-changed", - G_TYPE_FROM_CLASS (class), -@@ -326,11 +202,12 @@ _gdm_user_update (GdmUser *user, - const struct passwd *pwent) - { - gchar *real_name = NULL; -+ gboolean changed; - - g_return_if_fail (GDM_IS_USER (user)); - g_return_if_fail (pwent != NULL); - -- g_object_freeze_notify (G_OBJECT (user)); -+ changed = FALSE; - - /* Display Name */ - if (pwent->pw_gecos && pwent->pw_gecos[0] != '\0') { -@@ -370,7 +247,7 @@ _gdm_user_update (GdmUser *user, - strcmp (real_name, user->real_name) != 0)) { - g_free (user->real_name); - user->real_name = real_name; -- g_object_notify (G_OBJECT (user), "real-name"); -+ changed = TRUE; - } else { - g_free (real_name); - } -@@ -382,13 +259,13 @@ _gdm_user_update (GdmUser *user, - strncmp (user->real_name, user->display_name, strlen (user->real_name)) != 0)) { - g_free (user->display_name); - user->display_name = NULL; -- g_object_notify (G_OBJECT (user), "display-name"); -+ changed = TRUE; - } - - /* UID */ - if (pwent->pw_uid != user->uid) { - user->uid = pwent->pw_uid; -- g_object_notify (G_OBJECT (user), "uid"); -+ changed = TRUE; - } - - /* Username */ -@@ -399,7 +276,7 @@ _gdm_user_update (GdmUser *user, - strcmp (user->user_name, pwent->pw_name) != 0)) { - g_free (user->user_name); - user->user_name = g_strdup (pwent->pw_name); -- g_object_notify (G_OBJECT (user), "user-name"); -+ changed = TRUE; - } - - /* Home Directory */ -@@ -408,7 +285,7 @@ _gdm_user_update (GdmUser *user, - strcmp (user->home_dir, pwent->pw_dir) != 0) { - g_free (user->home_dir); - user->home_dir = g_strdup (pwent->pw_dir); -- g_object_notify (G_OBJECT (user), "home-directory"); -+ changed = TRUE; - } - - /* Shell */ -@@ -419,10 +296,12 @@ _gdm_user_update (GdmUser *user, - strcmp (user->shell, pwent->pw_shell) != 0)) { - g_free (user->shell); - user->shell = g_strdup (pwent->pw_shell); -- g_object_notify (G_OBJECT (user), "shell"); -+ changed = TRUE; - } - -- g_object_thaw_notify (G_OBJECT (user)); -+ if (changed) { -+ g_signal_emit (user, signals[CHANGED], 0); -+ } - } - - /** -@@ -582,7 +461,7 @@ _gdm_user_show_full_display_name (GdmUser *user) - strcmp (uniq_name, user->display_name) != 0)) { - g_free (user->display_name); - user->display_name = uniq_name; -- g_object_notify (G_OBJECT (user), "display-name"); -+ g_signal_emit (user, signals[CHANGED], 0); - } else { - g_free (uniq_name); - } -@@ -604,7 +483,7 @@ _gdm_user_show_short_display_name (GdmUser *user) - if (user->display_name) { - g_free (user->display_name); - user->display_name = NULL; -- g_object_notify (G_OBJECT (user), "display-name"); -+ g_signal_emit (user, signals[CHANGED], 0); - } - } - -diff --git a/gui/user-switch-applet/applet.c b/gui/user-switch-applet/applet.c -index 5d73283..89c2b69 100644 ---- a/gui/user-switch-applet/applet.c -+++ b/gui/user-switch-applet/applet.c -@@ -80,7 +80,6 @@ typedef struct _GdmAppletData - guint client_notify_lockdown_id; - - guint current_status; -- guint user_icon_changed_id; - guint user_notify_id; - gint8 pixel_size; - gint panel_size; -@@ -482,7 +481,6 @@ gdm_applet_data_free (GdmAppletData *adata) - gconf_client_notify_remove (adata->client, adata->client_notify_lockdown_id); - - g_signal_handler_disconnect (adata->user, adata->user_notify_id); -- g_signal_handler_disconnect (adata->user, adata->user_icon_changed_id); - - #ifdef BUILD_PRESENSE_STUFF - if (adata->presence_proxy != NULL) { -@@ -581,11 +579,12 @@ menuitem_style_set_cb (GtkWidget *menuitem, - } - - static void --user_notify_display_name_cb (GObject *object, -- GParamSpec *pspec, -- GdmAppletData *adata) -+on_user_changed (GdmUser *user, -+ GdmAppletData *adata) - { -+ g_debug ("user changed"); - update_label (adata); -+ reset_icon (adata); - } - - /* Called every time the menu is displayed (and also for some reason -@@ -1283,14 +1282,6 @@ reset_icon (GdmAppletData *adata) - } - - static void --on_user_icon_changed (GdmUser *user, -- GdmAppletData *adata) --{ -- g_debug ("User icon changed"); -- reset_icon (adata); --} -- --static void - setup_current_user (GdmAppletData *adata) - { - const char *name; -@@ -1318,16 +1309,11 @@ setup_current_user (GdmAppletData *adata) - if (adata->user != NULL) { - reset_icon (adata); - -- adata->user_icon_changed_id = -- g_signal_connect (adata->user, -- "icon-changed", -- G_CALLBACK (on_user_icon_changed), -- adata); - adata->user_notify_id = - g_signal_connect (adata->user, -- "notify::display-name", -- G_CALLBACK (user_notify_display_name_cb), -- adata); -+ "changed", -+ G_CALLBACK (on_user_changed), -+ adata); - } - } - --- -1.6.5.2 - - -From 5dfb0d92923bede734900b362745c11744c095ad Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 15 Mar 2010 14:22:47 -0400 -Subject: [PATCH 06/22] drop sessions_changed class member - -We're never going to have a default handler, we aren't -going to have subclasses that need to chain up, so we don't -need the vfunc. ---- - gui/simple-greeter/gdm-user.c | 4 +--- - 1 files changed, 1 insertions(+), 3 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c -index 182ef72..3e0c61a 100644 ---- a/gui/simple-greeter/gdm-user.c -+++ b/gui/simple-greeter/gdm-user.c -@@ -63,8 +63,6 @@ struct _GdmUser { - typedef struct _GdmUserClass - { - GObjectClass parent_class; -- -- void (* sessions_changed) (GdmUser *user); - } GdmUserClass; - - static void gdm_user_finalize (GObject *object); -@@ -158,7 +156,7 @@ gdm_user_class_init (GdmUserClass *class) - g_signal_new ("sessions-changed", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, -- G_STRUCT_OFFSET (GdmUserClass, sessions_changed), -+ 0, - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); --- -1.6.5.2 - - -From a407a2af7ad4cd19bab7daf412d7aab64b6f64a3 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 15 Mar 2010 22:49:55 -0400 -Subject: [PATCH 07/22] Drop get_sessions - -We don't need it now. ---- - gui/simple-greeter/gdm-user.c | 6 ------ - gui/simple-greeter/gdm-user.h | 1 - - 2 files changed, 0 insertions(+), 7 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c -index 3e0c61a..dff394a 100644 ---- a/gui/simple-greeter/gdm-user.c -+++ b/gui/simple-greeter/gdm-user.c -@@ -129,12 +129,6 @@ gdm_user_get_num_sessions (GdmUser *user) - return g_list_length (user->sessions); - } - --GList * --gdm_user_get_sessions (GdmUser *user) --{ -- return user->sessions; --} -- - static void - gdm_user_class_init (GdmUserClass *class) - { -diff --git a/gui/simple-greeter/gdm-user.h b/gui/simple-greeter/gdm-user.h -index 3e448dd..f871a5d 100644 ---- a/gui/simple-greeter/gdm-user.h -+++ b/gui/simple-greeter/gdm-user.h -@@ -46,7 +46,6 @@ G_CONST_RETURN char *gdm_user_get_display_name (GdmUser *user); - G_CONST_RETURN char *gdm_user_get_home_directory (GdmUser *user); - G_CONST_RETURN char *gdm_user_get_shell (GdmUser *user); - guint gdm_user_get_num_sessions (GdmUser *user); --GList *gdm_user_get_sessions (GdmUser *user); - gboolean gdm_user_is_logged_in (GdmUser *user); - gulong gdm_user_get_login_frequency (GdmUser *user); - G_CONST_RETURN char *gdm_user_get_primary_session_id (GdmUser *user); --- -1.6.5.2 - - -From 2f734941bcaaf095cbe2e46663d07aff51276c2b Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 15 Mar 2010 22:59:02 -0400 -Subject: [PATCH 08/22] Drop get_shell and get_home_directory - -They aren't used, so let's cull them. ---- - gui/simple-greeter/gdm-user.c | 60 ----------------------------------------- - gui/simple-greeter/gdm-user.h | 2 - - 2 files changed, 0 insertions(+), 62 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c -index dff394a..465c55f 100644 ---- a/gui/simple-greeter/gdm-user.c -+++ b/gui/simple-greeter/gdm-user.c -@@ -271,26 +271,6 @@ _gdm_user_update (GdmUser *user, - changed = TRUE; - } - -- /* Home Directory */ -- if ((pwent->pw_dir && !user->home_dir) || -- (!pwent->pw_dir && user->home_dir) || -- strcmp (user->home_dir, pwent->pw_dir) != 0) { -- g_free (user->home_dir); -- user->home_dir = g_strdup (pwent->pw_dir); -- changed = TRUE; -- } -- -- /* Shell */ -- if ((pwent->pw_shell && !user->shell) || -- (!pwent->pw_shell && user->shell) || -- (pwent->pw_shell && -- user->shell && -- strcmp (user->shell, pwent->pw_shell) != 0)) { -- g_free (user->shell); -- user->shell = g_strdup (pwent->pw_shell); -- changed = TRUE; -- } -- - if (changed) { - g_signal_emit (user, signals[CHANGED], 0); - } -@@ -375,46 +355,6 @@ gdm_user_get_user_name (GdmUser *user) - return user->user_name; - } - --/** -- * gdm_user_get_home_directory: -- * @user: the user object to examine. -- * -- * Retrieves the home directory of @user. -- * -- * Returns: a pointer to an array of characters which must not be modified or -- * freed, or %NULL. -- * -- * Since: 1.0 -- **/ -- --G_CONST_RETURN gchar * --gdm_user_get_home_directory (GdmUser *user) --{ -- g_return_val_if_fail (GDM_IS_USER (user), NULL); -- -- return user->home_dir; --} -- --/** -- * gdm_user_get_shell: -- * @user: the user object to examine. -- * -- * Retrieves the login shell of @user. -- * -- * Returns: a pointer to an array of characters which must not be modified or -- * freed, or %NULL. -- * -- * Since: 1.0 -- **/ -- --G_CONST_RETURN gchar * --gdm_user_get_shell (GdmUser *user) --{ -- g_return_val_if_fail (GDM_IS_USER (user), NULL); -- -- return user->shell; --} -- - gulong - gdm_user_get_login_frequency (GdmUser *user) - { -diff --git a/gui/simple-greeter/gdm-user.h b/gui/simple-greeter/gdm-user.h -index f871a5d..6b51ffb 100644 ---- a/gui/simple-greeter/gdm-user.h -+++ b/gui/simple-greeter/gdm-user.h -@@ -43,8 +43,6 @@ uid_t gdm_user_get_uid (GdmUser *user); - G_CONST_RETURN char *gdm_user_get_user_name (GdmUser *user); - G_CONST_RETURN char *gdm_user_get_real_name (GdmUser *user); - G_CONST_RETURN char *gdm_user_get_display_name (GdmUser *user); --G_CONST_RETURN char *gdm_user_get_home_directory (GdmUser *user); --G_CONST_RETURN char *gdm_user_get_shell (GdmUser *user); - guint gdm_user_get_num_sessions (GdmUser *user); - gboolean gdm_user_is_logged_in (GdmUser *user); - gulong gdm_user_get_login_frequency (GdmUser *user); --- -1.6.5.2 - - -From ab2ca579a1e7b5dc468d020f67ceb97f65f4253a Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 15 Mar 2010 23:03:09 -0400 -Subject: [PATCH 09/22] drop loading-users signal - -No one listens for it, so there's no point in having it. ---- - gui/simple-greeter/gdm-user-manager.c | 10 ---------- - gui/simple-greeter/gdm-user-manager.h | 1 - - 2 files changed, 0 insertions(+), 11 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index aadb147..69787fa 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -101,7 +101,6 @@ struct GdmUserManagerPrivate - }; - - enum { -- LOADING_USERS, - USERS_LOADED, - USER_ADDED, - USER_REMOVED, -@@ -1499,7 +1498,6 @@ queue_reload_users (GdmUserManager *manager) - return; - } - -- g_signal_emit (G_OBJECT (manager), signals[LOADING_USERS], 0); - manager->priv->reload_id = g_idle_add ((GSourceFunc)reload_users_timeout, manager); - } - -@@ -1565,14 +1563,6 @@ gdm_user_manager_class_init (GdmUserManagerClass *klass) - - object_class->finalize = gdm_user_manager_finalize; - -- signals [LOADING_USERS] = -- g_signal_new ("loading-users", -- G_TYPE_FROM_CLASS (klass), -- G_SIGNAL_RUN_LAST, -- G_STRUCT_OFFSET (GdmUserManagerClass, loading_users), -- NULL, NULL, -- g_cclosure_marshal_VOID__VOID, -- G_TYPE_NONE, 0); - signals [USERS_LOADED] = - g_signal_new ("users-loaded", - G_TYPE_FROM_CLASS (klass), -diff --git a/gui/simple-greeter/gdm-user-manager.h b/gui/simple-greeter/gdm-user-manager.h -index b2d0019..ffccea1 100644 ---- a/gui/simple-greeter/gdm-user-manager.h -+++ b/gui/simple-greeter/gdm-user-manager.h -@@ -46,7 +46,6 @@ typedef struct - { - GObjectClass parent_class; - -- void (* loading_users) (GdmUserManager *user_manager); - void (* users_loaded) (GdmUserManager *user_manager); - void (* user_added) (GdmUserManager *user_manager, - GdmUser *user); --- -1.6.5.2 - - -From 59b9a9e2bfe86602e755adb490225cb3cbb5c654 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 15 Mar 2010 23:30:01 -0400 -Subject: [PATCH 10/22] Drop "user-login-frequency-changed" signal in favor of "changed" - -It's less specific and will let us handle the other properties changes -at the same time. ---- - gui/simple-greeter/gdm-user-chooser-widget.c | 58 ++++++++++++++++++++------ - gui/simple-greeter/gdm-user-manager.c | 40 +++++++++++++++--- - gui/simple-greeter/gdm-user-manager.h | 2 +- - gui/simple-greeter/gdm-user-private.h | 4 ++ - gui/simple-greeter/gdm-user.c | 22 ++++++++++ - 5 files changed, 106 insertions(+), 20 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c -index 9658c2b..7d2f64e 100644 ---- a/gui/simple-greeter/gdm-user-chooser-widget.c -+++ b/gui/simple-greeter/gdm-user-chooser-widget.c -@@ -461,21 +461,53 @@ on_user_is_logged_in_changed (GdmUserManager *manager, - } - - static void --on_user_login_frequency_changed (GdmUserManager *manager, -- GdmUser *user, -- GdmUserChooserWidget *widget) -+on_user_changed (GdmUserManager *manager, -+ GdmUser *user, -+ GdmUserChooserWidget *widget) - { -- const char *user_name; -- gulong freq; -+ GdkPixbuf *pixbuf; -+ char *tooltip; -+ gboolean is_logged_in; -+ int size; - -- g_debug ("GdmUserChooserWidget: User login frequency changed: %s", gdm_user_get_user_name (user)); -+ /* wait for all users to be loaded */ -+ if (! widget->priv->loaded) { -+ return; -+ } -+ if (! widget->priv->show_normal_users) { -+ return; -+ } - -- user_name = gdm_user_get_user_name (user); -- freq = gdm_user_get_login_frequency (user); -+ size = get_icon_height_for_widget (GTK_WIDGET (widget)); -+ pixbuf = gdm_user_render_icon (user, size); - -- gdm_chooser_widget_set_item_priority (GDM_CHOOSER_WIDGET (widget), -- user_name, -- freq); -+ if (pixbuf == NULL && widget->priv->stock_person_pixbuf != NULL) { -+ pixbuf = g_object_ref (widget->priv->stock_person_pixbuf); -+ } -+ -+ tooltip = g_strdup_printf (_("Log in as %s"), -+ gdm_user_get_user_name (user)); -+ -+ is_logged_in = gdm_user_is_logged_in (user); -+ -+ g_debug ("GdmUserChooserWidget: User added name:%s logged-in:%d pixbuf:%p", -+ gdm_user_get_user_name (user), -+ is_logged_in, -+ pixbuf); -+ -+ gdm_chooser_widget_update_item (GDM_CHOOSER_WIDGET (widget), -+ gdm_user_get_user_name (user), -+ pixbuf, -+ gdm_user_get_display_name (user), -+ tooltip, -+ gdm_user_get_login_frequency (user), -+ is_logged_in, -+ FALSE); -+ g_free (tooltip); -+ -+ if (pixbuf != NULL) { -+ g_object_unref (pixbuf); -+ } - } - - static void -@@ -526,8 +558,8 @@ load_users (GdmUserChooserWidget *widget) - G_CALLBACK (on_user_is_logged_in_changed), - widget); - g_signal_connect (widget->priv->manager, -- "user-login-frequency-changed", -- G_CALLBACK (on_user_login_frequency_changed), -+ "user-changed", -+ G_CALLBACK (on_user_changed), - widget); - } else { - gdm_chooser_widget_loaded (GDM_CHOOSER_WIDGET (widget)); -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index 69787fa..375f21e 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -105,7 +105,7 @@ enum { - USER_ADDED, - USER_REMOVED, - USER_IS_LOGGED_IN_CHANGED, -- USER_LOGIN_FREQUENCY_CHANGED, -+ USER_CHANGED, - LAST_SIGNAL - }; - -@@ -115,6 +115,10 @@ static void gdm_user_manager_class_init (GdmUserManagerClass *klass); - static void gdm_user_manager_init (GdmUserManager *user_manager); - static void gdm_user_manager_finalize (GObject *object); - -+static gboolean match_real_name_hrfunc (gpointer key, -+ gpointer value, -+ gpointer user); -+ - static gpointer user_manager_object = NULL; - - G_DEFINE_TYPE (GdmUserManager, gdm_user_manager, G_TYPE_OBJECT) -@@ -441,6 +445,27 @@ on_user_sessions_changed (GdmUser *user, - g_signal_emit (manager, signals [USER_IS_LOGGED_IN_CHANGED], 0, user); - } - -+static void -+on_user_changed (GdmUser *user, -+ GdmUserManager *manager) -+{ -+ GdmUser *dup; -+ -+ g_debug ("GdmUserManager: user changed"); -+ -+ dup = g_hash_table_find (manager->priv->users, -+ match_real_name_hrfunc, -+ user); -+ if (dup != NULL) { -+ _gdm_user_show_full_display_name (user); -+ _gdm_user_show_full_display_name (dup); -+ } else { -+ _gdm_user_show_short_display_name (user); -+ } -+ -+ g_signal_emit (manager, signals[USER_CHANGED], 0, user); -+} -+ - static char * - get_seat_id_for_session (DBusGConnection *connection, - const char *session_id) -@@ -687,6 +712,10 @@ create_user (GdmUserManager *manager) - "sessions-changed", - G_CALLBACK (on_user_sessions_changed), - manager); -+ g_signal_connect (user, -+ "changed", -+ G_CALLBACK (on_user_changed), -+ manager); - return user; - } - -@@ -1198,8 +1227,7 @@ process_ck_history_line (GdmUserManager *manager, - return; - } - -- g_object_set (user, "login-frequency", frequency, NULL); -- g_signal_emit (manager, signals [USER_LOGIN_FREQUENCY_CHANGED], 0, user); -+ _gdm_user_update_login_frequency (user, frequency); - g_free (username); - } - -@@ -1595,11 +1623,11 @@ gdm_user_manager_class_init (GdmUserManagerClass *klass) - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, GDM_TYPE_USER); -- signals [USER_LOGIN_FREQUENCY_CHANGED] = -- g_signal_new ("user-login-frequency-changed", -+ signals [USER_CHANGED] = -+ g_signal_new ("user-changed", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, -- G_STRUCT_OFFSET (GdmUserManagerClass, user_login_frequency_changed), -+ G_STRUCT_OFFSET (GdmUserManagerClass, user_changed), - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, GDM_TYPE_USER); -diff --git a/gui/simple-greeter/gdm-user-manager.h b/gui/simple-greeter/gdm-user-manager.h -index ffccea1..79fac06 100644 ---- a/gui/simple-greeter/gdm-user-manager.h -+++ b/gui/simple-greeter/gdm-user-manager.h -@@ -53,7 +53,7 @@ typedef struct - GdmUser *user); - void (* user_is_logged_in_changed) (GdmUserManager *user_manager, - GdmUser *user); -- void (* user_login_frequency_changed) (GdmUserManager *user_manager, -+ void (* user_changed) (GdmUserManager *user_manager, - GdmUser *user); - } GdmUserManagerClass; - -diff --git a/gui/simple-greeter/gdm-user-private.h b/gui/simple-greeter/gdm-user-private.h -index 79cdcf4..b16547a 100644 ---- a/gui/simple-greeter/gdm-user-private.h -+++ b/gui/simple-greeter/gdm-user-private.h -@@ -32,6 +32,10 @@ G_BEGIN_DECLS - - void _gdm_user_update (GdmUser *user, - const struct passwd *pwent); -+ -+void _gdm_user_update_login_frequency (GdmUser *user, -+ guint64 login_frequency); -+ - void _gdm_user_add_session (GdmUser *user, - const char *session_id); - void _gdm_user_remove_session (GdmUser *user, -diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c -index 465c55f..4bb2b78 100644 ---- a/gui/simple-greeter/gdm-user.c -+++ b/gui/simple-greeter/gdm-user.c -@@ -277,6 +277,28 @@ _gdm_user_update (GdmUser *user, - } - - /** -+ * _gdm_user_update_login_frequency: -+ * @user: the user object to update -+ * -+ * Updates the login frequency of @user -+ * -+ * Since: 1.0 -+ **/ -+void -+_gdm_user_update_login_frequency (GdmUser *user, -+ guint64 login_frequency) -+{ -+ g_return_if_fail (GDM_IS_USER (user)); -+ -+ if (login_frequency == user->login_frequency) { -+ return; -+ } -+ -+ user->login_frequency = login_frequency; -+ g_signal_emit (user, signals[CHANGED], 0); -+} -+ -+/** - * gdm_user_get_uid: - * @user: the user object to examine. - * --- -1.6.5.2 - - -From 8bf6c0686c680cb413e78245ca40d53526390d7a Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 15 Mar 2010 23:47:16 -0400 -Subject: [PATCH 11/22] include settings-client.h to silence warning - ---- - gui/simple-greeter/gdm-user-manager.c | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index 375f21e..f2b4332 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -47,6 +47,7 @@ - #include "gdm-user-manager.h" - #include "gdm-user-private.h" - #include "gdm-settings-keys.h" -+#include "gdm-settings-client.h" - - #define GDM_USER_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_USER_MANAGER, GdmUserManagerPrivate)) - --- -1.6.5.2 - - -From 70232fcc80fa1007efe6061f0e83425ca99879e2 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 15 Mar 2010 23:51:22 -0400 -Subject: [PATCH 12/22] Rename users hashtable to user_by_name - -This will lend us the flexibility to index -users by other criteria later. ---- - gui/simple-greeter/gdm-user-manager.c | 34 ++++++++++++++++---------------- - 1 files changed, 17 insertions(+), 17 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index f2b4332..9f88e99 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -81,7 +81,7 @@ - - struct GdmUserManagerPrivate - { -- GHashTable *users; -+ GHashTable *users_by_name; - GHashTable *sessions; - GHashTable *shells; - DBusGConnection *connection; -@@ -454,7 +454,7 @@ on_user_changed (GdmUser *user, - - g_debug ("GdmUserManager: user changed"); - -- dup = g_hash_table_find (manager->priv->users, -+ dup = g_hash_table_find (manager->priv->users_by_name, - match_real_name_hrfunc, - user); - if (dup != NULL) { -@@ -746,14 +746,14 @@ add_user (GdmUserManager *manager, - GdmUser *dup; - - add_sessions_for_user (manager, user); -- dup = g_hash_table_find (manager->priv->users, -+ dup = g_hash_table_find (manager->priv->users_by_name, - match_real_name_hrfunc, - user); - if (dup != NULL) { - _gdm_user_show_full_display_name (user); - _gdm_user_show_full_display_name (dup); - } -- g_hash_table_insert (manager->priv->users, -+ g_hash_table_insert (manager->priv->users_by_name, - g_strdup (gdm_user_get_user_name (user)), - g_object_ref (user)); - -@@ -904,7 +904,7 @@ seat_session_added (DBusGProxy *seat_proxy, - return; - } - -- user = g_hash_table_lookup (manager->priv->users, pwent->pw_name); -+ user = g_hash_table_lookup (manager->priv->users_by_name, pwent->pw_name); - if (user == NULL) { - g_debug ("Creating new user"); - -@@ -945,7 +945,7 @@ seat_session_removed (DBusGProxy *seat_proxy, - return; - } - -- user = g_hash_table_lookup (manager->priv->users, username); -+ user = g_hash_table_lookup (manager->priv->users_by_name, username); - if (user == NULL) { - /* nothing to do */ - return; -@@ -1052,7 +1052,7 @@ gdm_user_manager_get_user (GdmUserManager *manager, - g_return_val_if_fail (GDM_IS_USER_MANAGER (manager), NULL); - g_return_val_if_fail (username != NULL && username[0] != '\0', NULL); - -- user = g_hash_table_lookup (manager->priv->users, username); -+ user = g_hash_table_lookup (manager->priv->users_by_name, username); - - if (user == NULL) { - struct passwd *pwent; -@@ -1082,7 +1082,7 @@ gdm_user_manager_get_user_by_uid (GdmUserManager *manager, - return NULL; - } - -- user = g_hash_table_lookup (manager->priv->users, pwent->pw_name); -+ user = g_hash_table_lookup (manager->priv->users_by_name, pwent->pw_name); - - if (user == NULL) { - user = add_new_user_for_pwent (manager, pwent); -@@ -1109,7 +1109,7 @@ gdm_user_manager_list_users (GdmUserManager *manager) - g_return_val_if_fail (GDM_IS_USER_MANAGER (manager), NULL); - - retval = NULL; -- g_hash_table_foreach (manager->priv->users, listify_hash_values_hfunc, &retval); -+ g_hash_table_foreach (manager->priv->users_by_name, listify_hash_values_hfunc, &retval); - - return g_slist_sort (retval, (GCompareFunc) gdm_user_collate); - } -@@ -1399,7 +1399,7 @@ reload_passwd (GdmUserManager *manager) - goto out; - } - -- g_hash_table_foreach (manager->priv->users, listify_hash_values_hfunc, &old_users); -+ g_hash_table_foreach (manager->priv->users_by_name, listify_hash_values_hfunc, &old_users); - g_slist_foreach (old_users, (GFunc) g_object_ref, NULL); - - /* Make sure we keep users who are logged in no matter what. */ -@@ -1442,7 +1442,7 @@ reload_passwd (GdmUserManager *manager) - continue; - } - -- user = g_hash_table_lookup (manager->priv->users, -+ user = g_hash_table_lookup (manager->priv->users_by_name, - pwent->pw_name); - - /* Update users already in the *new* list */ -@@ -1469,7 +1469,7 @@ reload_passwd (GdmUserManager *manager) - for (list = old_users; list; list = list->next) { - if (! g_slist_find (new_users, list->data)) { - g_signal_emit (manager, signals[USER_REMOVED], 0, list->data); -- g_hash_table_remove (manager->priv->users, -+ g_hash_table_remove (manager->priv->users_by_name, - gdm_user_get_user_name (list->data)); - } - } -@@ -1693,10 +1693,10 @@ gdm_user_manager_init (GdmUserManager *manager) - g_free); - - /* users */ -- manager->priv->users = g_hash_table_new_full (g_str_hash, -- g_str_equal, -- g_free, -- (GDestroyNotify) g_object_run_dispose); -+ manager->priv->users_by_name = g_hash_table_new_full (g_str_hash, -+ g_str_equal, -+ g_free, -+ (GDestroyNotify) g_object_run_dispose); - - if (manager->priv->include_all == TRUE) { - /* /etc/shells */ -@@ -1784,7 +1784,7 @@ gdm_user_manager_finalize (GObject *object) - g_hash_table_destroy (manager->priv->sessions); - - g_file_monitor_cancel (manager->priv->passwd_monitor); -- g_hash_table_destroy (manager->priv->users); -+ g_hash_table_destroy (manager->priv->users_by_name); - - g_file_monitor_cancel (manager->priv->shells_monitor); - g_hash_table_destroy (manager->priv->shells); --- -1.6.5.2 - - -From 7bada6caaeabe92eb00eb7edc6d602c6ee01c396 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Tue, 16 Mar 2010 00:20:38 -0400 -Subject: [PATCH 13/22] move local user monitoring code to its own function - -It was open coded in _init before. ---- - gui/simple-greeter/gdm-user-manager.c | 92 ++++++++++++++++++--------------- - 1 files changed, 50 insertions(+), 42 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index 9f88e99..8c97c0a 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -1586,6 +1586,55 @@ on_passwd_monitor_changed (GFileMonitor *monitor, - } - - static void -+monitor_local_users (GdmUserManager *manager) -+{ -+ GFile *file; -+ GError *error; -+ -+ g_debug ("Monitoring local users"); -+ -+ /* /etc/shells */ -+ manager->priv->shells = g_hash_table_new_full (g_str_hash, -+ g_str_equal, -+ g_free, -+ NULL); -+ reload_shells (manager); -+ file = g_file_new_for_path (_PATH_SHELLS); -+ error = NULL; -+ manager->priv->shells_monitor = g_file_monitor_file (file, -+ G_FILE_MONITOR_NONE, -+ NULL, -+ &error); -+ if (manager->priv->shells_monitor != NULL) { -+ g_signal_connect (manager->priv->shells_monitor, -+ "changed", -+ G_CALLBACK (on_shells_monitor_changed), -+ manager); -+ } else { -+ g_warning ("Unable to monitor %s: %s", _PATH_SHELLS, error->message); -+ g_error_free (error); -+ } -+ g_object_unref (file); -+ -+ /* /etc/passwd */ -+ file = g_file_new_for_path (PATH_PASSWD); -+ manager->priv->passwd_monitor = g_file_monitor_file (file, -+ G_FILE_MONITOR_NONE, -+ NULL, -+ &error); -+ if (manager->priv->passwd_monitor != NULL) { -+ g_signal_connect (manager->priv->passwd_monitor, -+ "changed", -+ G_CALLBACK (on_passwd_monitor_changed), -+ manager); -+ } else { -+ g_warning ("Unable to monitor %s: %s", PATH_PASSWD, error->message); -+ g_error_free (error); -+ } -+ g_object_unref (file); -+} -+ -+static void - gdm_user_manager_class_init (GdmUserManagerClass *klass) - { - GObjectClass *object_class = G_OBJECT_CLASS (klass); -@@ -1664,9 +1713,6 @@ gdm_set_string_list (char *value, GSList **retval) - static void - gdm_user_manager_init (GdmUserManager *manager) - { -- int i; -- GFile *file; -- GError *error; - char *temp; - gboolean res; - -@@ -1699,45 +1745,7 @@ gdm_user_manager_init (GdmUserManager *manager) - (GDestroyNotify) g_object_run_dispose); - - if (manager->priv->include_all == TRUE) { -- /* /etc/shells */ -- manager->priv->shells = g_hash_table_new_full (g_str_hash, -- g_str_equal, -- g_free, -- NULL); -- reload_shells (manager); -- file = g_file_new_for_path (_PATH_SHELLS); -- error = NULL; -- manager->priv->shells_monitor = g_file_monitor_file (file, -- G_FILE_MONITOR_NONE, -- NULL, -- &error); -- if (manager->priv->shells_monitor != NULL) { -- g_signal_connect (manager->priv->shells_monitor, -- "changed", -- G_CALLBACK (on_shells_monitor_changed), -- manager); -- } else { -- g_warning ("Unable to monitor %s: %s", _PATH_SHELLS, error->message); -- g_error_free (error); -- } -- g_object_unref (file); -- -- /* /etc/passwd */ -- file = g_file_new_for_path (PATH_PASSWD); -- manager->priv->passwd_monitor = g_file_monitor_file (file, -- G_FILE_MONITOR_NONE, -- NULL, -- &error); -- if (manager->priv->passwd_monitor != NULL) { -- g_signal_connect (manager->priv->passwd_monitor, -- "changed", -- G_CALLBACK (on_passwd_monitor_changed), -- manager); -- } else { -- g_warning ("Unable to monitor %s: %s", PATH_PASSWD, error->message); -- g_error_free (error); -- } -- g_object_unref (file); -+ monitor_local_users (manager); - } - - get_seat_proxy (manager); --- -1.6.5.2 - - -From ddc1fd619e022a91fdefbf2e6620b33b8f723df2 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Tue, 16 Mar 2010 00:25:17 -0400 -Subject: [PATCH 14/22] rearrange gdm_user_collate - -This way we don't make unnecessary assignments ---- - gui/simple-greeter/gdm-user.c | 24 ++++++++++++------------ - 1 files changed, 12 insertions(+), 12 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c -index 4bb2b78..dd10f91 100644 ---- a/gui/simple-greeter/gdm-user.c -+++ b/gui/simple-greeter/gdm-user.c -@@ -453,18 +453,6 @@ gdm_user_collate (GdmUser *user1, - g_return_val_if_fail (GDM_IS_USER (user1), 0); - g_return_val_if_fail (GDM_IS_USER (user2), 0); - -- if (user1->real_name != NULL) { -- str1 = user1->real_name; -- } else { -- str1 = user1->user_name; -- } -- -- if (user2->real_name != NULL) { -- str2 = user2->real_name; -- } else { -- str2 = user2->user_name; -- } -- - num1 = user1->login_frequency; - num2 = user2->login_frequency; - g_debug ("Login freq 1=%u 2=%u", (guint)num1, (guint)num2); -@@ -477,6 +465,18 @@ gdm_user_collate (GdmUser *user1, - } - - /* if login frequency is equal try names */ -+ if (user1->real_name != NULL) { -+ str1 = user1->real_name; -+ } else { -+ str1 = user1->user_name; -+ } -+ -+ if (user2->real_name != NULL) { -+ str2 = user2->real_name; -+ } else { -+ str2 = user2->user_name; -+ } -+ - if (str1 == NULL && str2 != NULL) { - return -1; - } --- -1.6.5.2 - - -From a6df273f4c2226444a2dfbbaea52a8a47f7e1309 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Tue, 16 Mar 2010 00:33:48 -0400 -Subject: [PATCH 15/22] Drop get_filesystem_type - -It's unused code. ---- - gui/simple-greeter/gdm-user.c | 33 --------------------------------- - 1 files changed, 0 insertions(+), 33 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c -index dd10f91..9a75274 100644 ---- a/gui/simple-greeter/gdm-user.c -+++ b/gui/simple-greeter/gdm-user.c -@@ -523,39 +523,6 @@ check_user_file (const char *filename, - return TRUE; - } - --static char * --get_filesystem_type (const char *path) --{ -- GFile *file; -- GFileInfo *file_info; -- GError *error; -- char *filesystem_type; -- -- file = g_file_new_for_path (path); -- error = NULL; -- file_info = g_file_query_filesystem_info (file, -- G_FILE_ATTRIBUTE_FILESYSTEM_TYPE, -- NULL, -- &error); -- if (file_info == NULL) { -- g_warning ("Unable to query filesystem type for %s: %s", path, error->message); -- g_error_free (error); -- g_object_unref (file); -- return NULL; -- } -- -- filesystem_type = g_strdup (g_file_info_get_attribute_string (file_info, -- G_FILE_ATTRIBUTE_FILESYSTEM_TYPE)); -- if (filesystem_type == NULL) { -- g_warning ("GIO returned NULL filesystem type for %s", path); -- } -- -- g_object_unref (file); -- g_object_unref (file_info); -- -- return filesystem_type; --} -- - static GdkPixbuf * - render_icon_from_cache (GdmUser *user, - int icon_size) --- -1.6.5.2 - - -From 8abc93ba8da0bdfc8ea99f33174ef18c0e626bc9 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Tue, 16 Mar 2010 00:41:13 -0400 -Subject: [PATCH 16/22] Get dbus connection outside of get_seat_proxy - -While having a connection is a prerequisite for get_seat_proxy, -it could potentially be useful for other purposes, so move it -out. ---- - gui/simple-greeter/gdm-user-manager.c | 28 ++++++++++++++++------------ - 1 files changed, 16 insertions(+), 12 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index 8c97c0a..cec9b1e 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -972,18 +972,6 @@ get_seat_proxy (GdmUserManager *manager) - - g_assert (manager->priv->seat_proxy == NULL); - -- error = NULL; -- manager->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); -- if (manager->priv->connection == NULL) { -- if (error != NULL) { -- g_warning ("Failed to connect to the D-Bus daemon: %s", error->message); -- g_error_free (error); -- } else { -- g_warning ("Failed to connect to the D-Bus daemon"); -- } -- return; -- } -- - manager->priv->seat_id = get_current_seat_id (manager->priv->connection); - if (manager->priv->seat_id == NULL) { - return; -@@ -1714,6 +1702,7 @@ static void - gdm_user_manager_init (GdmUserManager *manager) - { - char *temp; -+ GError *error; - gboolean res; - - manager->priv = GDM_USER_MANAGER_GET_PRIVATE (manager); -@@ -1748,6 +1737,21 @@ gdm_user_manager_init (GdmUserManager *manager) - monitor_local_users (manager); - } - -+ -+ g_assert (manager->priv->seat_proxy == NULL); -+ -+ error = NULL; -+ manager->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); -+ if (manager->priv->connection == NULL) { -+ if (error != NULL) { -+ g_warning ("Failed to connect to the D-Bus daemon: %s", error->message); -+ g_error_free (error); -+ } else { -+ g_warning ("Failed to connect to the D-Bus daemon"); -+ } -+ return; -+ } -+ - get_seat_proxy (manager); - - queue_reload_users (manager); --- -1.6.5.2 - - -From d1470adb6df929da7d801b041b5ef3a62252c39e Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Tue, 16 Mar 2010 00:53:30 -0400 -Subject: [PATCH 17/22] Rename on_proxy_destroy to on_seat_proxy_destroy - ---- - gui/simple-greeter/gdm-user-manager.c | 6 +++--- - 1 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index cec9b1e..8778043 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -956,8 +956,8 @@ seat_session_removed (DBusGProxy *seat_proxy, - } - - static void --on_proxy_destroy (DBusGProxy *proxy, -- GdmUserManager *manager) -+on_seat_proxy_destroy (DBusGProxy *proxy, -+ GdmUserManager *manager) - { - g_debug ("GdmUserManager: seat proxy destroyed"); - -@@ -997,7 +997,7 @@ get_seat_proxy (GdmUserManager *manager) - return; - } - -- g_signal_connect (proxy, "destroy", G_CALLBACK (on_proxy_destroy), manager); -+ g_signal_connect (proxy, "destroy", G_CALLBACK (on_seat_proxy_destroy), manager); - - dbus_g_proxy_add_signal (proxy, - "SessionAdded", --- -1.6.5.2 - - -From 8937a1e0f2e2f4361b5414f57d445e34dbd6ff67 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Tue, 16 Mar 2010 01:11:27 -0400 -Subject: [PATCH 18/22] Drop unused defines - ---- - gui/simple-greeter/gdm-user-manager.c | 3 --- - 1 files changed, 0 insertions(+), 3 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index 8778043..a029bdb 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -61,9 +61,6 @@ - #define CK_SESSION_INTERFACE "org.freedesktop.ConsoleKit.Session" - - /* Prefs Defaults */ --#define DEFAULT_ALLOW_ROOT TRUE --#define DEFAULT_MAX_ICON_SIZE 128 --#define DEFAULT_USER_MAX_FILE 65536 - - #ifdef __sun - #define DEFAULT_MINIMAL_UID 100 --- -1.6.5.2 - - -From 94328aa66bfda7dbcced49122b76ea5c56b79e0e Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Tue, 16 Mar 2010 02:44:28 -0400 -Subject: [PATCH 19/22] rename update to update_from_pwent - -it's less ambiguous ---- - gui/simple-greeter/gdm-user-manager.c | 8 ++++---- - gui/simple-greeter/gdm-user-private.h | 4 ++-- - gui/simple-greeter/gdm-user.c | 6 +++--- - 3 files changed, 9 insertions(+), 9 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index a029bdb..c9954bd 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -766,7 +766,7 @@ add_new_user_for_pwent (GdmUserManager *manager, - g_debug ("Creating new user"); - - user = create_user (manager); -- _gdm_user_update (user, pwent); -+ _gdm_user_update_from_pwent (user, pwent); - - add_user (manager, user); - -@@ -906,7 +906,7 @@ seat_session_added (DBusGProxy *seat_proxy, - g_debug ("Creating new user"); - - user = create_user (manager); -- _gdm_user_update (user, pwent); -+ _gdm_user_update_from_pwent (user, pwent); - is_new = TRUE; - } else { - is_new = FALSE; -@@ -1432,7 +1432,7 @@ reload_passwd (GdmUserManager *manager) - - /* Update users already in the *new* list */ - if (g_slist_find (new_users, user)) { -- _gdm_user_update (user, pwent); -+ _gdm_user_update_from_pwent (user, pwent); - continue; - } - -@@ -1444,7 +1444,7 @@ reload_passwd (GdmUserManager *manager) - - /* Freeze & update users not already in the new list */ - g_object_freeze_notify (G_OBJECT (user)); -- _gdm_user_update (user, pwent); -+ _gdm_user_update_from_pwent (user, pwent); - - new_users = g_slist_prepend (new_users, user); - } -diff --git a/gui/simple-greeter/gdm-user-private.h b/gui/simple-greeter/gdm-user-private.h -index b16547a..6b1fe47 100644 ---- a/gui/simple-greeter/gdm-user-private.h -+++ b/gui/simple-greeter/gdm-user-private.h -@@ -30,8 +30,8 @@ - - G_BEGIN_DECLS - --void _gdm_user_update (GdmUser *user, -- const struct passwd *pwent); -+void _gdm_user_update_from_pwent (GdmUser *user, -+ const struct passwd *pwent); - - void _gdm_user_update_login_frequency (GdmUser *user, - guint64 login_frequency); -diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c -index 9a75274..7901fb0 100644 ---- a/gui/simple-greeter/gdm-user.c -+++ b/gui/simple-greeter/gdm-user.c -@@ -181,7 +181,7 @@ gdm_user_finalize (GObject *object) - } - - /** -- * _gdm_user_update: -+ * _gdm_user_update_from_pwent: - * @user: the user object to update. - * @pwent: the user data to use. - * -@@ -190,8 +190,8 @@ gdm_user_finalize (GObject *object) - * Since: 1.0 - **/ - void --_gdm_user_update (GdmUser *user, -- const struct passwd *pwent) -+_gdm_user_update_from_pwent (GdmUser *user, -+ const struct passwd *pwent) - { - gchar *real_name = NULL; - gboolean changed; --- -1.6.5.2 - - -From 55d5dcc3f47937496f5a3ca092a9ddd988204e49 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Tue, 16 Mar 2010 03:06:37 -0400 -Subject: [PATCH 20/22] drop dirty user - ---- - gui/simple-greeter/gdm-user-manager.c | 4 ---- - 1 files changed, 0 insertions(+), 4 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index c9954bd..13533ca 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -94,8 +94,6 @@ struct GdmUserManagerPrivate - - guint reload_id; - guint ck_history_id; -- -- guint8 users_dirty : 1; - }; - - enum { -@@ -1752,8 +1750,6 @@ gdm_user_manager_init (GdmUserManager *manager) - get_seat_proxy (manager); - - queue_reload_users (manager); -- -- manager->priv->users_dirty = FALSE; - } - - static void --- -1.6.5.2 - - -From 19210562f5845caa2e54db45bece8d018d768427 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Tue, 16 Mar 2010 03:07:19 -0400 -Subject: [PATCH 21/22] Get users from account service, fallback to old way - ---- - gui/simple-greeter/gdm-user-manager.c | 310 +++++++++++++++++++++++++++------ - gui/simple-greeter/gdm-user.c | 278 ++++++++++++++++++++++------- - gui/simple-greeter/gdm-user.h | 4 + - gui/user-switch-applet/applet.c | 7 +- - 4 files changed, 477 insertions(+), 122 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -index 13533ca..3eaf231 100644 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ b/gui/simple-greeter/gdm-user-manager.c -@@ -63,9 +63,9 @@ - /* Prefs Defaults */ - - #ifdef __sun --#define DEFAULT_MINIMAL_UID 100 -+#define FALLBACK_MINIMAL_UID 100 - #else --#define DEFAULT_MINIMAL_UID 500 -+#define FALLBACK_MINIMAL_UID 500 - #endif - - #ifndef _PATH_SHELLS -@@ -76,13 +76,19 @@ - #define DEFAULT_GLOBAL_FACE_DIR DATADIR "/faces" - #define DEFAULT_USER_ICON "stock_person" - -+#define ACCOUNTS_NAME "org.freedesktop.Accounts" -+#define ACCOUNTS_PATH "/org/freedesktop/Accounts" -+#define ACCOUNTS_INTERFACE "org.freedesktop.Accounts" -+ - struct GdmUserManagerPrivate - { - GHashTable *users_by_name; -+ GHashTable *users_by_object_path; - GHashTable *sessions; - GHashTable *shells; - DBusGConnection *connection; - DBusGProxy *seat_proxy; -+ DBusGProxy *accounts_proxy; - char *seat_id; - - GFileMonitor *passwd_monitor; -@@ -92,7 +98,6 @@ struct GdmUserManagerPrivate - GSList *include; - gboolean include_all; - -- guint reload_id; - guint ck_history_id; - }; - -@@ -114,6 +119,8 @@ static void gdm_user_manager_finalize (GObject *object); - static gboolean match_real_name_hrfunc (gpointer key, - gpointer value, - gpointer user); -+static void get_users_manually (GdmUserManager *manager); -+static void add_included_users (GdmUserManager *manager); - - static gpointer user_manager_object = NULL; - -@@ -739,6 +746,7 @@ add_user (GdmUserManager *manager, - GdmUser *user) - { - GdmUser *dup; -+ const char *object_path; - - add_sessions_for_user (manager, user); - dup = g_hash_table_find (manager->priv->users_by_name, -@@ -752,6 +760,10 @@ add_user (GdmUserManager *manager, - g_strdup (gdm_user_get_user_name (user)), - g_object_ref (user)); - -+ object_path = gdm_user_get_object_path (user); -+ if (object_path != NULL) { -+ g_hash_table_insert (manager->priv->users_by_object_path, (gpointer) object_path, g_object_ref (user)); -+ } - g_signal_emit (manager, signals[USER_ADDED], 0, user); - } - -@@ -761,16 +773,78 @@ add_new_user_for_pwent (GdmUserManager *manager, - { - GdmUser *user; - -- g_debug ("Creating new user"); -+ g_debug ("Creating new user from password entry"); - - user = create_user (manager); - _gdm_user_update_from_pwent (user, pwent); - - add_user (manager, user); -+ g_object_unref (user); -+ -+ user = g_hash_table_lookup (manager->priv->users_by_name, pwent->pw_name); - - return user; - } - -+static void -+add_new_user_for_object_path (const char *object_path, -+ GdmUserManager *manager) -+{ -+ GdmUser *user; -+ const char *username; -+ -+ if (g_hash_table_lookup (manager->priv->users_by_object_path, object_path)) { -+ return; -+ } -+ user = gdm_user_new_from_object_path (object_path); -+ -+ if (user == NULL) { -+ return; -+ } -+ -+ username = gdm_user_get_user_name (user); -+ if (user_in_exclude_list (manager, username)) { -+ g_debug ("GdmUserManager: excluding user '%s'", username); -+ g_object_unref (user); -+ return; -+ } -+ -+ g_signal_connect (user, "sessions-changed", -+ G_CALLBACK (on_user_sessions_changed), manager); -+ g_signal_connect (user, "changed", -+ G_CALLBACK (on_user_changed), manager); -+ -+ add_user (manager, user); -+ g_object_unref (user); -+} -+ -+static void -+on_new_user_in_accounts_service (DBusGProxy *proxy, -+ const char *object_path, -+ gpointer user_data) -+{ -+ GdmUserManager *manager = GDM_USER_MANAGER (user_data); -+ -+ add_new_user_for_object_path (object_path, manager); -+} -+ -+static void -+on_user_removed_in_accounts_service (DBusGProxy *proxy, -+ const char *object_path, -+ gpointer user_data) -+{ -+ GdmUserManager *manager = GDM_USER_MANAGER (user_data); -+ GdmUser *user; -+ -+ user = g_hash_table_lookup (manager->priv->users_by_object_path, object_path); -+ g_object_ref (user); -+ g_signal_handlers_disconnect_by_func (user, on_user_changed, manager); -+ g_hash_table_remove (manager->priv->users_by_object_path, gdm_user_get_object_path (user)); -+ g_hash_table_remove (manager->priv->users_by_name, gdm_user_get_user_name (user)); -+ g_signal_emit (manager, signals[USER_REMOVED], 0, user); -+ g_object_unref (user); -+} -+ - static char * - get_current_seat_id (DBusGConnection *connection) - { -@@ -867,6 +941,82 @@ get_uid_from_session_id (GdmUserManager *manager, - return TRUE; - } - -+static char * -+get_user_object_path_from_accounts_service (GdmUserManager *manager, -+ const char *name) -+{ -+ GError *error; -+ char *object_path; -+ gboolean res; -+ -+ error = NULL; -+ object_path = NULL; -+ res = dbus_g_proxy_call (manager->priv->accounts_proxy, -+ "FindUserByName", -+ &error, -+ G_TYPE_STRING, -+ name, -+ G_TYPE_INVALID, -+ DBUS_TYPE_G_OBJECT_PATH, -+ &object_path, -+ G_TYPE_INVALID); -+ if (! res) { -+ if (error != NULL) { -+ g_debug ("Failed to find user %s: %s", name, error->message); -+ g_error_free (error); -+ } else { -+ g_debug ("Failed to find user %s", name); -+ } -+ return NULL; -+ } -+ return object_path; -+} -+ -+static void -+on_list_cached_users_finished (DBusGProxy *proxy, -+ DBusGProxyCall *call_id, -+ gpointer data) -+{ -+ GdmUserManager *manager = data; -+ GError *error = NULL; -+ GPtrArray *paths; -+ -+ if (!dbus_g_proxy_end_call (proxy, -+ call_id, -+ &error, -+ dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &paths, -+ G_TYPE_INVALID)) { -+ g_debug ("ListCachedUsers failed: %s", error->message); -+ g_error_free (error); -+ -+ g_object_unref (manager->priv->accounts_proxy); -+ manager->priv->accounts_proxy = NULL; -+ -+ return get_users_manually (manager); -+ } -+ -+ g_ptr_array_foreach (paths, (GFunc)add_new_user_for_object_path, manager); -+ -+ g_ptr_array_foreach (paths, (GFunc)g_free, NULL); -+ g_ptr_array_free (paths, TRUE); -+ -+ add_included_users (manager); -+ -+ g_signal_emit (G_OBJECT (manager), signals[USERS_LOADED], 0); -+} -+ -+static void -+get_users (GdmUserManager *manager) -+{ -+ g_debug ("calling 'ListCachedUsers'"); -+ dbus_g_proxy_begin_call (manager->priv->accounts_proxy, -+ "ListCachedUsers", -+ on_list_cached_users_finished, -+ manager, -+ NULL, -+ G_TYPE_INVALID); -+} -+ - static void - seat_session_added (DBusGProxy *seat_proxy, - const char *session_id, -@@ -901,11 +1051,20 @@ seat_session_added (DBusGProxy *seat_proxy, - - user = g_hash_table_lookup (manager->priv->users_by_name, pwent->pw_name); - if (user == NULL) { -+ char *object_path; -+ - g_debug ("Creating new user"); - -- user = create_user (manager); -- _gdm_user_update_from_pwent (user, pwent); - is_new = TRUE; -+ -+ object_path = get_user_object_path_from_accounts_service (manager, pwent->pw_name); -+ if (object_path == NULL) { -+ return; -+ } -+ -+ user = gdm_user_new_from_object_path (object_path); -+ g_free (object_path); -+ - } else { - is_new = FALSE; - } -@@ -915,10 +1074,14 @@ seat_session_added (DBusGProxy *seat_proxy, - /* only add the user if we added a session */ - if (is_new) { - if (res) { -+ g_signal_connect (user, "sessions-changed", -+ G_CALLBACK (on_user_sessions_changed), -+ manager); -+ g_signal_connect (user, "changed", -+ G_CALLBACK (on_user_changed), manager); - add_user (manager, user); -- } else { -- g_object_unref (user); - } -+ g_object_unref (user); - } - } - -@@ -1016,6 +1179,47 @@ get_seat_proxy (GdmUserManager *manager) - - } - -+static void -+on_accounts_proxy_destroy (DBusGProxy *proxy, -+ GdmUserManager *manager) -+{ -+ g_debug ("GdmUserManager: accounts proxy destroyed"); -+ -+ manager->priv->accounts_proxy = NULL; -+} -+ -+static void -+get_accounts_proxy (GdmUserManager *manager) -+{ -+ DBusGProxy *proxy; -+ GError *error; -+ -+ g_assert (manager->priv->accounts_proxy == NULL); -+ -+ error = NULL; -+ -+ proxy = dbus_g_proxy_new_for_name (manager->priv->connection, -+ ACCOUNTS_NAME, -+ ACCOUNTS_PATH, -+ ACCOUNTS_INTERFACE); -+ -+ g_signal_connect (proxy, "destroy", -+ G_CALLBACK (on_accounts_proxy_destroy), manager); -+ -+ dbus_g_proxy_add_signal (proxy, "UserAdded", -+ DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); -+ dbus_g_proxy_add_signal (proxy, "UserDeleted", -+ DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); -+ -+ dbus_g_proxy_connect_signal (proxy, "UserAdded", -+ G_CALLBACK (on_new_user_in_accounts_service), -+ manager, NULL); -+ dbus_g_proxy_connect_signal (proxy, "UserDeleted", -+ G_CALLBACK (on_user_removed_in_accounts_service), -+ manager, NULL); -+ manager->priv->accounts_proxy = proxy; -+} -+ - /** - * gdm_manager_get_user: - * @manager: the manager to query. -@@ -1038,12 +1242,28 @@ gdm_user_manager_get_user (GdmUserManager *manager, - user = g_hash_table_lookup (manager->priv->users_by_name, username); - - if (user == NULL) { -- struct passwd *pwent; -+ if (manager->priv->accounts_proxy != NULL) { -+ char *object_path; - -- pwent = getpwnam (username); -+ object_path = get_user_object_path_from_accounts_service (manager, username); - -- if (pwent != NULL) { -- user = add_new_user_for_pwent (manager, pwent); -+ if (object_path != NULL) { -+ add_new_user_for_object_path (object_path, manager); -+ g_free (object_path); -+ } else { -+ g_object_unref (manager->priv->accounts_proxy); -+ manager->priv->accounts_proxy = NULL; -+ } -+ -+ user = g_hash_table_lookup (manager->priv->users_by_name, username); -+ } -+ -+ if (manager->priv->accounts_proxy == NULL) { -+ struct passwd *pwent; -+ pwent = getpwnam (username); -+ if (pwent != NULL) { -+ user = add_new_user_for_pwent (manager, pwent); -+ } - } - } - -@@ -1054,7 +1274,6 @@ GdmUser * - gdm_user_manager_get_user_by_uid (GdmUserManager *manager, - uid_t uid) - { -- GdmUser *user; - struct passwd *pwent; - - g_return_val_if_fail (GDM_IS_USER_MANAGER (manager), NULL); -@@ -1065,13 +1284,7 @@ gdm_user_manager_get_user_by_uid (GdmUserManager *manager, - return NULL; - } - -- user = g_hash_table_lookup (manager->priv->users_by_name, pwent->pw_name); -- -- if (user == NULL) { -- user = add_new_user_for_pwent (manager, pwent); -- } -- -- return user; -+ return gdm_user_manager_get_user (manager, pwent->pw_name); - } - - static void -@@ -1407,7 +1620,7 @@ reload_passwd (GdmUserManager *manager) - user = NULL; - - /* Skip users below MinimalUID... */ -- if (pwent->pw_uid < DEFAULT_MINIMAL_UID) { -+ if (pwent->pw_uid < FALLBACK_MINIMAL_UID) { - continue; - } - -@@ -1488,32 +1701,6 @@ reload_passwd (GdmUserManager *manager) - } - - static void --reload_users (GdmUserManager *manager) --{ -- reload_ck_history (manager); -- reload_passwd (manager); --} -- --static gboolean --reload_users_timeout (GdmUserManager *manager) --{ -- reload_users (manager); -- manager->priv->reload_id = 0; -- -- return FALSE; --} -- --static void --queue_reload_users (GdmUserManager *manager) --{ -- if (manager->priv->reload_id > 0) { -- return; -- } -- -- manager->priv->reload_id = g_idle_add ((GSourceFunc)reload_users_timeout, manager); --} -- --static void - reload_shells (GdmUserManager *manager) - { - char *shell; -@@ -1618,6 +1805,20 @@ monitor_local_users (GdmUserManager *manager) - } - - static void -+get_users_manually (GdmUserManager *manager) -+{ -+ g_debug ("Getting users manually"); -+ -+ if (manager->priv->include_all == TRUE) { -+ monitor_local_users (manager); -+ } -+ -+ reload_ck_history (manager); -+ reload_passwd (manager); -+ add_included_users (manager); -+} -+ -+static void - gdm_user_manager_class_init (GdmUserManagerClass *klass) - { - GObjectClass *object_class = G_OBJECT_CLASS (klass); -@@ -1692,7 +1893,6 @@ gdm_set_string_list (char *value, GSList **retval) - g_strfreev (temp_array); - } - -- - static void - gdm_user_manager_init (GdmUserManager *manager) - { -@@ -1728,6 +1928,11 @@ gdm_user_manager_init (GdmUserManager *manager) - g_free, - (GDestroyNotify) g_object_run_dispose); - -+ manager->priv->users_by_object_path = g_hash_table_new_full (g_str_hash, -+ g_str_equal, -+ NULL, -+ (GDestroyNotify) g_object_unref); -+ - if (manager->priv->include_all == TRUE) { - monitor_local_users (manager); - } -@@ -1748,8 +1953,9 @@ gdm_user_manager_init (GdmUserManager *manager) - } - - get_seat_proxy (manager); -+ get_accounts_proxy (manager); - -- queue_reload_users (manager); -+ get_users (manager); - } - - static void -@@ -1781,15 +1987,11 @@ gdm_user_manager_finalize (GObject *object) - manager->priv->ck_history_id = 0; - } - -- if (manager->priv->reload_id > 0) { -- g_source_remove (manager->priv->reload_id); -- manager->priv->reload_id = 0; -- } -- - g_hash_table_destroy (manager->priv->sessions); - - g_file_monitor_cancel (manager->priv->passwd_monitor); - g_hash_table_destroy (manager->priv->users_by_name); -+ g_hash_table_destroy (manager->priv->users_by_object_path); - - g_file_monitor_cancel (manager->priv->shells_monitor); - g_hash_table_destroy (manager->priv->shells); -diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c -index 7901fb0..ec60851 100644 ---- a/gui/simple-greeter/gdm-user.c -+++ b/gui/simple-greeter/gdm-user.c -@@ -26,6 +26,9 @@ - #include - #include - -+#include -+ -+#include - #include - #include - #include -@@ -41,6 +44,9 @@ - #define MAX_FILE_SIZE 65536 - #define MINIMAL_UID 100 - -+#define USER_ACCOUNTS_NAME "org.freedesktop.Accounts" -+#define USER_ACCOUNTS_INTERFACE "org.freedesktop.Accounts.User" -+ - enum { - CHANGED, - SESSIONS_CHANGED, -@@ -50,12 +56,15 @@ enum { - struct _GdmUser { - GObject parent; - -+ DBusGConnection *connection; -+ DBusGProxy *accounts_proxy; -+ gchar *object_path; -+ - uid_t uid; - char *user_name; - char *real_name; - char *display_name; -- char *home_dir; -- char *shell; -+ gchar *icon_file; - GList *sessions; - gulong login_frequency; - }; -@@ -66,6 +75,8 @@ typedef struct _GdmUserClass - } GdmUserClass; - - static void gdm_user_finalize (GObject *object); -+static gboolean check_user_file (const char *filename, -+ gssize max_file_size); - - static guint signals[LAST_SIGNAL] = { 0 }; - -@@ -159,10 +170,18 @@ gdm_user_class_init (GdmUserClass *class) - static void - gdm_user_init (GdmUser *user) - { -+ GError *error; -+ - user->user_name = NULL; - user->real_name = NULL; - user->display_name = NULL; - user->sessions = NULL; -+ -+ error = NULL; -+ user->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); -+ if (user->connection == NULL) { -+ g_warning ("Couldn't connect to system bus: %s", error->message); -+ } - } - - static void -@@ -175,6 +194,15 @@ gdm_user_finalize (GObject *object) - g_free (user->user_name); - g_free (user->real_name); - g_free (user->display_name); -+ g_free (user->icon_file); -+ -+ if (user->accounts_proxy != NULL) { -+ g_object_unref (user->accounts_proxy); -+ } -+ -+ if (user->connection != NULL) { -+ dbus_g_connection_unref (user->connection); -+ } - - if (G_OBJECT_CLASS (gdm_user_parent_class)->finalize) - (*G_OBJECT_CLASS (gdm_user_parent_class)->finalize) (object); -@@ -198,6 +226,7 @@ _gdm_user_update_from_pwent (GdmUser *user, - - g_return_if_fail (GDM_IS_USER (user)); - g_return_if_fail (pwent != NULL); -+ g_return_if_fail (user->object_path == NULL); - - changed = FALSE; - -@@ -266,6 +295,23 @@ _gdm_user_update_from_pwent (GdmUser *user, - (pwent->pw_name && - user->user_name && - strcmp (user->user_name, pwent->pw_name) != 0)) { -+ -+ g_free (user->icon_file); -+ user->icon_file = NULL; -+ if (pwent->pw_name != NULL) { -+ gboolean res; -+ -+ user->icon_file = g_build_filename (GDM_CACHE_DIR, pwent->pw_name, "face", NULL); -+ -+ res = check_user_file (user->icon_file, -+ MAX_FILE_SIZE); -+ -+ if (!res) { -+ g_free (user->icon_file); -+ user->icon_file = g_build_filename (GLOBAL_FACEDIR, pwent->pw_name, NULL); -+ } -+ } -+ - g_free (user->user_name); - user->user_name = g_strdup (pwent->pw_name); - changed = TRUE; -@@ -523,33 +569,6 @@ check_user_file (const char *filename, - return TRUE; - } - --static GdkPixbuf * --render_icon_from_cache (GdmUser *user, -- int icon_size) --{ -- GdkPixbuf *retval; -- char *path; -- gboolean is_autofs; -- gboolean res; -- char *filesystem_type; -- -- path = g_build_filename (GDM_CACHE_DIR, user->user_name, "face", NULL); -- res = check_user_file (path, -- MAX_FILE_SIZE); -- if (res) { -- retval = gdk_pixbuf_new_from_file_at_size (path, -- icon_size, -- icon_size, -- NULL); -- } else { -- g_debug ("Could not access face icon %s", path); -- retval = NULL; -- } -- g_free (path); -- -- return retval; --} -- - static void - rounded_rectangle (cairo_t *cr, - gdouble aspect, -@@ -783,55 +802,41 @@ gdm_user_render_icon (GdmUser *user, - { - GdkPixbuf *pixbuf; - GdkPixbuf *framed; -- char *path; -- char *tmp; - gboolean res; -+ GError *error; - - g_return_val_if_fail (GDM_IS_USER (user), NULL); - g_return_val_if_fail (icon_size > 12, NULL); - -- path = NULL; -- -- pixbuf = render_icon_from_cache (user, icon_size); -- if (pixbuf != NULL) { -- goto out; -- } -- -- /* Try ${GlobalFaceDir}/${username} */ -- path = g_build_filename (GLOBAL_FACEDIR, user->user_name, NULL); -- res = check_user_file (path, -- MAX_FILE_SIZE); -- if (res) { -- pixbuf = gdk_pixbuf_new_from_file_at_size (path, -- icon_size, -- icon_size, -- NULL); -- } else { -- g_debug ("Could not access global face icon %s", path); -- pixbuf = NULL; -+ pixbuf = NULL; -+ if (user->icon_file) { -+ res = check_user_file (user->icon_file, -+ MAX_FILE_SIZE); -+ if (res) { -+ pixbuf = gdk_pixbuf_new_from_file_at_size (user->icon_file, -+ icon_size, -+ icon_size, -+ NULL); -+ } else { -+ pixbuf = NULL; -+ } - } - -- g_free (path); - if (pixbuf != NULL) { - goto out; - } - -- /* Finally, ${GlobalFaceDir}/${username}.png */ -- tmp = g_strconcat (user->user_name, ".png", NULL); -- path = g_build_filename (GLOBAL_FACEDIR, tmp, NULL); -- g_free (tmp); -- res = check_user_file (path, -- MAX_FILE_SIZE); -- if (res) { -- pixbuf = gdk_pixbuf_new_from_file_at_size (path, -- icon_size, -- icon_size, -- NULL); -- } else { -- g_debug ("Could not access global face icon %s", path); -- pixbuf = NULL; -+ error = NULL; -+ pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), -+ -+ "stock_person", -+ icon_size, -+ GTK_ICON_LOOKUP_FORCE_SIZE, -+ &error); -+ if (error) { -+ g_warning ("%s", error->message); -+ g_error_free (error); - } -- g_free (path); - out: - - if (pixbuf != NULL) { -@@ -845,6 +850,22 @@ gdm_user_render_icon (GdmUser *user, - return pixbuf; - } - -+G_CONST_RETURN gchar * -+gdm_user_get_icon_file (GdmUser *user) -+{ -+ g_return_val_if_fail (GDM_IS_USER (user), NULL); -+ -+ return user->icon_file; -+} -+ -+G_CONST_RETURN gchar * -+gdm_user_get_object_path (GdmUser *user) -+{ -+ g_return_val_if_fail (GDM_IS_USER (user), NULL); -+ -+ return user->object_path; -+} -+ - G_CONST_RETURN char * - gdm_user_get_primary_session_id (GdmUser *user) - { -@@ -874,3 +895,128 @@ out: - return primary_ssid; - } - -+static void -+collect_props (const gchar *key, -+ const GValue *value, -+ GdmUser *user) -+{ -+ gboolean handled = TRUE; -+ -+ if (strcmp (key, "Uid") == 0) { -+ user->uid = g_value_get_uint64 (value); -+ } else if (strcmp (key, "UserName") == 0) { -+ g_free (user->user_name); -+ user->user_name = g_value_dup_string (value); -+ } else if (strcmp (key, "RealName") == 0) { -+ g_free (user->real_name); -+ user->real_name = g_value_dup_string (value); -+ } else if (strcmp (key, "AccountType") == 0) { -+ /* ignore */ -+ } else if (strcmp (key, "Email") == 0) { -+ /* ignore */ -+ } else if (strcmp (key, "Language") == 0) { -+ /* ignore */ -+ } else if (strcmp (key, "Location") == 0) { -+ /* ignore */ -+ } else if (strcmp (key, "LoginFrequency") == 0) { -+ user->login_frequency = g_value_get_uint64 (value); -+ } else if (strcmp (key, "IconFile") == 0) { -+ g_free (user->icon_file); -+ user->icon_file = g_value_dup_string (value); -+ } else if (strcmp (key, "Locked") == 0) { -+ /* ignore */ -+ } else if (strcmp (key, "AutomaticLogin") == 0) { -+ /* ignore */ -+ } else if (strcmp (key, "PasswordMode") == 0) { -+ /* ignore */ -+ } else if (strcmp (key, "PasswordHint") == 0) { -+ /* ignore */ -+ } else if (strcmp (key, "HomeDirectory") == 0) { -+ /* ignore */ -+ } else if (strcmp (key, "Shell") == 0) { -+ /* ignore */ -+ } else { -+ handled = FALSE; -+ } -+ -+ if (!handled) { -+ g_debug ("unhandled property %s", key); -+ } -+} -+ -+static gboolean -+update_info (GdmUser *user) -+{ -+ GError *error; -+ DBusGProxy *proxy; -+ GHashTable *hash_table; -+ gboolean retval; -+ -+ proxy = dbus_g_proxy_new_for_name (user->connection, -+ USER_ACCOUNTS_NAME, -+ user->object_path, -+ DBUS_INTERFACE_PROPERTIES); -+ -+ error = NULL; -+ if (!dbus_g_proxy_call (proxy, -+ "GetAll", -+ &error, -+ G_TYPE_STRING, -+ USER_ACCOUNTS_INTERFACE, -+ G_TYPE_INVALID, -+ dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), -+ &hash_table, -+ G_TYPE_INVALID)) { -+ g_debug ("Error calling GetAll() when retrieving properties for %s: %s", user->object_path, error->message); -+ g_error_free (error); -+ retval = FALSE; -+ goto out; -+ } -+ g_hash_table_foreach (hash_table, (GHFunc) collect_props, user); -+ g_hash_table_unref (hash_table); -+ -+ retval = TRUE; -+ out: -+ g_object_unref (proxy); -+ return retval; -+} -+ -+static void -+changed_handler (DBusGProxy *proxy, -+ gpointer *data) -+{ -+ GdmUser *user = GDM_USER (data); -+ -+ if (update_info (user)) { -+ g_signal_emit (user, signals[CHANGED], 0); -+ } -+} -+ -+GdmUser * -+gdm_user_new_from_object_path (const gchar *object_path) -+{ -+ GdmUser *user; -+ -+ user = (GdmUser *)g_object_new (GDM_TYPE_USER, NULL); -+ user->object_path = g_strdup (object_path); -+ -+ user->accounts_proxy = dbus_g_proxy_new_for_name (user->connection, -+ USER_ACCOUNTS_NAME, -+ user->object_path, -+ USER_ACCOUNTS_INTERFACE); -+ dbus_g_proxy_set_default_timeout (user->accounts_proxy, INT_MAX); -+ dbus_g_proxy_add_signal (user->accounts_proxy, "Changed", G_TYPE_INVALID); -+ -+ dbus_g_proxy_connect_signal (user->accounts_proxy, "Changed", -+ G_CALLBACK (changed_handler), user, NULL); -+ -+ if (!update_info (user)) { -+ goto error; -+ } -+ -+ return user; -+ -+ error: -+ g_object_unref (user); -+ return NULL; -+} -diff --git a/gui/simple-greeter/gdm-user.h b/gui/simple-greeter/gdm-user.h -index 6b51ffb..8514f2f 100644 ---- a/gui/simple-greeter/gdm-user.h -+++ b/gui/simple-greeter/gdm-user.h -@@ -39,6 +39,9 @@ typedef struct _GdmUser GdmUser; - - GType gdm_user_get_type (void) G_GNUC_CONST; - -+GdmUser *gdm_user_new_from_object_path (const gchar *path); -+const char *gdm_user_get_object_path (GdmUser *user); -+ - uid_t gdm_user_get_uid (GdmUser *user); - G_CONST_RETURN char *gdm_user_get_user_name (GdmUser *user); - G_CONST_RETURN char *gdm_user_get_real_name (GdmUser *user); -@@ -46,6 +49,7 @@ G_CONST_RETURN char *gdm_user_get_display_name (GdmUser *user); - guint gdm_user_get_num_sessions (GdmUser *user); - gboolean gdm_user_is_logged_in (GdmUser *user); - gulong gdm_user_get_login_frequency (GdmUser *user); -+G_CONST_RETURN char *gdm_user_get_icon_file (GdmUser *user); - G_CONST_RETURN char *gdm_user_get_primary_session_id (GdmUser *user); - - GdkPixbuf *gdm_user_render_icon (GdmUser *user, -diff --git a/gui/user-switch-applet/applet.c b/gui/user-switch-applet/applet.c -index 89c2b69..436207d 100644 ---- a/gui/user-switch-applet/applet.c -+++ b/gui/user-switch-applet/applet.c -@@ -800,9 +800,12 @@ on_account_activate (GtkMenuItem *item, - GdkScreen *screen; - gboolean res; - -- args[0] = g_find_program_in_path ("gnome-about-me"); -+ args[0] = g_find_program_in_path ("accounts-dialog"); - if (args[0] == NULL) { -- return; -+ args[0] = g_find_program_in_path ("gnome-about-me"); -+ if (args[0] == NULL) { -+ return; -+ } - } - args[1] = NULL; - --- -1.6.5.2 - - -From f615959724ef9eb2e445ab11e65aa368d08be822 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Thu, 18 Mar 2010 08:59:45 -0400 -Subject: [PATCH 22/22] Don't crash when adding multiple user switchers - -Before we were blowing an assertion because settings client was -getting initialized twice. ---- - gui/user-switch-applet/applet.c | 11 ++++++----- - 1 files changed, 6 insertions(+), 5 deletions(-) - -diff --git a/gui/user-switch-applet/applet.c b/gui/user-switch-applet/applet.c -index 436207d..3b20884 100644 ---- a/gui/user-switch-applet/applet.c -+++ b/gui/user-switch-applet/applet.c -@@ -1409,17 +1409,18 @@ fill_applet (PanelApplet *applet) - "widget \"*.gdm-user-switch-applet\" style \"gdm-user-switch-applet-style\"\n"); - gtk_window_set_default_icon_name ("stock_people"); - g_set_application_name (_("User Switch Applet")); -+ -+ if (! gdm_settings_client_init (GDMCONFDIR "/gdm.schemas", "/")) { -+ g_critical ("Unable to initialize settings client"); -+ exit (1); -+ } -+ - } - - adata = g_new0 (GdmAppletData, 1); - adata->applet = applet; - adata->panel_size = 24; - -- if (! gdm_settings_client_init (GDMCONFDIR "/gdm.schemas", "/")) { -- g_critical ("Unable to initialize settings client"); -- exit (1); -- } -- - adata->client = gconf_client_get_default (); - - gtk_widget_set_tooltip_text (GTK_WIDGET (applet), _("Change account settings and status")); --- -1.6.5.2 - diff --git a/add-locale-alias.patch b/add-locale-alias.patch deleted file mode 100644 index 33afade..0000000 --- a/add-locale-alias.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 3462ace9fee97f0db3af126a22cd8526b7125d94 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Thu, 14 Jan 2010 09:18:48 -0500 -Subject: [PATCH] Add missing locale.alias file - ---- - data/locale.alias | 7 +++++++ - 1 files changed, 7 insertions(+), 0 deletions(-) - create mode 100644 data/locale.alias - -diff --git a/data/locale.alias b/data/locale.alias -new file mode 100644 -index 0000000..7cabea6 ---- /dev/null -+++ b/data/locale.alias -@@ -0,0 +1,7 @@ -+# You could insert none UTF-8 locales likes C, ja_JP.eucJP -+# The format is language label, space and locale name but -+# the language label is no longer used. -+# -+# This file will be removed in the future once gdm setup tool is generated. -+# -+#Unspecified C,POSIX --- -1.6.6 - diff --git a/add-session-chooser.patch b/add-session-chooser.patch deleted file mode 100644 index b0e5819..0000000 --- a/add-session-chooser.patch +++ /dev/null @@ -1,289 +0,0 @@ -From 11139d9e693ecb1e5dcf6b538f0873a3e97730c8 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Thu, 17 Feb 2011 11:09:10 -0500 -Subject: [PATCH] greeter: add session chooser to dialog - -Since we don't have it in the panel anymore, put it in the dialog. ---- - gui/simple-greeter/Makefile.am | 4 + - gui/simple-greeter/gdm-greeter-login-window.c | 78 +++++++++++++++++++++++- - gui/simple-greeter/gdm-greeter-login-window.h | 4 + - gui/simple-greeter/gdm-greeter-login-window.ui | 4 +- - gui/simple-greeter/gdm-greeter-session.c | 10 +++- - gui/simple-greeter/gdm-session-option-widget.c | 1 - - 6 files changed, 95 insertions(+), 6 deletions(-) - -diff --git a/gui/simple-greeter/Makefile.am b/gui/simple-greeter/Makefile.am -index 74edd01..aa78504 100644 ---- a/gui/simple-greeter/Makefile.am -+++ b/gui/simple-greeter/Makefile.am -@@ -75,6 +75,10 @@ test_greeter_login_window_SOURCES = \ - gdm-sessions.c \ - gdm-cell-renderer-timer.h \ - gdm-cell-renderer-timer.c \ -+ gdm-option-widget.h \ -+ gdm-option-widget.c \ -+ gdm-session-option-widget.h \ -+ gdm-session-option-widget.c \ - gdm-user-chooser-widget.h \ - gdm-user-chooser-widget.c \ - gdm-user-chooser-dialog.h \ -diff --git a/gui/simple-greeter/gdm-greeter-login-window.c b/gui/simple-greeter/gdm-greeter-login-window.c -index 6dc201a..c220dc4 100644 ---- a/gui/simple-greeter/gdm-greeter-login-window.c -+++ b/gui/simple-greeter/gdm-greeter-login-window.c -@@ -56,6 +56,7 @@ - - #include "gdm-greeter-login-window.h" - #include "gdm-user-chooser-widget.h" -+#include "gdm-session-option-widget.h" - - #ifdef HAVE_PAM - #include -@@ -85,6 +86,7 @@ - #define LSB_RELEASE_COMMAND "lsb_release -d" - - #define GDM_GREETER_LOGIN_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_GREETER_LOGIN_WINDOW, GdmGreeterLoginWindowPrivate)) -+#define GDM_CUSTOM_SESSION "custom" - - enum { - MODE_UNDEFINED = 0, -@@ -102,6 +104,7 @@ enum { - struct GdmGreeterLoginWindowPrivate - { - GtkBuilder *builder; -+ GtkWidget *session_option_widget; - GtkWidget *user_chooser; - GtkWidget *auth_banner_label; - GtkWidget *current_button; -@@ -143,6 +146,7 @@ enum { - QUERY_ANSWER, - START_SESSION, - USER_SELECTED, -+ SESSION_SELECTED, - CANCELLED, - LAST_SIGNAL - }; -@@ -505,12 +509,15 @@ switch_mode (GdmGreeterLoginWindow *login_window, - switch (number) { - case MODE_SELECTION: - set_log_in_button_mode (login_window, LOGIN_BUTTON_HIDDEN); -+ gtk_widget_hide (login_window->priv->session_option_widget); - break; - case MODE_TIMED_LOGIN: - set_log_in_button_mode (login_window, LOGIN_BUTTON_TIMED_LOGIN); -+ gtk_widget_show (login_window->priv->session_option_widget); - break; - case MODE_AUTHENTICATION: - set_log_in_button_mode (login_window, LOGIN_BUTTON_ANSWER_QUERY); -+ gtk_widget_show (login_window->priv->session_option_widget); - break; - default: - g_assert_not_reached (); -@@ -878,6 +885,7 @@ gdm_greeter_login_window_info_query (GdmGreeterLoginWindow *login_window, - gtk_label_set_text (GTK_LABEL (label), text); - - show_widget (login_window, "auth-input-box", TRUE); -+ - set_sensitive (GDM_GREETER_LOGIN_WINDOW (login_window), TRUE); - set_ready (GDM_GREETER_LOGIN_WINDOW (login_window)); - set_focus (GDM_GREETER_LOGIN_WINDOW (login_window)); -@@ -908,6 +916,7 @@ gdm_greeter_login_window_secret_info_query (GdmGreeterLoginWindow *login_window, - gtk_label_set_text (GTK_LABEL (label), text); - - show_widget (login_window, "auth-input-box", TRUE); -+ gtk_widget_show (login_window->priv->session_option_widget); - set_sensitive (GDM_GREETER_LOGIN_WINDOW (login_window), TRUE); - set_ready (GDM_GREETER_LOGIN_WINDOW (login_window)); - set_focus (GDM_GREETER_LOGIN_WINDOW (login_window)); -@@ -1049,6 +1058,46 @@ on_user_unchosen (GdmUserChooserWidget *user_chooser, - } - - static void -+on_session_activated (GdmSessionOptionWidget *session_option_widget, -+ GdmGreeterLoginWindow *login_window) -+{ -+ char *session; -+ -+ session = gdm_session_option_widget_get_current_session (GDM_SESSION_OPTION_WIDGET (login_window->priv->session_option_widget)); -+ if (session == NULL) { -+ return; -+ } -+ -+ g_signal_emit (login_window, signals[SESSION_SELECTED], 0, session); -+ -+ g_free (session); -+} -+ -+void -+gdm_greeter_login_window_set_default_session_name (GdmGreeterLoginWindow *login_window, -+ const char *session_name) -+{ -+ g_return_if_fail (GDM_IS_GREETER_LOGIN_WINDOW (login_window)); -+ -+ if (session_name != NULL && !gdm_option_widget_lookup_item (GDM_OPTION_WIDGET (login_window->priv->session_option_widget), -+ session_name, NULL, NULL, NULL)) { -+ if (strcmp (session_name, GDM_CUSTOM_SESSION) == 0) { -+ gdm_option_widget_add_item (GDM_OPTION_WIDGET (login_window->priv->session_option_widget), -+ GDM_CUSTOM_SESSION, -+ C_("customsession", "Custom"), -+ _("Custom session"), -+ GDM_OPTION_WIDGET_POSITION_TOP); -+ } else { -+ g_warning ("Default session is not available"); -+ return; -+ } -+ } -+ -+ gdm_option_widget_set_default_item (GDM_OPTION_WIDGET (login_window->priv->session_option_widget), -+ session_name); -+} -+ -+static void - rotate_computer_info (GdmGreeterLoginWindow *login_window) - { - GtkWidget *notebook; -@@ -1264,7 +1313,7 @@ load_theme (GdmGreeterLoginWindow *login_window) - box = GTK_WIDGET (gtk_builder_get_object (login_window->priv->builder, "window-frame")); - gtk_container_add (GTK_CONTAINER (login_window), box); - -- /* FIXME: user chooser should implement GtkBuildable and this should get dropped -+ /* FIXME: user and session chooser should get loaded from ui file instead - */ - login_window->priv->user_chooser = gdm_user_chooser_widget_new (); - box = GTK_WIDGET (gtk_builder_get_object (login_window->priv->builder, "selection-box")); -@@ -1273,6 +1322,7 @@ load_theme (GdmGreeterLoginWindow *login_window) - - gdm_user_chooser_widget_set_show_only_chosen (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser), TRUE); - -+ - g_signal_connect (login_window->priv->user_chooser, - "loaded", - G_CALLBACK (on_users_loaded), -@@ -1291,6 +1341,22 @@ load_theme (GdmGreeterLoginWindow *login_window) - G_CALLBACK (on_user_chooser_visibility_changed), - login_window); - -+ login_window->priv->session_option_widget = gdm_session_option_widget_new (); -+ box = GTK_WIDGET (gtk_builder_get_object (login_window->priv->builder, "buttonbox")); -+ g_object_set (G_OBJECT (login_window->priv->session_option_widget), -+ "xscale", 0.0, -+ "yscale", 0.0, -+ "xalign", 0.0, -+ "yalign", 1.0, -+ NULL); -+ gtk_container_add (GTK_CONTAINER (box), login_window->priv->session_option_widget); -+ gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (box), login_window->priv->session_option_widget, TRUE); -+ -+ g_signal_connect (login_window->priv->session_option_widget, -+ "activated", -+ G_CALLBACK (on_session_activated), -+ login_window); -+ - login_window->priv->auth_banner_label = GTK_WIDGET (gtk_builder_get_object (login_window->priv->builder, "auth-banner-label")); - /*make_label_small_italic (login_window->priv->auth_banner_label);*/ - -@@ -1560,6 +1626,16 @@ gdm_greeter_login_window_class_init (GdmGreeterLoginWindowClass *klass) - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, - 1, G_TYPE_STRING); -+ signals [SESSION_SELECTED] = -+ g_signal_new ("session-selected", -+ G_TYPE_FROM_CLASS (object_class), -+ G_SIGNAL_RUN_LAST, -+ G_STRUCT_OFFSET (GdmGreeterLoginWindowClass, session_selected), -+ NULL, -+ NULL, -+ g_cclosure_marshal_VOID__STRING, -+ G_TYPE_NONE, -+ 1, G_TYPE_STRING); - signals [CANCELLED] = - g_signal_new ("cancelled", - G_TYPE_FROM_CLASS (object_class), -diff --git a/gui/simple-greeter/gdm-greeter-login-window.h b/gui/simple-greeter/gdm-greeter-login-window.h -index a5e68ae..c8b1167 100644 ---- a/gui/simple-greeter/gdm-greeter-login-window.h -+++ b/gui/simple-greeter/gdm-greeter-login-window.h -@@ -55,6 +55,8 @@ typedef struct - const char *text); - void (* user_selected) (GdmGreeterLoginWindow *login_window, - const char *text); -+ void (* session_selected) (GdmGreeterLoginWindow *login_window, -+ const char *text); - void (* cancelled) (GdmGreeterLoginWindow *login_window); - void (* start_session) (GdmGreeterLoginWindow *login_window); - -@@ -75,6 +77,8 @@ gboolean gdm_greeter_login_window_info (GdmGreeterLogin - const char *text); - gboolean gdm_greeter_login_window_problem (GdmGreeterLoginWindow *login_window, - const char *text); -+void gdm_greeter_login_window_set_default_session_name (GdmGreeterLoginWindow *login_window, -+ const char *text); - - void gdm_greeter_login_window_request_timed_login (GdmGreeterLoginWindow *login_window, - const char *username, -diff --git a/gui/simple-greeter/gdm-greeter-login-window.ui b/gui/simple-greeter/gdm-greeter-login-window.ui -index 9f1bc69..8409166 100644 ---- a/gui/simple-greeter/gdm-greeter-login-window.ui -+++ b/gui/simple-greeter/gdm-greeter-login-window.ui -@@ -277,8 +277,8 @@ - - - -- False -- False -+ True -+ True - end - 2 - -diff --git a/gui/simple-greeter/gdm-greeter-session.c b/gui/simple-greeter/gdm-greeter-session.c -index 14f518e..7be5acd 100644 ---- a/gui/simple-greeter/gdm-greeter-session.c -+++ b/gui/simple-greeter/gdm-greeter-session.c -@@ -163,6 +163,7 @@ on_default_session_name_changed (GdmGreeterClient *client, - GdmGreeterSession *session) - { - g_debug ("GdmGreeterSession: default session name changed: %s", text); -+ gdm_greeter_login_window_set_default_session_name (GDM_GREETER_LOGIN_WINDOW (session->priv->login_window), text); - } - - static void -@@ -238,8 +239,9 @@ on_query_answer (GdmGreeterLoginWindow *login_window, - } - - static void --on_select_session (GdmGreeterSession *session, -- const char *text) -+on_select_session (GdmGreeterLoginWindow *login_window, -+ const char *text, -+ GdmGreeterSession *session) - { - gdm_greeter_client_call_select_session (session->priv->client, - text); -@@ -387,6 +389,10 @@ toggle_login_window (GdmGreeterSession *session, - G_CALLBACK (on_select_user), - session); - g_signal_connect (session->priv->login_window, -+ "session-selected", -+ G_CALLBACK (on_select_session), -+ session); -+ g_signal_connect (session->priv->login_window, - "cancelled", - G_CALLBACK (on_cancelled), - session); -diff --git a/gui/simple-greeter/gdm-session-option-widget.c b/gui/simple-greeter/gdm-session-option-widget.c -index fb10098..d504d7c 100644 ---- a/gui/simple-greeter/gdm-session-option-widget.c -+++ b/gui/simple-greeter/gdm-session-option-widget.c -@@ -160,7 +160,6 @@ gdm_session_option_widget_new (void) - - object = g_object_new (GDM_TYPE_SESSION_OPTION_WIDGET, - "label-text", _("Session"), -- "icon-name", "session-properties", - NULL); - - return GTK_WIDGET (object); --- -1.7.4.1 - diff --git a/fix-crasher.patch b/fix-crasher.patch deleted file mode 100644 index 4fc5d01..0000000 --- a/fix-crasher.patch +++ /dev/null @@ -1,191 +0,0 @@ -From 6450a2100767b9d37ebe504e87d9fd5aec5111ff Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 14 Feb 2011 11:45:13 -0500 -Subject: [PATCH 1/2] greeter: drop child_adjustments_stale thing - -When the greeter went to gtk3, the bit of code that toggled this -boolean got dropped, so it was never TRUE. That means all the places -that check the boolean are dead code that can be pruned. ---- - gui/simple-greeter/gdm-scrollable-widget.c | 7 ------- - 1 files changed, 0 insertions(+), 7 deletions(-) - -diff --git a/gui/simple-greeter/gdm-scrollable-widget.c b/gui/simple-greeter/gdm-scrollable-widget.c -index 1f8e807..dc464af 100644 ---- a/gui/simple-greeter/gdm-scrollable-widget.c -+++ b/gui/simple-greeter/gdm-scrollable-widget.c -@@ -61,8 +61,6 @@ struct GdmScrollableWidgetPrivate - int forced_height; - - GQueue *key_event_queue; -- -- guint child_adjustments_stale : 1; - }; - - struct GdmScrollableWidgetAnimation -@@ -260,10 +258,6 @@ gdm_scrollable_widget_needs_scrollbar (GdmScrollableWidget *widget) - return FALSE; - } - -- if (widget->priv->child_adjustments_stale) { -- return FALSE; -- } -- - child = gtk_bin_get_child (GTK_BIN (widget)); - if (child != NULL) { - int available_height; -@@ -463,7 +457,6 @@ gdm_scrollable_widget_size_allocate (GtkWidget *widget, - - gtk_widget_size_allocate (child, - &child_allocation); -- scrollable_widget->priv->child_adjustments_stale = FALSE; - } - } - --- -1.7.4 - - -From b37803d0436a5ff651415cb4fbb20813b91f4940 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 14 Feb 2011 11:51:20 -0500 -Subject: [PATCH 2/2] greeter: more gtk3 fixes - -This commit drops use of the deprecated xthickness -and ythickness properties throughout, and fixes -padding and border calculations in various places, ---- - gui/simple-greeter/gdm-scrollable-widget.c | 66 +++++++++++++++++++++------- - 1 files changed, 50 insertions(+), 16 deletions(-) - -diff --git a/gui/simple-greeter/gdm-scrollable-widget.c b/gui/simple-greeter/gdm-scrollable-widget.c -index dc464af..da813f1 100644 ---- a/gui/simple-greeter/gdm-scrollable-widget.c -+++ b/gui/simple-greeter/gdm-scrollable-widget.c -@@ -135,10 +135,20 @@ on_animation_tick (GdmScrollableWidgetAnimation *animation, - - if (animation->step_func != NULL) { - GdmTimer *timer; -+ GtkStyleContext *context; -+ GtkStateFlags state; -+ GtkBorder padding, border; - - height = animation->desired_height; - -- height -= gtk_widget_get_style (animation->widget)->ythickness * 2; -+ context = gtk_widget_get_style_context (animation->widget); -+ state = gtk_widget_get_state_flags (animation->widget); -+ -+ gtk_style_context_get_padding (context, state, &padding); -+ gtk_style_context_get_border (context, state, &border); -+ -+ height -= padding.top + padding.bottom; -+ height -= border.top + border.bottom; - - timer = g_object_ref (animation->timer); - animation->step_func (GDM_SCROLLABLE_WIDGET (animation->widget), -@@ -147,7 +157,8 @@ on_animation_tick (GdmScrollableWidgetAnimation *animation, - animation->step_func_user_data); - - if (gdm_timer_is_started (timer)) { -- height += gtk_widget_get_style (animation->widget)->ythickness * 2; -+ height += padding.top + padding.bottom; -+ height += border.top + border.bottom; - - animation->desired_height = height; - } -@@ -259,11 +270,23 @@ gdm_scrollable_widget_needs_scrollbar (GdmScrollableWidget *widget) - } - - child = gtk_bin_get_child (GTK_BIN (widget)); -- if (child != NULL) { -+ if (child != NULL && GTK_IS_SCROLLABLE (child)) { -+ GtkStyleContext *context; -+ GtkStateFlags state; -+ GtkBorder padding, border; - int available_height; - int child_scrolled_height; - -+ context = gtk_widget_get_style_context (GTK_WIDGET (widget)); -+ state = gtk_widget_get_state_flags (GTK_WIDGET (widget)); -+ -+ gtk_style_context_get_padding (context, state, &padding); -+ gtk_style_context_get_border (context, state, &border); -+ - available_height = gtk_widget_get_allocated_height (GTK_WIDGET (widget)); -+ available_height -= padding.top + padding.bottom; -+ available_height -= border.top + border.bottom; -+ - gtk_widget_get_preferred_height (child, NULL, &child_scrolled_height); - needs_scrollbar = child_scrolled_height > available_height; - } else { -@@ -295,10 +318,21 @@ gdm_scrollable_widget_get_preferred_size (GtkWidget *widget, - gtk_style_context_get_border (context, state, &border); - - scrollable_widget = GDM_SCROLLABLE_WIDGET (widget); -+ -+ minimum_req.width = padding.left + padding.right; -+ minimum_req.width += border.left + border.right; -+ minimum_req.height = padding.top + padding.bottom; -+ minimum_req.height += border.top + border.bottom; -+ -+ natural_req.width = padding.left + padding.right; -+ natural_req.width += border.left + border.right; -+ natural_req.height = padding.top + padding.bottom; -+ natural_req.height += border.top + border.bottom; -+ - if (orientation == GTK_ORIENTATION_VERTICAL - && scrollable_widget->priv->forced_height >= 0) { -- minimum_req.height = scrollable_widget->priv->forced_height; -- natural_req.height = scrollable_widget->priv->forced_height; -+ minimum_req.height += scrollable_widget->priv->forced_height; -+ natural_req.height += scrollable_widget->priv->forced_height; - } else { - child = gtk_bin_get_child (GTK_BIN (widget)); - -@@ -306,16 +340,6 @@ gdm_scrollable_widget_get_preferred_size (GtkWidget *widget, - &scrollbar_requisition, - NULL); - -- minimum_req.width = padding.left + padding.right; -- minimum_req.width = border.left + border.right; -- minimum_req.height = padding.top + padding.bottom; -- minimum_req.height = border.top + border.bottom; -- -- natural_req.width = padding.left + padding.right; -- natural_req.width = border.left + border.right; -- natural_req.height = padding.top + padding.bottom; -- natural_req.height = border.top + border.bottom; -- - if (child && gtk_widget_get_visible (child)) { - if (orientation == GTK_ORIENTATION_HORIZONTAL) { - gtk_widget_get_preferred_width (child, -@@ -815,6 +839,9 @@ gdm_scrollable_widget_slide_to_height (GdmScrollableWidget *scrollable_widget, - GtkWidget *widget; - gboolean input_redirected; - GtkAllocation widget_allocation; -+ GtkStyleContext *context; -+ GtkStateFlags state; -+ GtkBorder padding, border; - - g_return_if_fail (GDM_IS_SCROLLABLE_WIDGET (scrollable_widget)); - widget = GTK_WIDGET (scrollable_widget); -@@ -841,7 +868,14 @@ gdm_scrollable_widget_slide_to_height (GdmScrollableWidget *scrollable_widget, - return; - } - -- height += gtk_widget_get_style (widget)->ythickness * 2; -+ context = gtk_widget_get_style_context (widget); -+ state = gtk_widget_get_state_flags (widget); -+ -+ gtk_style_context_get_padding (context, state, &padding); -+ gtk_style_context_get_border (context, state, &border); -+ -+ height += padding.top + padding.bottom; -+ height += border.top + border.bottom; - - gtk_widget_get_allocation (widget, &widget_allocation); - --- -1.7.4 - diff --git a/fix-empty-userlist.patch b/fix-empty-userlist.patch deleted file mode 100644 index bb50c72..0000000 --- a/fix-empty-userlist.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 4f63038e588f334ec062a38c620fcf8f8c0fa222 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Tue, 22 Feb 2011 17:42:35 -0500 -Subject: [PATCH] user-chooser-widget: zero idle id when done with it - -Because we weren't zeroing it, it could never get queued -after it finished its first run. - -This fixes a bug that prevents the users from showing up -in the user list. ---- - gui/simple-greeter/gdm-user-chooser-widget.c | 7 ++++++- - 1 files changed, 6 insertions(+), 1 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c -index 7b0445c..be756a6 100644 ---- a/gui/simple-greeter/gdm-user-chooser-widget.c -+++ b/gui/simple-greeter/gdm-user-chooser-widget.c -@@ -873,7 +873,12 @@ add_users (GdmUserChooserWidget *widget) - gdm_chooser_widget_loaded (GDM_CHOOSER_WIDGET (widget)); - } - -- return (widget->priv->users_to_add != NULL); -+ if (widget->priv->users_to_add == NULL) { -+ widget->priv->add_users_idle_id = 0; -+ return FALSE; -+ } -+ -+ return TRUE; - } - - static void --- -1.7.4.1 - diff --git a/fix-theme-related-crash.patch b/fix-theme-related-crash.patch deleted file mode 100644 index a7f6cf6..0000000 --- a/fix-theme-related-crash.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 6bb88258c9ce7c9b2a0477c697d64e2a36f42dfd Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 4 Feb 2011 15:06:11 -0500 -Subject: [PATCH] greeter: don't call render_frame if there's no frame - -If the theme lacks a frame gtk_render_frame will throw -a fit and make the greeter nose dive. ---- - gui/simple-greeter/gdm-scrollable-widget.c | 6 ++++-- - 1 files changed, 4 insertions(+), 2 deletions(-) - -diff --git a/gui/simple-greeter/gdm-scrollable-widget.c b/gui/simple-greeter/gdm-scrollable-widget.c -index 8a9ea25..1f8e807 100644 ---- a/gui/simple-greeter/gdm-scrollable-widget.c -+++ b/gui/simple-greeter/gdm-scrollable-widget.c -@@ -598,8 +598,10 @@ gdm_scrollable_widget_draw (GtkWidget *widget, - height = widget_allocation.height; - height -= padding.top + padding.bottom; - -- gtk_render_frame (context, cr, -- x, y, width, height); -+ if (width > 0 && height > 0) { -+ gtk_render_frame (context, cr, -+ x, y, width, height); -+ } - - return GTK_WIDGET_CLASS (gdm_scrollable_widget_parent_class)->draw (widget, cr); - } --- -1.7.4 - diff --git a/gdm-2.23.92-save-root-window.patch b/gdm-2.23.92-save-root-window.patch deleted file mode 100644 index f6a7d9e..0000000 --- a/gdm-2.23.92-save-root-window.patch +++ /dev/null @@ -1,119 +0,0 @@ -diff -up gdm-2.23.92/daemon/gdm-simple-slave.c.save-root-window gdm-2.23.92/daemon/gdm-simple-slave.c ---- gdm-2.23.92/daemon/gdm-simple-slave.c.save-root-window 2008-09-03 16:52:53.000000000 -0400 -+++ gdm-2.23.92/daemon/gdm-simple-slave.c 2008-09-19 18:18:50.000000000 -0400 -@@ -825,6 +825,15 @@ setup_server (GdmSimpleSlave *slave) - { - /* Set the busy cursor */ - gdm_slave_set_busy_cursor (GDM_SLAVE (slave)); -+ -+ /* The root window has a background that may be useful -+ * to cross fade or transition from when setting the -+ * login screen background. We read it here, and stuff -+ * it into the standard _XROOTPMAP_ID root window property, -+ * so gnome-settings-daemon can get at it. -+ */ -+ gdm_slave_save_root_windows (GDM_SLAVE (slave)); -+ - } - - static void -diff -up gdm-2.23.92/daemon/gdm-slave.c.save-root-window gdm-2.23.92/daemon/gdm-slave.c ---- gdm-2.23.92/daemon/gdm-slave.c.save-root-window 2008-08-26 15:04:00.000000000 -0400 -+++ gdm-2.23.92/daemon/gdm-slave.c 2008-09-22 11:06:36.000000000 -0400 -@@ -42,6 +42,7 @@ - #include - - #include /* for Display */ -+#include /* for XA_PIXMAP */ - #include /* for watch cursor */ - - #include "gdm-common.h" -@@ -341,6 +342,77 @@ gdm_slave_run_script (GdmSlave *slave, - return ret; - } - -+static void -+gdm_slave_save_root_window_of_screen (GdmSlave *slave, -+ Atom id_atom, -+ int screen_number) -+{ -+ Window root_window; -+ GC gc; -+ XGCValues values; -+ Pixmap pixmap; -+ int width, height, depth; -+ -+ root_window = RootWindow (slave->priv->server_display, -+ screen_number); -+ -+ width = DisplayWidth (slave->priv->server_display, screen_number); -+ height = DisplayHeight (slave->priv->server_display, screen_number); -+ depth = DefaultDepth (slave->priv->server_display, screen_number); -+ pixmap = XCreatePixmap (slave->priv->server_display, -+ root_window, -+ width, height, depth); -+ -+ values.function = GXcopy; -+ values.plane_mask = AllPlanes; -+ values.fill_style = FillSolid; -+ values.subwindow_mode = IncludeInferiors; -+ -+ gc = XCreateGC (slave->priv->server_display, -+ root_window, -+ GCFunction | GCPlaneMask | GCFillStyle | GCSubwindowMode, -+ &values); -+ -+ if (XCopyArea (slave->priv->server_display, -+ root_window, pixmap, gc, 0, 0, -+ width, height, 0, 0)) { -+ -+ long pixmap_as_long; -+ -+ pixmap_as_long = (long) pixmap; -+ -+ XChangeProperty (slave->priv->server_display, -+ root_window, id_atom, XA_PIXMAP, -+ 32, PropModeReplace, (guchar *) &pixmap_as_long, -+ 1); -+ -+ } -+ -+ XFreeGC (slave->priv->server_display, gc); -+} -+ -+void -+gdm_slave_save_root_windows (GdmSlave *slave) -+{ -+ int i, number_of_screens; -+ Atom atom; -+ -+ number_of_screens = ScreenCount (slave->priv->server_display); -+ -+ atom = XInternAtom (slave->priv->server_display, -+ "_XROOTPMAP_ID", False); -+ -+ if (atom == 0) { -+ return; -+ } -+ -+ for (i = 0; i < number_of_screens; i++) { -+ gdm_slave_save_root_window_of_screen (slave, atom, i); -+ } -+ -+ XSync (slave->priv->server_display, False); -+} -+ - void - gdm_slave_set_busy_cursor (GdmSlave *slave) - { -diff -up gdm-2.23.92/daemon/gdm-slave.h.save-root-window gdm-2.23.92/daemon/gdm-slave.h ---- gdm-2.23.92/daemon/gdm-slave.h.save-root-window 2008-08-26 15:04:00.000000000 -0400 -+++ gdm-2.23.92/daemon/gdm-slave.h 2008-09-19 18:18:50.000000000 -0400 -@@ -69,6 +69,7 @@ gboolean gdm_slave_switch_to_ - - gboolean gdm_slave_connect_to_x11_display (GdmSlave *slave); - void gdm_slave_set_busy_cursor (GdmSlave *slave); -+void gdm_slave_save_root_windows (GdmSlave *slave); - gboolean gdm_slave_run_script (GdmSlave *slave, - const char *dir, - const char *username); diff --git a/gdm-libs.patch b/gdm-libs.patch deleted file mode 100644 index 39a3bf3..0000000 --- a/gdm-libs.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -up gdm-2.29.6/configure.ac.libs gdm-2.29.6/configure.ac ---- gdm-2.29.6/configure.ac.libs 2010-02-11 19:25:51.485272530 -0500 -+++ gdm-2.29.6/configure.ac 2010-02-11 19:27:05.805022498 -0500 -@@ -145,6 +145,9 @@ PKG_CHECK_MODULES(SIMPLE_GREETER, - fontconfig >= $FONTCONFIG_REQUIRED_VERSION - x11 - ) -+ -+SIMPLE_GREETER_LIBS="$SIMPLE_GREETER_LIBS -lm" -+ - AC_SUBST(SIMPLE_GREETER_CFLAGS) - AC_SUBST(SIMPLE_GREETER_LIBS) - diff --git a/gdm-multistack.patch b/gdm-multistack.patch index 6fd5ce5..af4e508 100644 --- a/gdm-multistack.patch +++ b/gdm-multistack.patch @@ -1,4 +1,4 @@ -From d8945b88ee774a96db43ef743db49d1a91f44d33 Mon Sep 17 00:00:00 2001 +From 36b2793ae523ca4195d2a0afdc133f21b8d29f44 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 22 Jul 2010 13:38:09 -0400 Subject: [PATCH 01/35] Revert "Don't wait a mandatory 2 seconds when resetting greeter" @@ -28,7 +28,7 @@ index e6b3c98..9ea5bc9 100644 1.7.4.1 -From 9f8735086e8b32b64460797183595d058203ebf1 Mon Sep 17 00:00:00 2001 +From aba8bd3130970aac450d5adf7913c2ae359e2fe3 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 7 Jul 2010 17:16:38 -0400 Subject: [PATCH 02/35] Don't set list-visible unless the widget is visible @@ -62,7 +62,7 @@ index ebbfdb9..e81bd77 100644 1.7.4.1 -From 95513b3697900f71e769b5a1948be557ecd64757 Mon Sep 17 00:00:00 2001 +From 0635e6be3672381ed6ea905e76c19a60e6266640 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 28 Jun 2010 14:35:35 -0400 Subject: [PATCH 03/35] Add user chooser to ui file @@ -157,7 +157,7 @@ index 8409166..7ce166b 100644 1.7.4.1 -From b18cc72457e6abde22a8423a80cde831efd677c5 Mon Sep 17 00:00:00 2001 +From a3329ba6104839630943cc8ea65f1b2b2940f3e5 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 20 Feb 2009 14:05:20 -0500 Subject: [PATCH 04/35] Add new api to ask when chooser widget is done loading items @@ -213,7 +213,7 @@ index 11a6456..3f6fea3 100644 1.7.4.1 -From f54cca866610069e51ef4bcdb7c0fe1f9ba76964 Mon Sep 17 00:00:00 2001 +From 9df125300e779247912864871e7c3c7054db7a5a Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 6 Mar 2009 11:19:40 -0500 Subject: [PATCH 05/35] Create session settings object up front @@ -249,7 +249,7 @@ index 3dd714f..9adb0de 100644 1.7.4.1 -From 0ab65e8c6ca52f4785f2466cce7f7507d88fc9c3 Mon Sep 17 00:00:00 2001 +From a94d8297fba9cdb4d7a37dc57bc221a01aaff9d2 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 13 Jul 2010 22:42:43 -0400 Subject: [PATCH 06/35] disconnect signal handlers in destroy session @@ -388,7 +388,7 @@ index 9ea5bc9..d37cc79 100644 1.7.4.1 -From acdd83e5a3fd6e135eed33706824123d53ba3357 Mon Sep 17 00:00:00 2001 +From 28741da90c7c3913f29b9c4d47dbb6764ca5d2bf Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 16 Jan 2009 11:00:08 -0500 Subject: [PATCH 07/35] Introduce new Conversation object @@ -1458,7 +1458,7 @@ index 8bed085..9bfda86 100644 1.7.4.1 -From be4f83a6b936d7f73614accd78cf10c78e4b257b Mon Sep 17 00:00:00 2001 +From aa670cd4c15c594d12390496372e669178c9bf34 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 4 Feb 2009 10:55:03 -0500 Subject: [PATCH 08/35] Rename session worker to the service it's managing @@ -1647,7 +1647,7 @@ index d24f025..4833f23 100644 1.7.4.1 -From 791bd408970f023cca1211d21400e7f73d3a557c Mon Sep 17 00:00:00 2001 +From a746997c009382cb4500674dd7d1431ba5f6f9d2 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 16 Jan 2009 13:01:48 -0500 Subject: [PATCH 09/35] Make greeter/autologin session explicitly request PAM conversation @@ -2008,7 +2008,7 @@ index 7be5acd..ed20884 100644 1.7.4.1 -From 90eb845b64bb5668aeb2d54eb78a7c2d4892778d Mon Sep 17 00:00:00 2001 +From 58ff5c51c6f48d797320584b2b2ce0f6618f7cb9 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 16 Jan 2009 15:18:31 -0500 Subject: [PATCH 10/35] Store multiple conversations in the session @@ -6615,7 +6615,7 @@ index ed20884..16f8db5 100644 1.7.4.1 -From 9f4212f9ea630e7b30b00ccf86a882b91e3b5c17 Mon Sep 17 00:00:00 2001 +From b221145b95a6b612091f5d81db9fbff796351c32 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 28 Oct 2009 16:05:14 -0400 Subject: [PATCH 11/35] Return a different error code for "service won't work" than "auth failed" @@ -6675,7 +6675,7 @@ index ee5465a..b1c8285 100644 1.7.4.1 -From 9e9a68065a829025da372b034868cfc0ca4971a1 Mon Sep 17 00:00:00 2001 +From 8501846fa24735fe6195b9ca5a05f7aa5a96d887 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 28 Oct 2009 21:32:00 -0400 Subject: [PATCH 12/35] Emit "service-unavailable" from session when pam service refuses to work @@ -6914,7 +6914,7 @@ index 9e72f89..ab16031 100644 1.7.4.1 -From 12dbb74e8cd44eb579587469d6e376f419056ff4 Mon Sep 17 00:00:00 2001 +From ae83626e9eeee53245d672bb76d9a5383669740f Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 28 Oct 2009 21:38:52 -0400 Subject: [PATCH 13/35] Bubble service-unavailable up to greeter @@ -7048,7 +7048,7 @@ index 396007f..7d967b3 100644 1.7.4.1 -From 8c7b68952240df1c40a7f14c5868665a365ff64f Mon Sep 17 00:00:00 2001 +From 6de8d9fe6bf18e73ff141dbe67000fdf5462efa4 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 28 Oct 2009 21:46:39 -0400 Subject: [PATCH 14/35] Catch service-unavailable from server in client and propagate it @@ -7127,7 +7127,7 @@ index 868b496..63bd4b5 100644 1.7.4.1 -From 6489e96641ee835a7c0fb22010e66fbf82ce3db8 Mon Sep 17 00:00:00 2001 +From 1d67919214c2dbc2072ef4f41cd53f82bca08a6b Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 5 Feb 2009 15:20:25 -0500 Subject: [PATCH 15/35] Queue a greeter reset when the user clicks cancel @@ -7252,7 +7252,7 @@ index 7d967b3..2ecf0a4 100644 1.7.4.1 -From e3efa1719fdb78952cf57e28647cc52fe7844957 Mon Sep 17 00:00:00 2001 +From dee01922148f640ad46e441a0630554c4e977492 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 6 Nov 2009 13:35:26 -0500 Subject: [PATCH 16/35] Don't delay login for passwd -d users @@ -7281,7 +7281,7 @@ index a64bbc2..d689d91 100644 1.7.4.1 -From b0a3cad225154377fa0e5429ebe4525d5f7e291e Mon Sep 17 00:00:00 2001 +From 09d46952fd2ff07333101bb408a9bfa4cd4fc502 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 30 Jan 2009 23:57:31 -0500 Subject: [PATCH 17/35] Add a plugin based extension system to greeter @@ -7356,7 +7356,7 @@ index d5455e1..d8a9e72 100644 VOID:DOUBLE +BOOLEAN:STRING diff --git a/configure.ac b/configure.ac -index 48be019..2a2e37b 100644 +index b907340..211bdcd 100644 --- a/configure.ac +++ b/configure.ac @@ -18,6 +18,22 @@ AC_PROG_CXX @@ -10937,7 +10937,7 @@ index 0000000..cc377bd + +#endif /* __GDM_TASK_LIST_H */ diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c -index a385218..8414313 100644 +index be756a6..9b409b3 100644 --- a/gui/simple-greeter/gdm-user-chooser-widget.c +++ b/gui/simple-greeter/gdm-user-chooser-widget.c @@ -635,9 +635,30 @@ gdm_user_chooser_widget_set_show_user_auto (GdmUserChooserWidget *widget, @@ -12297,11 +12297,11 @@ index 0000000..9b87c67 + return GDM_GREETER_EXTENSION (extension); +} diff --git a/po/POTFILES.in b/po/POTFILES.in -index 8a4997a..2f9af97 100644 +index 67383d6..524d817 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in -@@ -81,6 +81,7 @@ gui/simple-greeter/gdm-timer.c - gui/simple-greeter/gdm-user.c +@@ -80,6 +80,7 @@ gui/simple-greeter/gdm-simple-greeter.schemas.in + gui/simple-greeter/gdm-timer.c gui/simple-greeter/gdm-user-chooser-widget.c gui/simple-greeter/greeter-main.c +gui/simple-greeter/plugins/password/gdm-password-extension.c @@ -12312,7 +12312,7 @@ index 8a4997a..2f9af97 100644 1.7.4.1 -From a659374376aa864925143b7b58847aca9e830345 Mon Sep 17 00:00:00 2001 +From 0cb46cd5674ee353419bcf2993c5ddf99a6ae4cd Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 4 Aug 2010 18:25:50 -0400 Subject: [PATCH 18/35] squash with password @@ -12377,7 +12377,7 @@ index 255283e..11a171c 100644 1.7.4.1 -From 047ceabcb1fa549e9a6bb7197c5e12cdd4e49296 Mon Sep 17 00:00:00 2001 +From d7cf879cd7a93b752767faba110885ca4448e571 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 6 Aug 2010 11:13:10 -0400 Subject: [PATCH 19/35] task list fix @@ -12427,7 +12427,7 @@ index 5fdc2b8..3e49fb7 100644 1.7.4.1 -From 1055ba4d586d4f61a22faca0d968ddb8816b5569 Mon Sep 17 00:00:00 2001 +From 2b95e4ed4c0b6ebba9e70feecca779d26178597e Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 29 Jun 2010 14:13:35 -0400 Subject: [PATCH 20/35] Show cancel button after first message @@ -12471,7 +12471,7 @@ index 9844af9..938e523 100644 1.7.4.1 -From 72355ea96c482d015422b327c5ecca3b3766478d Mon Sep 17 00:00:00 2001 +From 74b5fbd516671be45a6305ef19147458f713148c Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 28 Oct 2009 11:13:10 -0400 Subject: [PATCH 21/35] Prevent start session signal handler from getting called multiple times @@ -12507,7 +12507,7 @@ index 938e523..0fb6c64 100644 1.7.4.1 -From 889691316c708a787a5f60e91e380c658893542d Mon Sep 17 00:00:00 2001 +From a06fdd650307ecf5b88c2cf38de3752cd46a85fb Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 6 Feb 2009 16:25:47 -0500 Subject: [PATCH 22/35] Add fingerprint plugin @@ -12543,7 +12543,7 @@ fingerprint scans. create mode 100644 gui/simple-greeter/plugins/fingerprint/plugin.c diff --git a/configure.ac b/configure.ac -index 2a2e37b..98a8bf6 100644 +index 211bdcd..d753d77 100644 --- a/configure.ac +++ b/configure.ac @@ -1440,6 +1440,10 @@ gui/simple-greeter/libgdmsimplegreeter/Makefile @@ -13262,10 +13262,10 @@ index 0000000..5ea9925 + return GDM_GREETER_EXTENSION (extension); +} diff --git a/po/POTFILES.in b/po/POTFILES.in -index 2f9af97..4f5b317 100644 +index 524d817..3e0b163 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in -@@ -82,6 +82,7 @@ gui/simple-greeter/gdm-user.c +@@ -81,6 +81,7 @@ gui/simple-greeter/gdm-timer.c gui/simple-greeter/gdm-user-chooser-widget.c gui/simple-greeter/greeter-main.c gui/simple-greeter/plugins/password/gdm-password-extension.c @@ -13277,7 +13277,7 @@ index 2f9af97..4f5b317 100644 1.7.4.1 -From 65dd58cf8a77e2df4e517d23aefc7e7f2a186231 Mon Sep 17 00:00:00 2001 +From 97315dd4efc474d3c62b558f7647c182447eb726 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 6 Feb 2009 16:25:47 -0500 Subject: [PATCH 23/35] Add smartcard plugin @@ -13323,7 +13323,7 @@ smartcards are inserted. create mode 100644 gui/simple-greeter/plugins/smartcard/plugin.c diff --git a/configure.ac b/configure.ac -index 98a8bf6..5f370ab 100644 +index d753d77..c850ea2 100644 --- a/configure.ac +++ b/configure.ac @@ -68,6 +68,7 @@ LIBCANBERRA_GTK_REQUIRED_VERSION=0.4 @@ -16776,10 +16776,10 @@ index 0000000..fffbd50 + return GDM_GREETER_EXTENSION (extension); +} diff --git a/po/POTFILES.in b/po/POTFILES.in -index 4f5b317..48634f1 100644 +index 3e0b163..69eb449 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in -@@ -83,6 +83,9 @@ gui/simple-greeter/gdm-user-chooser-widget.c +@@ -82,6 +82,9 @@ gui/simple-greeter/gdm-user-chooser-widget.c gui/simple-greeter/greeter-main.c gui/simple-greeter/plugins/password/gdm-password-extension.c gui/simple-greeter/plugins/fingerprint/gdm-fingerprint-extension.c @@ -16793,7 +16793,7 @@ index 4f5b317..48634f1 100644 1.7.4.1 -From d52b686f0869887997864ea0553f3f5785f65b94 Mon Sep 17 00:00:00 2001 +From 2c9f10758c955238fb7a4b2b60c743292072eb85 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 4 Aug 2010 18:26:01 -0400 Subject: [PATCH 24/35] squash with smartcard @@ -16834,7 +16834,7 @@ index b925f5e..b40a21c 100644 1.7.4.1 -From 6977055677ac889d204d17391327261e7dd1757f Mon Sep 17 00:00:00 2001 +From 839f3be0ea63df3db33e9e4327ef99a88d040ec3 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 21 Apr 2009 10:25:18 -0400 Subject: [PATCH 25/35] When one PAM conversation wins, stop the others @@ -16966,7 +16966,7 @@ index 2ecf0a4..ff1f3af 100644 1.7.4.1 -From 78949a4384dc2aae51bb8835520075bcc9793ef6 Mon Sep 17 00:00:00 2001 +From 1f55b2efed2d819679724c19f6ea297c628e666a Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 24 Jul 2009 14:41:48 -0400 Subject: [PATCH 26/35] KILL stuck processes if they don't die on TERM @@ -17090,7 +17090,7 @@ index be85f30..8b93663 100644 1.7.4.1 -From 2316076b232cd4efd6e6e6f22c6af206ff7bb581 Mon Sep 17 00:00:00 2001 +From 774c9b9bf574849f8994d2e227b40a9d6cc3c97a Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 13 Jul 2010 22:36:19 -0400 Subject: [PATCH 27/35] add better debug spew (needs squash) @@ -17143,7 +17143,7 @@ index 0f0c053..23812d2 100644 1.7.4.1 -From b98e46ec2d16d390c5fecf0b18471583ca54670f Mon Sep 17 00:00:00 2001 +From 3243e64db6f142c404b33a2f1773810cebb7d1e9 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 13 Jul 2010 22:37:35 -0400 Subject: [PATCH 28/35] switch to proper mode when going to timed login @@ -17169,7 +17169,7 @@ index 0fb6c64..adcd71f 100644 1.7.4.1 -From 16c4f635f7442808d4f3f7f9232097b8bb093345 Mon Sep 17 00:00:00 2001 +From 095989310331c8f848a1e4271d7a05b4585f3053 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 3 Aug 2010 15:21:26 -0400 Subject: [PATCH 29/35] Drop "Cancelling" message for plugin initiated cancels @@ -17198,7 +17198,7 @@ index adcd71f..cd1941e 100644 1.7.4.1 -From 40114bb382490be345b04004082c85d55cf53691 Mon Sep 17 00:00:00 2001 +From 47242b775c34ae5102bc223adede52a0ee86cd61 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 4 Aug 2010 18:11:27 -0400 Subject: [PATCH 30/35] drop code for label that doesn't exist anymore @@ -17234,7 +17234,7 @@ index cd1941e..f3f89b2 100644 1.7.4.1 -From 5cb876a52cd54a895dc925fc8625a4b4c490f4e9 Mon Sep 17 00:00:00 2001 +From 159cd5a6cf4d110f9adbbd6b5a953692911fb02b Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 4 Aug 2010 18:03:52 -0400 Subject: [PATCH 31/35] Add delay when showing messages (needs split) @@ -17699,7 +17699,7 @@ index b40a21c..5e234b9 100644 1.7.4.1 -From 438a429d75d0af77649901c2421e2898a504f831 Mon Sep 17 00:00:00 2001 +From 8a06dfeaca172cab52ca61de7e9daf546d697b53 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 4 Aug 2010 19:27:14 -0400 Subject: [PATCH 32/35] Drop cancelling message @@ -17726,7 +17726,7 @@ index e43449e..cb03d06 100644 1.7.4.1 -From 6720d05d54ec542dc9031f13462438fa5b8ebdf4 Mon Sep 17 00:00:00 2001 +From cdbeecaa9f11cf2f1c5036fe9cd01287f8d470d1 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 6 Aug 2010 11:14:23 -0400 Subject: [PATCH 33/35] manage tasks outside of task list @@ -18527,7 +18527,7 @@ index cb03d06..627a6f9 100644 1.7.4.1 -From 62d27058a556a1e27099684470f9b24c97f011eb Mon Sep 17 00:00:00 2001 +From 9fdf58cb6dd87a378f2138ae533e965afd7f812d Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 9 Aug 2010 18:09:19 -0400 Subject: [PATCH 34/35] hide task actions more aggressively @@ -18562,7 +18562,7 @@ index 627a6f9..8772fdd 100644 1.7.4.1 -From 9255529aa654bd240db39888d1fd452d44ec9df3 Mon Sep 17 00:00:00 2001 +From 5cdb54c609ee56d3fd1c4733562a59bd9b6af0de Mon Sep 17 00:00:00 2001 From: Gal Hammer Date: Thu, 21 Oct 2010 10:14:32 -0400 Subject: [PATCH 35/35] smartcard: don't show extension if disabled in authconfig diff --git a/gdm-system-keyboard.patch b/gdm-system-keyboard.patch deleted file mode 100644 index b260199..0000000 --- a/gdm-system-keyboard.patch +++ /dev/null @@ -1,119 +0,0 @@ -# -# Description: Get default keyboard layout from hal -# Ubuntu: https://bugs.launchpad.net/bugs/395103 -# Fedora: http://cvs.fedoraproject.org/viewvc//devel/gdm/gdm-system-keyboard.patch?view=markup -# -diff -Nur -x '*.orig' -x '*~' gdm-2.28.0/configure.ac gdm-2.28.0.new/configure.ac ---- gdm-2.28.0/configure.ac 2009-09-21 22:06:40.000000000 +0200 -+++ gdm-2.28.0.new/configure.ac 2009-10-01 12:35:50.345762314 +0200 -@@ -70,6 +70,7 @@ - dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION - gobject-2.0 >= $GLIB_REQUIRED_VERSION - gio-2.0 >= $GLIB_REQUIRED_VERSION -+ hal - ) - AC_SUBST(DAEMON_CFLAGS) - AC_SUBST(DAEMON_LIBS) -diff -Nur -x '*.orig' -x '*~' gdm-2.28.0/daemon/gdm-session-direct.c gdm-2.28.0.new/daemon/gdm-session-direct.c ---- gdm-2.28.0/daemon/gdm-session-direct.c 2009-09-21 22:05:27.000000000 +0200 -+++ gdm-2.28.0.new/daemon/gdm-session-direct.c 2009-10-01 12:34:43.000000000 +0200 -@@ -45,6 +45,8 @@ - #include - #include - -+#include -+ - #include "gdm-session-direct.h" - #include "gdm-session.h" - #include "gdm-session-private.h" -@@ -598,14 +600,87 @@ - return setlocale (LC_MESSAGES, NULL); - } - -+static char * -+get_system_default_layout (GdmSessionDirect *session) -+{ -+ DBusConnection *connection; -+ LibHalContext *ctx; -+ char **devices; -+ int n_devices; -+ char *layout; -+ char *variant; -+ char *result; -+ -+ result = NULL; -+ -+ connection = dbus_g_connection_get_connection (session->priv->connection); -+ ctx = libhal_ctx_new (); -+ libhal_ctx_set_dbus_connection (ctx, connection); -+ -+ if (!libhal_ctx_init (ctx, NULL)) { -+ goto out; -+ } -+ -+ devices = libhal_find_device_by_capability (ctx, -+ "input.keyboard", -+ &n_devices, -+ NULL); -+ if (n_devices > 0) { -+ layout = libhal_device_get_property_string (ctx, -+ devices[0], -+ "input.x11_options.XkbLayout", -+ NULL); -+ if (!layout) { -+ layout = libhal_device_get_property_string (ctx, -+ devices[0], -+ "input.xkb.layout", -+ NULL); -+ } -+ if (!layout) -+ goto out; -+ -+ variant = libhal_device_get_property_string (ctx, -+ devices[0], -+ "input.x11_options.XkbVariant", -+ NULL); -+ if (!variant) { -+ variant = libhal_device_get_property_string (ctx, -+ devices[0], -+ "input.xkb.variant", -+ NULL); -+ } -+ -+ if (variant != NULL && variant[0] != '\0') { -+ result = g_strdup_printf("%s\t%s", layout, variant); -+ libhal_free_string (variant); -+ } else { -+ result = g_strdup (layout); -+ } -+ libhal_free_string (layout); -+ } -+ -+ libhal_free_string_array (devices); -+ -+ libhal_ctx_shutdown (ctx, NULL); -+ libhal_ctx_free (ctx); -+ -+out: -+ if (!result) { -+ result = g_strdup ("us"); -+ } -+ -+ g_debug ("GdmSessionDirect: System default keyboard layout: '%s'", result); -+ return result; -+} -+ - static const char * - get_default_layout_name (GdmSessionDirect *session) - { -- if (session->priv->saved_layout != NULL) { -- return session->priv->saved_layout; -+ if (!session->priv->saved_layout) { -+ session->priv->saved_layout = get_system_default_layout (session); - } - -- return "us"; -+ return session->priv->saved_layout; - } - - static char * diff --git a/gdm.spec b/gdm.spec index 7fdef5d..b300ca1 100644 --- a/gdm.spec +++ b/gdm.spec @@ -14,14 +14,14 @@ Summary: The GNOME Display Manager Name: gdm -Version: 2.91.6 -Release: 11%{?dist} +Version: 2.91.91 +Release: 1%{?dist} Epoch: 1 License: GPLv2+ Group: User Interface/X URL: http://download.gnome.org/sources/gdm #VCS: git:git://git.gnome.org/gdm -Source: http://download.gnome.org/sources/gdm/2.32/gdm-%{version}.tar.bz2 +Source: http://download.gnome.org/sources/gdm/2.91/gdm-%{version}.tar.bz2 Source1: gdm-pam Source2: gdm-autologin-pam Source3: gdm-password.pam @@ -89,13 +89,7 @@ Provides: service(graphical-login) = %{name} Requires: audit-libs >= %{libauditver} -Patch1: 0001-Make-sure-to-disable-g-s-d-plugins-in-greeter.patch Patch2: plymouth.patch -Patch3: fix-theme-related-crash.patch -Patch4: fix-crasher.patch -Patch5: add-session-chooser.patch -Patch6: move-to-accounts-library.patch -Patch7: fix-empty-userlist.patch Patch96: gdm-multistack.patch # Fedora-specific @@ -125,13 +119,7 @@ The GDM fingerprint plugin provides functionality necessary to use a fingerprint %prep %setup -q -%patch1 -p1 -b .gsd-plugins %patch2 -p1 -b .plymouth -%patch3 -p1 -b .fix-theme-related-crash -%patch4 -p1 -b .fix-crasher -%patch5 -p1 -b .add-session-chooser -%patch6 -p1 -b .move-to-accounts-library -%patch7 -p1 -b .fix-empty-user-list %patch96 -p1 -b .multistack %patch99 -p1 -b .fedora-logo diff --git a/icon-fix.patch b/icon-fix.patch deleted file mode 100644 index f3ee6d1..0000000 --- a/icon-fix.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 951e72405640b1682072a846118077e927affaaf Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Wed, 19 Jan 2011 12:06:42 -0500 -Subject: [PATCH] user-chooser: try to find fallback icon more aggressively - -Some themes won't give you the nearest icon at the requested size, -so first look up the available sizes and choose the closest -available one ourselves. - -If it fails, just fallback to an empty square of the right size. ---- - gui/simple-greeter/gdm-user-chooser-widget.c | 35 ++++++++++++++++++++++++- - 1 files changed, 33 insertions(+), 2 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c -index 8df255f..6d03c38 100644 ---- a/gui/simple-greeter/gdm-user-chooser-widget.c -+++ b/gui/simple-greeter/gdm-user-chooser-widget.c -@@ -833,6 +833,9 @@ get_pixbuf_from_icon_names (GdmUserChooserWidget *widget, - int size; - const char *icon_name; - va_list argument_list; -+ gint *sizes; -+ gint candidate_size; -+ int i; - - array = g_ptr_array_new (); - -@@ -849,9 +852,29 @@ get_pixbuf_from_icon_names (GdmUserChooserWidget *widget, - - size = get_icon_height_for_widget (GTK_WIDGET (widget)); - -+ sizes = gtk_icon_theme_get_icon_sizes (widget->priv->icon_theme, first_name); -+ -+ candidate_size = 0; -+ for (i = 0; sizes[i] != 0; i++) { -+ -+ /* scalable */ -+ if (sizes[i] == -1) { -+ candidate_size = sizes[i]; -+ break; -+ } -+ -+ if (ABS (size - sizes[i]) < ABS (size - candidate_size)) { -+ candidate_size = sizes[i]; -+ } -+ } -+ -+ if (candidate_size == 0) { -+ candidate_size = size; -+ } -+ - icon_info = gtk_icon_theme_choose_icon (widget->priv->icon_theme, - (const char **) array->pdata, -- size, -+ candidate_size, - GTK_ICON_LOOKUP_GENERIC_FALLBACK); - g_ptr_array_free (array, FALSE); - -@@ -868,8 +891,16 @@ get_pixbuf_from_icon_names (GdmUserChooserWidget *widget, - g_error_free (error); - } - } else { -+ GdkPixbuf *scaled_pixbuf; -+ -+ guchar pixel = 0x00000000; -+ - g_warning ("Could not find icon '%s' or fallbacks", first_name); -- pixbuf = NULL; -+ pixbuf = gdk_pixbuf_new_from_data (&pixel, GDK_COLORSPACE_RGB, -+ TRUE, 8, 1, 1, 1, NULL, NULL); -+ scaled_pixbuf = gdk_pixbuf_scale_simple (pixbuf, size, size, GDK_INTERP_NEAREST); -+ g_object_unref (pixbuf); -+ pixbuf = scaled_pixbuf; - } - - return pixbuf; --- -1.7.3.4 - diff --git a/icon-ref-issue.patch b/icon-ref-issue.patch deleted file mode 100644 index a9d4b9b..0000000 --- a/icon-ref-issue.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 1eb1f09bcfa3f7c3c33da0ef24c5a528e53528cd Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Wed, 19 Jan 2011 13:32:28 -0500 -Subject: [PATCH] user-chooser-widget: fix ref counting issue on user pixbuf - ---- - gui/simple-greeter/gdm-user-chooser-widget.c | 7 +++++++ - 1 files changed, 7 insertions(+), 0 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c -index 6d03c38..9447e59 100644 ---- a/gui/simple-greeter/gdm-user-chooser-widget.c -+++ b/gui/simple-greeter/gdm-user-chooser-widget.c -@@ -949,7 +949,14 @@ update_icons (GdmChooserWidget *widget, - IconUpdateData *data) - { - if (data->old_icon == *image) { -+ if (*image != NULL) { -+ g_object_unref (*image); -+ } - *image = data->new_icon; -+ -+ if (*image != NULL) { -+ g_object_ref (*image); -+ } - return TRUE; - } - --- -1.7.3.4 - diff --git a/move-to-accounts-library.patch b/move-to-accounts-library.patch deleted file mode 100644 index 7596555..0000000 --- a/move-to-accounts-library.patch +++ /dev/null @@ -1,3961 +0,0 @@ -From 4dad44a175493f1c495a90ba67270ba11c9c1802 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 18 Feb 2011 17:56:09 -0500 -Subject: [PATCH 1/2] greeter: fix swapped LHS/RHS in icon loading error path - -This nasty bug means in some obscure cases we're going to -end up using freed memory. ---- - gui/simple-greeter/gdm-user-chooser-widget.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c -index 9447e59..4b5a80f 100644 ---- a/gui/simple-greeter/gdm-user-chooser-widget.c -+++ b/gui/simple-greeter/gdm-user-chooser-widget.c -@@ -900,7 +900,7 @@ get_pixbuf_from_icon_names (GdmUserChooserWidget *widget, - TRUE, 8, 1, 1, 1, NULL, NULL); - scaled_pixbuf = gdk_pixbuf_scale_simple (pixbuf, size, size, GDK_INTERP_NEAREST); - g_object_unref (pixbuf); -- scaled_pixbuf = pixbuf; -+ pixbuf = scaled_pixbuf; - } - - return pixbuf; --- -1.7.4.1 - - -From ec034f78dcb27baf240658323892ac2a665c6580 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 18 Feb 2011 17:54:08 -0500 -Subject: [PATCH 2/2] greeter: port to account service library - -The current user manager code is a mess of dbus code for -talking to the accounts daemon and code for falling back if -it isn't there. The accounts daemon is no longer optional, -so drop all that and just use the accounts service library -directly. ---- - configure.ac | 1 + - gui/simple-greeter/Makefile.am | 27 - - gui/simple-greeter/gdm-user-chooser-widget.c | 370 +++- - gui/simple-greeter/gdm-user-manager.c | 3082 -------------------------- - gui/simple-greeter/gdm-user-manager.h | 91 - - gui/simple-greeter/test-user-manager.c | 27 +- - 6 files changed, 316 insertions(+), 3282 deletions(-) - delete mode 100644 gui/simple-greeter/gdm-user-manager.c - delete mode 100644 gui/simple-greeter/gdm-user-manager.h - -diff --git a/configure.ac b/configure.ac -index fe612e7..48be019 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -125,6 +125,7 @@ PKG_CHECK_MODULES(SIMPLE_GREETER, - gtk+-3.0 >= $GTK_REQUIRED_VERSION - gconf-2.0 >= $GCONF_REQUIRED_VERSION - fontconfig >= $FONTCONFIG_REQUIRED_VERSION -+ accountsservice >= $ACCOUNTS_SERVICE_REQUIRED_VERSION - x11 - ) - SIMPLE_GREETER_LIBS="$SIMPLE_GREETER_LIBS -lm" -diff --git a/gui/simple-greeter/Makefile.am b/gui/simple-greeter/Makefile.am -index aa78504..a842c7b 100644 ---- a/gui/simple-greeter/Makefile.am -+++ b/gui/simple-greeter/Makefile.am -@@ -26,29 +26,6 @@ schemasdir = @GCONF_SCHEMA_FILE_DIR@ - schemas_in_files = gdm-simple-greeter.schemas.in - schemas_DATA = $(schemas_in_files:.schemas.in=.schemas) - --noinst_LTLIBRARIES = \ -- libgdmuser.la \ -- $(null) -- --libgdmuser_la_SOURCES = \ -- gdm-user.c \ -- gdm-user.h \ -- gdm-user-private.h \ -- gdm-user-manager.c \ -- gdm-user-manager.h \ -- $(NULL) -- --libgdmuser_la_CFLAGS = \ -- $(SIMPLE_GREETER_CFLAGS) \ -- $(NULL) -- --libgdmuser_la_LIBADD = \ -- $(NULL) -- --libgdmuser_la_LDFLAGS = \ -- -export-dynamic \ -- $(NULL) -- - noinst_PROGRAMS = \ - test-filesystem-type \ - test-greeter-login-window \ -@@ -87,7 +64,6 @@ test_greeter_login_window_SOURCES = \ - - test_greeter_login_window_LDADD = \ - $(top_builddir)/common/libgdmcommon.la \ -- libgdmuser.la \ - $(COMMON_LIBS) \ - $(SIMPLE_GREETER_LIBS) \ - $(RBAC_LIBS) \ -@@ -216,7 +192,6 @@ test_user_chooser_SOURCES = \ - $(NULL) - - test_user_chooser_LDADD = \ -- libgdmuser.la \ - $(top_builddir)/common/libgdmcommon.la \ - $(COMMON_LIBS) \ - $(SIMPLE_GREETER_LIBS) \ -@@ -227,7 +202,6 @@ test_user_manager_SOURCES = \ - $(NULL) - - test_user_manager_LDADD = \ -- libgdmuser.la \ - $(top_builddir)/common/libgdmcommon.la \ - $(COMMON_LIBS) \ - $(SIMPLE_GREETER_LIBS) \ -@@ -281,7 +255,6 @@ gdm_simple_greeter_SOURCES = \ - - gdm_simple_greeter_LDADD = \ - $(top_builddir)/common/libgdmcommon.la \ -- libgdmuser.la \ - $(COMMON_LIBS) \ - $(EXTRA_GREETER_LIBS) \ - $(SIMPLE_GREETER_LIBS) \ -diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c -index 4b5a80f..a385218 100644 ---- a/gui/simple-greeter/gdm-user-chooser-widget.c -+++ b/gui/simple-greeter/gdm-user-chooser-widget.c -@@ -37,7 +37,9 @@ - - #include - --#include "gdm-user-manager.h" -+#include -+#include -+ - #include "gdm-user-chooser-widget.h" - #include "gdm-settings-keys.h" - #include "gdm-settings-client.h" -@@ -59,7 +61,7 @@ enum { - - struct GdmUserChooserWidgetPrivate - { -- GdmUserManager *manager; -+ ActUserManager *manager; - GtkIconTheme *icon_theme; - - GSList *users_to_add; -@@ -170,45 +172,307 @@ queue_update_other_user_visibility (GdmUserChooserWidget *widget) - } - - static void -+rounded_rectangle (cairo_t *cr, -+ gdouble aspect, -+ gdouble x, -+ gdouble y, -+ gdouble corner_radius, -+ gdouble width, -+ gdouble height) -+{ -+ gdouble radius; -+ gdouble degrees; -+ -+ radius = corner_radius / aspect; -+ degrees = G_PI / 180.0; -+ -+ cairo_new_sub_path (cr); -+ cairo_arc (cr, -+ x + width - radius, -+ y + radius, -+ radius, -+ -90 * degrees, -+ 0 * degrees); -+ cairo_arc (cr, -+ x + width - radius, -+ y + height - radius, -+ radius, -+ 0 * degrees, -+ 90 * degrees); -+ cairo_arc (cr, -+ x + radius, -+ y + height - radius, -+ radius, -+ 90 * degrees, -+ 180 * degrees); -+ cairo_arc (cr, -+ x + radius, -+ y + radius, -+ radius, -+ 180 * degrees, -+ 270 * degrees); -+ cairo_close_path (cr); -+} -+ -+static cairo_surface_t * -+surface_from_pixbuf (GdkPixbuf *pixbuf) -+{ -+ cairo_surface_t *surface; -+ cairo_t *cr; -+ -+ surface = cairo_image_surface_create (gdk_pixbuf_get_has_alpha (pixbuf) ? -+ CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, -+ gdk_pixbuf_get_width (pixbuf), -+ gdk_pixbuf_get_height (pixbuf)); -+ cr = cairo_create (surface); -+ gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0); -+ cairo_paint (cr); -+ cairo_destroy (cr); -+ -+ return surface; -+} -+ -+/** -+ * go_cairo_convert_data_to_pixbuf: -+ * @src: a pointer to pixel data in cairo format -+ * @dst: a pointer to pixel data in pixbuf format -+ * @width: image width -+ * @height: image height -+ * @rowstride: data rowstride -+ * -+ * Converts the pixel data stored in @src in CAIRO_FORMAT_ARGB32 cairo format -+ * to GDK_COLORSPACE_RGB pixbuf format and move them -+ * to @dst. If @src == @dst, pixel are converted in place. -+ **/ -+ -+static void -+go_cairo_convert_data_to_pixbuf (unsigned char *dst, -+ unsigned char const *src, -+ int width, -+ int height, -+ int rowstride) -+{ -+ int i,j; -+ unsigned int t; -+ unsigned char a, b, c; -+ -+ g_return_if_fail (dst != NULL); -+ -+#define MULT(d,c,a,t) G_STMT_START { t = (a)? c * 255 / a: 0; d = t;} G_STMT_END -+ -+ if (src == dst || src == NULL) { -+ for (i = 0; i < height; i++) { -+ for (j = 0; j < width; j++) { -+#if G_BYTE_ORDER == G_LITTLE_ENDIAN -+ MULT(a, dst[2], dst[3], t); -+ MULT(b, dst[1], dst[3], t); -+ MULT(c, dst[0], dst[3], t); -+ dst[0] = a; -+ dst[1] = b; -+ dst[2] = c; -+#else -+ MULT(a, dst[1], dst[0], t); -+ MULT(b, dst[2], dst[0], t); -+ MULT(c, dst[3], dst[0], t); -+ dst[3] = dst[0]; -+ dst[0] = a; -+ dst[1] = b; -+ dst[2] = c; -+#endif -+ dst += 4; -+ } -+ dst += rowstride - width * 4; -+ } -+ } else { -+ for (i = 0; i < height; i++) { -+ for (j = 0; j < width; j++) { -+#if G_BYTE_ORDER == G_LITTLE_ENDIAN -+ MULT(dst[0], src[2], src[3], t); -+ MULT(dst[1], src[1], src[3], t); -+ MULT(dst[2], src[0], src[3], t); -+ dst[3] = src[3]; -+#else -+ MULT(dst[0], src[1], src[0], t); -+ MULT(dst[1], src[2], src[0], t); -+ MULT(dst[2], src[3], src[0], t); -+ dst[3] = src[0]; -+#endif -+ src += 4; -+ dst += 4; -+ } -+ src += rowstride - width * 4; -+ dst += rowstride - width * 4; -+ } -+ } -+#undef MULT -+} -+ -+static void -+cairo_to_pixbuf (guint8 *src_data, -+ GdkPixbuf *dst_pixbuf) -+{ -+ unsigned char *src; -+ unsigned char *dst; -+ guint w; -+ guint h; -+ guint rowstride; -+ -+ w = gdk_pixbuf_get_width (dst_pixbuf); -+ h = gdk_pixbuf_get_height (dst_pixbuf); -+ rowstride = gdk_pixbuf_get_rowstride (dst_pixbuf); -+ -+ dst = gdk_pixbuf_get_pixels (dst_pixbuf); -+ src = src_data; -+ -+ go_cairo_convert_data_to_pixbuf (dst, src, w, h, rowstride); -+} -+ -+static GdkPixbuf * -+frame_pixbuf (GdkPixbuf *source) -+{ -+ GdkPixbuf *dest; -+ cairo_t *cr; -+ cairo_surface_t *surface; -+ guint w; -+ guint h; -+ guint rowstride; -+ int frame_width; -+ double radius; -+ guint8 *data; -+ -+ frame_width = 2; -+ -+ w = gdk_pixbuf_get_width (source) + frame_width * 2; -+ h = gdk_pixbuf_get_height (source) + frame_width * 2; -+ radius = w / 10; -+ -+ dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB, -+ TRUE, -+ 8, -+ w, -+ h); -+ rowstride = gdk_pixbuf_get_rowstride (dest); -+ -+ -+ data = g_new0 (guint8, h * rowstride); -+ -+ surface = cairo_image_surface_create_for_data (data, -+ CAIRO_FORMAT_ARGB32, -+ w, -+ h, -+ rowstride); -+ cr = cairo_create (surface); -+ cairo_surface_destroy (surface); -+ -+ /* set up image */ -+ cairo_rectangle (cr, 0, 0, w, h); -+ cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); -+ cairo_fill (cr); -+ -+ rounded_rectangle (cr, -+ 1.0, -+ frame_width + 0.5, -+ frame_width + 0.5, -+ radius, -+ w - frame_width * 2 - 1, -+ h - frame_width * 2 - 1); -+ cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.3); -+ cairo_fill_preserve (cr); -+ -+ surface = surface_from_pixbuf (source); -+ cairo_set_source_surface (cr, surface, frame_width, frame_width); -+ cairo_fill (cr); -+ cairo_surface_destroy (surface); -+ -+ cairo_to_pixbuf (data, dest); -+ -+ cairo_destroy (cr); -+ g_free (data); -+ -+ return dest; -+} -+ -+static GdkPixbuf * -+render_user_icon (GdmUserChooserWidget *widget, -+ ActUser *user) -+{ -+ int size; -+ const char *file; -+ GdkPixbuf *pixbuf; -+ GdkPixbuf *framed; -+ -+ pixbuf = NULL; -+ -+ size = get_icon_height_for_widget (GTK_WIDGET (widget)); -+ file = act_user_get_icon_file (user); -+ -+ if (file) { -+ pixbuf = gdk_pixbuf_new_from_file_at_size (file, size, size, NULL); -+ } -+ -+ if (pixbuf == NULL) { -+ GError *error; -+ -+ error = NULL; -+ pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), -+ "avatar-default", -+ size, -+ GTK_ICON_LOOKUP_FORCE_SIZE, -+ &error); -+ if (error != NULL) { -+ g_warning ("%s", error->message); -+ g_error_free (error); -+ } -+ } -+ -+ if (pixbuf != NULL) { -+ framed = frame_pixbuf (pixbuf); -+ g_object_unref (pixbuf); -+ -+ pixbuf = framed; -+ } -+ -+ return pixbuf; -+} -+ -+static void - update_item_for_user (GdmUserChooserWidget *widget, -- GdmUser *user) -+ ActUser *user) - { - GdkPixbuf *pixbuf; - char *tooltip; - gboolean is_logged_in; -- int size; - char *escaped_username; - char *escaped_real_name; - -- if (!gdm_user_is_loaded (user)) { -+ if (!act_user_is_loaded (user)) { - return; - } - -- size = get_icon_height_for_widget (GTK_WIDGET (widget)); -- pixbuf = gdm_user_render_icon (user, size); -+ pixbuf = render_user_icon (widget, user); - - if (pixbuf == NULL && widget->priv->stock_person_pixbuf != NULL) { - pixbuf = g_object_ref (widget->priv->stock_person_pixbuf); - } - - tooltip = g_strdup_printf (_("Log in as %s"), -- gdm_user_get_user_name (user)); -+ act_user_get_user_name (user)); - -- is_logged_in = gdm_user_is_logged_in (user); -+ is_logged_in = act_user_is_logged_in (user); - - g_debug ("GdmUserChooserWidget: User added name:%s logged-in:%d pixbuf:%p", -- gdm_user_get_user_name (user), -+ act_user_get_user_name (user), - is_logged_in, - pixbuf); - -- escaped_username = g_markup_escape_text (gdm_user_get_user_name (user), -1); -- escaped_real_name = g_markup_escape_text (gdm_user_get_real_name (user), -1); -+ escaped_username = g_markup_escape_text (act_user_get_user_name (user), -1); -+ escaped_real_name = g_markup_escape_text (act_user_get_real_name (user), -1); - gdm_chooser_widget_update_item (GDM_CHOOSER_WIDGET (widget), - escaped_username, - pixbuf, - escaped_real_name, - tooltip, -- gdm_user_get_login_frequency (user), -+ act_user_get_login_frequency (user), - is_logged_in, - FALSE); - g_free (escaped_real_name); -@@ -225,7 +489,7 @@ on_item_load (GdmChooserWidget *widget, - const char *id, - GdmUserChooserWidget *user_chooser) - { -- GdmUser *user; -+ ActUser *user; - - g_debug ("GdmUserChooserWidget: Loading item for id=%s", id); - -@@ -241,7 +505,7 @@ on_item_load (GdmChooserWidget *widget, - return; - } - -- user = gdm_user_manager_get_user (user_chooser->priv->manager, id); -+ user = act_user_manager_get_user (user_chooser->priv->manager, id); - if (user != NULL) { - update_item_for_user (user_chooser, user); - } -@@ -467,7 +731,7 @@ is_user_list_disabled (GdmUserChooserWidget *widget) - - static void - add_user (GdmUserChooserWidget *widget, -- GdmUser *user) -+ ActUser *user) - { - GdkPixbuf *pixbuf; - char *tooltip; -@@ -486,18 +750,18 @@ add_user (GdmUserChooserWidget *widget, - } - - tooltip = g_strdup_printf (_("Log in as %s"), -- gdm_user_get_user_name (user)); -+ act_user_get_user_name (user)); - -- is_logged_in = gdm_user_is_logged_in (user); -+ is_logged_in = act_user_is_logged_in (user); - -- escaped_username = g_markup_escape_text (gdm_user_get_user_name (user), -1); -- escaped_real_name = g_markup_escape_text (gdm_user_get_real_name (user), -1); -+ escaped_username = g_markup_escape_text (act_user_get_user_name (user), -1); -+ escaped_real_name = g_markup_escape_text (act_user_get_real_name (user), -1); - gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget), - escaped_username, - pixbuf, - escaped_real_name, - tooltip, -- gdm_user_get_login_frequency (user), -+ act_user_get_login_frequency (user), - is_logged_in, - FALSE, - (GdmChooserWidgetItemLoadFunc) on_item_load, -@@ -514,8 +778,8 @@ add_user (GdmUserChooserWidget *widget, - } - - static void --on_user_added (GdmUserManager *manager, -- GdmUser *user, -+on_user_added (ActUserManager *manager, -+ ActUser *user, - GdmUserChooserWidget *widget) - { - /* wait for all users to be loaded */ -@@ -526,19 +790,19 @@ on_user_added (GdmUserManager *manager, - } - - static void --on_user_removed (GdmUserManager *manager, -- GdmUser *user, -+on_user_removed (ActUserManager *manager, -+ ActUser *user, - GdmUserChooserWidget *widget) - { - const char *user_name; - -- g_debug ("GdmUserChooserWidget: User removed: %s", gdm_user_get_user_name (user)); -+ g_debug ("GdmUserChooserWidget: User removed: %s", act_user_get_user_name (user)); - /* wait for all users to be loaded */ - if (! widget->priv->loaded) { - return; - } - -- user_name = gdm_user_get_user_name (user); -+ user_name = act_user_get_user_name (user); - - gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget), - user_name); -@@ -547,17 +811,17 @@ on_user_removed (GdmUserManager *manager, - } - - static void --on_user_is_logged_in_changed (GdmUserManager *manager, -- GdmUser *user, -+on_user_is_logged_in_changed (ActUserManager *manager, -+ ActUser *user, - GdmUserChooserWidget *widget) - { - const char *user_name; - gboolean is_logged_in; - -- g_debug ("GdmUserChooserWidget: User logged in changed: %s", gdm_user_get_user_name (user)); -+ g_debug ("GdmUserChooserWidget: User logged in changed: %s", act_user_get_user_name (user)); - -- user_name = gdm_user_get_user_name (user); -- is_logged_in = gdm_user_is_logged_in (user); -+ user_name = act_user_get_user_name (user); -+ is_logged_in = act_user_is_logged_in (user); - - gdm_chooser_widget_set_item_in_use (GDM_CHOOSER_WIDGET (widget), - user_name, -@@ -565,8 +829,8 @@ on_user_is_logged_in_changed (GdmUserManager *manager, - } - - static void --on_user_changed (GdmUserManager *manager, -- GdmUser *user, -+on_user_changed (ActUserManager *manager, -+ ActUser *user, - GdmUserChooserWidget *widget) - { - /* wait for all users to be loaded */ -@@ -612,7 +876,7 @@ queue_add_users (GdmUserChooserWidget *widget) - } - - static void --on_is_loaded_changed (GdmUserManager *manager, -+on_is_loaded_changed (ActUserManager *manager, - GParamSpec *pspec, - GdmUserChooserWidget *widget) - { -@@ -622,7 +886,7 @@ on_is_loaded_changed (GdmUserManager *manager, - - g_debug ("GdmUserChooserWidget: Users loaded"); - -- users = gdm_user_manager_list_users (manager); -+ users = act_user_manager_list_users (manager); - g_slist_foreach (users, (GFunc) g_object_ref, NULL); - widget->priv->users_to_add = g_slist_concat (widget->priv->users_to_add, g_slist_copy (users)); - -@@ -658,38 +922,7 @@ load_users (GdmUserChooserWidget *widget) - { - - if (widget->priv->show_normal_users) { -- char *temp; -- gboolean res; -- gboolean include_all; -- GSList *includes; -- GSList *excludes; -- -- widget->priv->manager = gdm_user_manager_ref_default (); -- -- /* exclude/include */ -- g_debug ("Setting users to include:"); -- res = gdm_settings_client_get_string (GDM_KEY_INCLUDE, -- &temp); -- parse_string_list (temp, &includes); -- -- g_debug ("Setting users to exclude:"); -- res = gdm_settings_client_get_string (GDM_KEY_EXCLUDE, -- &temp); -- parse_string_list (temp, &excludes); -- -- include_all = FALSE; -- res = gdm_settings_client_get_boolean (GDM_KEY_INCLUDE_ALL, -- &include_all); -- g_object_set (widget->priv->manager, -- "include-all", include_all, -- "include-usernames-list", includes, -- "exclude-usernames-list", excludes, -- NULL); -- -- g_slist_foreach (includes, (GFunc) g_free, NULL); -- g_slist_free (includes); -- g_slist_foreach (excludes, (GFunc) g_free, NULL); -- g_slist_free (excludes); -+ widget->priv->manager = act_user_manager_get_default (); - - g_signal_connect (widget->priv->manager, - "user-added", -@@ -711,7 +944,6 @@ load_users (GdmUserChooserWidget *widget) - "user-changed", - G_CALLBACK (on_user_changed), - widget); -- gdm_user_manager_queue_load (widget->priv->manager); - } else { - gdm_chooser_widget_loaded (GDM_CHOOSER_WIDGET (widget)); - } -diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c -deleted file mode 100644 -index c631989..0000000 ---- a/gui/simple-greeter/gdm-user-manager.c -+++ /dev/null -@@ -1,3082 +0,0 @@ --/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- -- * -- * Copyright (C) 2007-2008 William Jon McCann -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License -- * along with this program; if not, write to the Free Software -- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -- * -- */ -- --#include "config.h" -- --#include --#include --#include --#include --#include --#include --#include --#include --#include -- --#ifdef HAVE_PATHS_H --#include --#endif /* HAVE_PATHS_H */ -- --#include --#include --#include --#include --#include -- --#include --#include --#include -- --#include "gdm-user-manager.h" --#include "gdm-user-private.h" -- --#define GDM_USER_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_USER_MANAGER, GdmUserManagerPrivate)) -- --#define CK_NAME "org.freedesktop.ConsoleKit" -- --#define CK_MANAGER_PATH "/org/freedesktop/ConsoleKit/Manager" --#define CK_MANAGER_INTERFACE "org.freedesktop.ConsoleKit.Manager" --#define CK_SEAT_INTERFACE "org.freedesktop.ConsoleKit.Seat" --#define CK_SESSION_INTERFACE "org.freedesktop.ConsoleKit.Session" -- --#define GDM_DBUS_TYPE_G_OBJECT_PATH_ARRAY (dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH)) -- --/* Prefs Defaults */ -- --#ifdef __sun --#define FALLBACK_MINIMAL_UID 100 --#else --#define FALLBACK_MINIMAL_UID 500 --#endif -- --#ifndef _PATH_SHELLS --#define _PATH_SHELLS "/etc/shells" --#endif --#define PATH_PASSWD "/etc/passwd" -- --#ifndef GDM_USERNAME --#define GDM_USERNAME "gdm" --#endif -- --#define RELOAD_PASSWD_THROTTLE_SECS 5 -- --/* approximately two months */ --#define LOGIN_FREQUENCY_TIME_WINDOW_SECS (60 * 24 * 60 * 60) -- --#define ACCOUNTS_NAME "org.freedesktop.Accounts" --#define ACCOUNTS_PATH "/org/freedesktop/Accounts" --#define ACCOUNTS_INTERFACE "org.freedesktop.Accounts" -- --typedef enum { -- GDM_USER_MANAGER_SEAT_STATE_UNLOADED = 0, -- GDM_USER_MANAGER_SEAT_STATE_GET_SESSION_ID, -- GDM_USER_MANAGER_SEAT_STATE_GET_ID, -- GDM_USER_MANAGER_SEAT_STATE_GET_PROXY, -- GDM_USER_MANAGER_SEAT_STATE_LOADED, --} GdmUserManagerSeatState; -- --typedef struct --{ -- GdmUserManagerSeatState state; -- char *id; -- char *session_id; -- union { -- DBusGProxyCall *get_current_session_call; -- DBusGProxyCall *get_seat_id_call; -- }; -- -- DBusGProxy *proxy; --} GdmUserManagerSeat; -- --typedef enum { -- GDM_USER_MANAGER_NEW_SESSION_STATE_UNLOADED = 0, -- GDM_USER_MANAGER_NEW_SESSION_STATE_GET_PROXY, -- GDM_USER_MANAGER_NEW_SESSION_STATE_GET_UID, -- GDM_USER_MANAGER_NEW_SESSION_STATE_GET_X11_DISPLAY, -- GDM_USER_MANAGER_NEW_SESSION_STATE_MAYBE_ADD, -- GDM_USER_MANAGER_NEW_SESSION_STATE_LOADED, --} GdmUserManagerNewSessionState; -- --typedef struct --{ -- GdmUserManager *manager; -- GdmUserManagerNewSessionState state; -- char *id; -- -- union { -- DBusGProxyCall *get_unix_user_call; -- DBusGProxyCall *get_x11_display_call; -- }; -- -- DBusGProxy *proxy; -- -- uid_t uid; -- char *x11_display; --} GdmUserManagerNewSession; -- --typedef enum { -- GDM_USER_MANAGER_GET_USER_STATE_UNFETCHED = 0, -- GDM_USER_MANAGER_GET_USER_STATE_WAIT_FOR_LOADED, -- GDM_USER_MANAGER_GET_USER_STATE_ASK_ACCOUNTS_SERVICE, -- GDM_USER_MANAGER_GET_USER_STATE_FETCHED --} GdmUserManagerGetUserState; -- --typedef struct --{ -- GdmUserManager *manager; -- GdmUserManagerGetUserState state; -- GdmUser *user; -- char *username; -- char *object_path; -- -- DBusGProxyCall *call; --} GdmUserManagerFetchUserRequest; -- --struct GdmUserManagerPrivate --{ -- GHashTable *users_by_name; -- GHashTable *users_by_object_path; -- GHashTable *sessions; -- GHashTable *shells; -- DBusGConnection *connection; -- DBusGProxyCall *get_sessions_call; -- DBusGProxy *accounts_proxy; -- -- GdmUserManagerSeat seat; -- -- GSList *new_sessions; -- GSList *new_users; -- GSList *fetch_user_requests; -- -- GFileMonitor *passwd_monitor; -- GFileMonitor *shells_monitor; -- -- GSList *exclude_usernames; -- GSList *include_usernames; -- gboolean include_all; -- -- gboolean load_passwd_pending; -- -- guint load_id; -- guint reload_passwd_id; -- guint ck_history_id; -- guint ck_history_watchdog_id; -- GPid ck_history_pid; -- -- gboolean is_loaded; -- gboolean has_multiple_users; -- gboolean listing_cached_users; --}; -- --enum { -- PROP_0, -- PROP_INCLUDE_ALL, -- PROP_INCLUDE_USERNAMES_LIST, -- PROP_EXCLUDE_USERNAMES_LIST, -- PROP_IS_LOADED, -- PROP_HAS_MULTIPLE_USERS --}; -- --enum { -- USER_ADDED, -- USER_REMOVED, -- USER_IS_LOGGED_IN_CHANGED, -- USER_CHANGED, -- LAST_SIGNAL --}; -- --static guint signals [LAST_SIGNAL] = { 0, }; -- --static void gdm_user_manager_class_init (GdmUserManagerClass *klass); --static void gdm_user_manager_init (GdmUserManager *user_manager); --static void gdm_user_manager_finalize (GObject *object); -- --static void load_users_manually (GdmUserManager *manager); --static void monitor_local_users (GdmUserManager *manager); --static void load_seat_incrementally (GdmUserManager *manager); --static void unload_seat (GdmUserManager *manager); --static void load_users (GdmUserManager *manager); --static void queue_load_seat_and_users (GdmUserManager *manager); --static void monitor_local_users (GdmUserManager *manager); -- --static void load_new_session_incrementally (GdmUserManagerNewSession *new_session); --static void set_is_loaded (GdmUserManager *manager, gboolean is_loaded); -- --static void on_new_user_loaded (GdmUser *user, -- GParamSpec *pspec, -- GdmUserManager *manager); --static void give_up_and_fetch_user_locally (GdmUserManager *manager, -- GdmUserManagerFetchUserRequest *request); --static void fetch_user_locally (GdmUserManager *manager, -- GdmUser *user, -- const char *username); --static void fetch_user_incrementally (GdmUserManagerFetchUserRequest *request); -- --static void maybe_set_is_loaded (GdmUserManager *manager); --static gpointer user_manager_object = NULL; -- --G_DEFINE_TYPE (GdmUserManager, gdm_user_manager, G_TYPE_OBJECT) -- --GQuark --gdm_user_manager_error_quark (void) --{ -- static GQuark ret = 0; -- if (ret == 0) { -- ret = g_quark_from_static_string ("gdm_user_manager_error"); -- } -- -- return ret; --} -- --static gboolean --start_new_login_session (GdmUserManager *manager) --{ -- GError *error; -- gboolean res; -- -- res = g_spawn_command_line_async ("gdmflexiserver -s", &error); -- if (! res) { -- if (error != NULL) { -- g_warning ("Unable to start new login: %s", error->message); -- g_error_free (error); -- } else { -- g_warning ("Unable to start new login"); -- } -- } -- -- return res; --} -- --static gboolean --activate_session_id (GdmUserManager *manager, -- const char *seat_id, -- const char *session_id) --{ -- DBusError local_error; -- DBusMessage *message; -- DBusMessage *reply; -- gboolean ret; -- -- ret = FALSE; -- reply = NULL; -- -- dbus_error_init (&local_error); -- message = dbus_message_new_method_call ("org.freedesktop.ConsoleKit", -- seat_id, -- "org.freedesktop.ConsoleKit.Seat", -- "ActivateSession"); -- if (message == NULL) { -- goto out; -- } -- -- if (! dbus_message_append_args (message, -- DBUS_TYPE_OBJECT_PATH, &session_id, -- DBUS_TYPE_INVALID)) { -- goto out; -- } -- -- -- dbus_error_init (&local_error); -- reply = dbus_connection_send_with_reply_and_block (dbus_g_connection_get_connection (manager->priv->connection), -- message, -- -1, -- &local_error); -- if (reply == NULL) { -- if (dbus_error_is_set (&local_error)) { -- g_warning ("Unable to activate session: %s", local_error.message); -- dbus_error_free (&local_error); -- goto out; -- } -- } -- -- ret = TRUE; -- out: -- if (message != NULL) { -- dbus_message_unref (message); -- } -- if (reply != NULL) { -- dbus_message_unref (reply); -- } -- -- return ret; --} -- --static gboolean --session_is_login_window (GdmUserManager *manager, -- const char *session_id) --{ -- DBusGProxy *proxy; -- GError *error; -- gboolean res; -- gboolean ret; -- char *session_type; -- -- ret = FALSE; -- -- proxy = dbus_g_proxy_new_for_name (manager->priv->connection, -- CK_NAME, -- session_id, -- CK_SESSION_INTERFACE); -- if (proxy == NULL) { -- g_warning ("Failed to connect to the ConsoleKit seat object"); -- goto out; -- } -- -- session_type = NULL; -- error = NULL; -- res = dbus_g_proxy_call (proxy, -- "GetSessionType", -- &error, -- G_TYPE_INVALID, -- G_TYPE_STRING, &session_type, -- G_TYPE_INVALID); -- if (! res) { -- if (error != NULL) { -- g_debug ("GdmUserManager: Failed to identify the session type: %s", error->message); -- g_error_free (error); -- } else { -- g_debug ("GdmUserManager: Failed to identify the session type"); -- } -- goto out; -- } -- -- if (session_type == NULL || session_type[0] == '\0' || strcmp (session_type, "LoginWindow") != 0) { -- goto out; -- } -- -- ret = TRUE; -- -- out: -- if (proxy != NULL) { -- g_object_unref (proxy); -- } -- -- return ret; --} -- --static char * --_get_login_window_session_id (GdmUserManager *manager) --{ -- gboolean res; -- gboolean can_activate_sessions; -- GError *error; -- GPtrArray *sessions; -- char *primary_ssid; -- int i; -- -- if (manager->priv->seat.id == NULL || manager->priv->seat.id[0] == '\0') { -- g_debug ("GdmUserManager: display seat ID is not set; can't switch sessions"); -- return NULL; -- } -- -- primary_ssid = NULL; -- sessions = NULL; -- -- can_activate_sessions = gdm_user_manager_can_switch (manager); -- -- if (! can_activate_sessions) { -- g_debug ("GdmUserManager: seat is unable to activate sessions"); -- goto out; -- } -- -- error = NULL; -- res = dbus_g_proxy_call (manager->priv->seat.proxy, -- "GetSessions", -- &error, -- G_TYPE_INVALID, -- dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &sessions, -- G_TYPE_INVALID); -- if (! res) { -- if (error != NULL) { -- g_warning ("unable to determine sessions for user: %s", -- error->message); -- g_error_free (error); -- } else { -- g_warning ("unable to determine sessions for user"); -- } -- goto out; -- } -- -- for (i = 0; i < sessions->len; i++) { -- char *ssid; -- -- ssid = g_ptr_array_index (sessions, i); -- -- if (session_is_login_window (manager, ssid)) { -- primary_ssid = g_strdup (ssid); -- break; -- } -- } -- g_ptr_array_foreach (sessions, (GFunc)g_free, NULL); -- g_ptr_array_free (sessions, TRUE); -- -- out: -- -- return primary_ssid; --} -- --gboolean --gdm_user_manager_goto_login_session (GdmUserManager *manager) --{ -- gboolean ret; -- gboolean res; -- char *ssid; -- -- g_return_val_if_fail (GDM_IS_USER_MANAGER (manager), FALSE); -- g_return_val_if_fail (manager->priv->is_loaded, FALSE); -- -- ret = FALSE; -- -- /* First look for any existing LoginWindow sessions on the seat. -- If none are found, create a new one. */ -- -- ssid = _get_login_window_session_id (manager); -- if (ssid != NULL) { -- res = activate_session_id (manager, manager->priv->seat.id, ssid); -- if (res) { -- ret = TRUE; -- } -- } -- -- if (! ret) { -- res = start_new_login_session (manager); -- if (res) { -- ret = TRUE; -- } -- } -- -- return ret; --} -- --gboolean --gdm_user_manager_can_switch (GdmUserManager *manager) --{ -- gboolean res; -- gboolean can_activate_sessions; -- GError *error; -- -- if (!manager->priv->is_loaded) { -- g_debug ("GdmUserManager: Unable to switch sessions until fully loaded"); -- return FALSE; -- } -- -- if (manager->priv->seat.id == NULL || manager->priv->seat.id[0] == '\0') { -- g_debug ("GdmUserManager: display seat ID is not set; can't switch sessions"); -- return FALSE; -- } -- -- g_debug ("GdmUserManager: checking if seat can activate sessions"); -- -- error = NULL; -- res = dbus_g_proxy_call (manager->priv->seat.proxy, -- "CanActivateSessions", -- &error, -- G_TYPE_INVALID, -- G_TYPE_BOOLEAN, &can_activate_sessions, -- G_TYPE_INVALID); -- if (! res) { -- if (error != NULL) { -- g_warning ("unable to determine if seat can activate sessions: %s", -- error->message); -- g_error_free (error); -- } else { -- g_warning ("unable to determine if seat can activate sessions"); -- } -- return FALSE; -- } -- -- return can_activate_sessions; --} -- --gboolean --gdm_user_manager_activate_user_session (GdmUserManager *manager, -- GdmUser *user) --{ -- gboolean ret; -- const char *ssid; -- gboolean res; -- -- gboolean can_activate_sessions; -- g_return_val_if_fail (GDM_IS_USER_MANAGER (manager), FALSE); -- g_return_val_if_fail (GDM_IS_USER (user), FALSE); -- g_return_val_if_fail (manager->priv->is_loaded, FALSE); -- -- ret = FALSE; -- -- can_activate_sessions = gdm_user_manager_can_switch (manager); -- -- if (! can_activate_sessions) { -- g_debug ("GdmUserManager: seat is unable to activate sessions"); -- goto out; -- } -- -- ssid = gdm_user_get_primary_session_id (user); -- if (ssid == NULL) { -- goto out; -- } -- -- res = activate_session_id (manager, manager->priv->seat.id, ssid); -- if (! res) { -- g_debug ("GdmUserManager: unable to activate session: %s", ssid); -- goto out; -- } -- -- ret = TRUE; -- out: -- return ret; --} -- --static void --on_user_sessions_changed (GdmUser *user, -- GdmUserManager *manager) --{ -- guint nsessions; -- -- if (! manager->priv->is_loaded) { -- return; -- } -- -- nsessions = gdm_user_get_num_sessions (user); -- -- g_debug ("GdmUserManager: sessions changed user=%s num=%d", -- gdm_user_get_user_name (user), -- nsessions); -- -- /* only signal on zero and one */ -- if (nsessions > 1) { -- return; -- } -- -- g_signal_emit (manager, signals [USER_IS_LOGGED_IN_CHANGED], 0, user); --} -- --static void --on_user_changed (GdmUser *user, -- GdmUserManager *manager) --{ -- if (manager->priv->is_loaded) { -- g_debug ("GdmUserManager: user changed"); -- g_signal_emit (manager, signals[USER_CHANGED], 0, user); -- } --} -- --static void --on_get_seat_id_finished (DBusGProxy *proxy, -- DBusGProxyCall *call, -- GdmUserManager *manager) --{ -- GError *error; -- char *seat_id; -- gboolean res; -- -- g_assert (manager->priv->seat.get_seat_id_call == call); -- -- error = NULL; -- seat_id = NULL; -- res = dbus_g_proxy_end_call (proxy, -- call, -- &error, -- DBUS_TYPE_G_OBJECT_PATH, -- &seat_id, -- G_TYPE_INVALID); -- manager->priv->seat.get_seat_id_call = NULL; -- g_object_unref (proxy); -- -- if (! res) { -- if (error != NULL) { -- g_debug ("Failed to identify the seat of the " -- "current session: %s", -- error->message); -- g_error_free (error); -- } else { -- g_debug ("Failed to identify the seat of the " -- "current session"); -- } -- unload_seat (manager); -- maybe_set_is_loaded (manager); -- return; -- } -- -- g_debug ("GdmUserManager: Found current seat: %s", seat_id); -- -- manager->priv->seat.id = seat_id; -- manager->priv->seat.state++; -- -- load_seat_incrementally (manager); --} -- --static void --get_seat_id_for_current_session (GdmUserManager *manager) --{ -- DBusGProxy *proxy; -- DBusGProxyCall *call; -- -- proxy = dbus_g_proxy_new_for_name (manager->priv->connection, -- CK_NAME, -- manager->priv->seat.session_id, -- CK_SESSION_INTERFACE); -- if (proxy == NULL) { -- g_warning ("Failed to connect to the ConsoleKit session object"); -- goto failed; -- } -- -- call = dbus_g_proxy_begin_call (proxy, -- "GetSeatId", -- (DBusGProxyCallNotify) -- on_get_seat_id_finished, -- manager, -- NULL, -- G_TYPE_INVALID); -- if (call == NULL) { -- g_warning ("GdmUserManager: failed to make GetSeatId call"); -- goto failed; -- } -- -- manager->priv->seat.get_seat_id_call = call; -- -- return; -- --failed: -- if (proxy != NULL) { -- g_object_unref (proxy); -- } -- -- unload_seat (manager); --} -- --static gint --match_name_cmpfunc (gconstpointer a, -- gconstpointer b) --{ -- return g_strcmp0 ((char *) a, -- (char *) b); --} -- --static gboolean --username_in_exclude_list (GdmUserManager *manager, -- const char *username) --{ -- GSList *found; -- gboolean ret = FALSE; -- -- /* always exclude the "gdm" user. */ -- if (username == NULL || (strcmp (username, GDM_USERNAME) == 0)) { -- return TRUE; -- } -- -- if (manager->priv->exclude_usernames != NULL) { -- found = g_slist_find_custom (manager->priv->exclude_usernames, -- username, -- match_name_cmpfunc); -- if (found != NULL) { -- ret = TRUE; -- } -- } -- -- return ret; --} -- --static void --add_session_for_user (GdmUserManager *manager, -- GdmUser *user, -- const char *ssid) --{ -- g_hash_table_insert (manager->priv->sessions, -- g_strdup (ssid), -- g_strdup (gdm_user_get_user_name (user))); -- -- _gdm_user_add_session (user, ssid); -- g_debug ("GdmUserManager: added session for user: %s", gdm_user_get_user_name (user)); --} -- --static void --set_has_multiple_users (GdmUserManager *manager, -- gboolean has_multiple_users) --{ -- if (manager->priv->has_multiple_users != has_multiple_users) { -- manager->priv->has_multiple_users = has_multiple_users; -- g_object_notify (G_OBJECT (manager), "has-multiple-users"); -- } --} -- --static GdmUser * --create_new_user (GdmUserManager *manager) --{ -- GdmUser *user; -- -- user = g_object_new (GDM_TYPE_USER, NULL); -- -- manager->priv->new_users = g_slist_prepend (manager->priv->new_users, user); -- -- g_signal_connect (user, "notify::is-loaded", G_CALLBACK (on_new_user_loaded), manager); -- -- return g_object_ref (user); --} -- --static void --add_user (GdmUserManager *manager, -- GdmUser *user) --{ -- const char *object_path; -- -- g_hash_table_insert (manager->priv->users_by_name, -- g_strdup (gdm_user_get_user_name (user)), -- g_object_ref (user)); -- -- object_path = gdm_user_get_object_path (user); -- if (object_path != NULL) { -- g_hash_table_insert (manager->priv->users_by_object_path, -- (gpointer) object_path, -- g_object_ref (user)); -- } -- -- g_signal_connect (user, -- "sessions-changed", -- G_CALLBACK (on_user_sessions_changed), -- manager); -- g_signal_connect (user, -- "changed", -- G_CALLBACK (on_user_changed), -- manager); -- -- if (manager->priv->is_loaded) { -- g_signal_emit (manager, signals[USER_ADDED], 0, user); -- } -- -- if (g_hash_table_size (manager->priv->users_by_name) > 1) { -- set_has_multiple_users (manager, TRUE); -- } --} -- --static void --remove_user (GdmUserManager *manager, -- GdmUser *user) --{ -- g_object_ref (user); -- -- g_signal_handlers_disconnect_by_func (user, on_user_changed, manager); -- g_signal_handlers_disconnect_by_func (user, on_user_sessions_changed, manager); -- if (gdm_user_get_object_path (user) != NULL) { -- g_hash_table_remove (manager->priv->users_by_object_path, gdm_user_get_object_path (user)); -- } -- g_hash_table_remove (manager->priv->users_by_name, gdm_user_get_user_name (user)); -- -- if (manager->priv->is_loaded) { -- g_signal_emit (manager, signals[USER_REMOVED], 0, user); -- } -- -- g_object_unref (user); -- -- if (g_hash_table_size (manager->priv->users_by_name) > 1) { -- set_has_multiple_users (manager, FALSE); -- } --} -- --static void --on_new_user_loaded (GdmUser *user, -- GParamSpec *pspec, -- GdmUserManager *manager) --{ -- const char *username; -- GdmUser *old_user; -- -- if (!gdm_user_is_loaded (user)) { -- return; -- } -- -- g_signal_handlers_disconnect_by_func (user, on_new_user_loaded, manager); -- manager->priv->new_users = g_slist_remove (manager->priv->new_users, -- user); -- -- username = gdm_user_get_user_name (user); -- -- if (username == NULL) { -- const char *object_path; -- -- object_path = gdm_user_get_object_path (user); -- -- if (object_path != NULL) { -- g_warning ("GdmUserManager: user has no username " -- "(object path: %s, uid: %lu)", -- object_path, gdm_user_get_uid (user)); -- } else { -- g_warning ("GdmUserManager: user has no username (uid: %lu)", -- gdm_user_get_uid (user)); -- } -- g_object_unref (user); -- return; -- } -- -- if (username_in_exclude_list (manager, username)) { -- g_debug ("GdmUserManager: excluding user '%s'", username); -- g_object_unref (user); -- return; -- } -- -- old_user = g_hash_table_lookup (manager->priv->users_by_name, username); -- -- /* If username got added earlier by a different means, trump it now. -- */ -- if (old_user != NULL) { -- remove_user (manager, old_user); -- } -- -- add_user (manager, user); -- g_object_unref (user); -- -- if (manager->priv->new_users == NULL) { -- set_is_loaded (manager, TRUE); -- } --} -- --static GdmUser * --add_new_user_for_object_path (const char *object_path, -- GdmUserManager *manager) --{ -- GdmUser *user; -- -- user = g_hash_table_lookup (manager->priv->users_by_object_path, object_path); -- -- if (user != NULL) { -- return user; -- } -- user = create_new_user (manager); -- _gdm_user_update_from_object_path (user, object_path); -- -- return user; --} -- --static void --on_new_user_in_accounts_service (DBusGProxy *proxy, -- const char *object_path, -- gpointer user_data) --{ -- GdmUserManager *manager = GDM_USER_MANAGER (user_data); -- -- add_new_user_for_object_path (object_path, manager); --} -- --static void --on_user_removed_in_accounts_service (DBusGProxy *proxy, -- const char *object_path, -- gpointer user_data) --{ -- GdmUserManager *manager = GDM_USER_MANAGER (user_data); -- GdmUser *user; -- -- user = g_hash_table_lookup (manager->priv->users_by_object_path, object_path); -- -- manager->priv->new_users = g_slist_remove (manager->priv->new_users, user); -- -- remove_user (manager, user); --} -- --static void --on_get_current_session_finished (DBusGProxy *proxy, -- DBusGProxyCall *call, -- GdmUserManager *manager) --{ -- GError *error; -- char *session_id; -- gboolean res; -- -- g_assert (manager->priv->seat.get_current_session_call == call); -- g_assert (manager->priv->seat.state == GDM_USER_MANAGER_SEAT_STATE_GET_SESSION_ID); -- -- error = NULL; -- session_id = NULL; -- res = dbus_g_proxy_end_call (proxy, -- call, -- &error, -- DBUS_TYPE_G_OBJECT_PATH, -- &session_id, -- G_TYPE_INVALID); -- manager->priv->seat.get_current_session_call = NULL; -- g_object_unref (proxy); -- -- if (! res) { -- if (error != NULL) { -- g_debug ("Failed to identify the current session: %s", -- error->message); -- g_error_free (error); -- } else { -- g_debug ("Failed to identify the current session"); -- } -- unload_seat (manager); -- maybe_set_is_loaded (manager); -- return; -- } -- -- manager->priv->seat.session_id = session_id; -- manager->priv->seat.state++; -- -- load_seat_incrementally (manager); --} -- --static void --get_current_session_id (GdmUserManager *manager) --{ -- DBusGProxy *proxy; -- DBusGProxyCall *call; -- -- proxy = dbus_g_proxy_new_for_name (manager->priv->connection, -- CK_NAME, -- CK_MANAGER_PATH, -- CK_MANAGER_INTERFACE); -- if (proxy == NULL) { -- g_warning ("Failed to connect to the ConsoleKit manager object"); -- goto failed; -- } -- -- call = dbus_g_proxy_begin_call (proxy, -- "GetCurrentSession", -- (DBusGProxyCallNotify) -- on_get_current_session_finished, -- manager, -- NULL, -- G_TYPE_INVALID); -- if (call == NULL) { -- g_warning ("GdmUserManager: failed to make GetCurrentSession call"); -- goto failed; -- } -- -- manager->priv->seat.get_current_session_call = call; -- -- return; -- --failed: -- if (proxy != NULL) { -- g_object_unref (proxy); -- } -- -- unload_seat (manager); --} -- --static void --unload_new_session (GdmUserManagerNewSession *new_session) --{ -- GdmUserManager *manager; -- -- manager = new_session->manager; -- -- manager->priv->new_sessions = g_slist_remove (manager->priv->new_sessions, -- new_session); -- -- if (new_session->proxy != NULL) { -- g_object_unref (new_session->proxy); -- } -- -- g_free (new_session->x11_display); -- g_free (new_session->id); -- -- g_slice_free (GdmUserManagerNewSession, new_session); --} -- --static void --get_proxy_for_new_session (GdmUserManagerNewSession *new_session) --{ -- GdmUserManager *manager; -- DBusGProxy *proxy; -- -- manager = new_session->manager; -- -- proxy = dbus_g_proxy_new_for_name (manager->priv->connection, -- CK_NAME, -- new_session->id, -- CK_SESSION_INTERFACE); -- if (proxy == NULL) { -- g_warning ("Failed to connect to the ConsoleKit '%s' object", -- new_session->id); -- unload_new_session (new_session); -- return; -- } -- -- new_session->proxy = proxy; -- new_session->state++; -- -- load_new_session_incrementally (new_session); --} -- --static void --on_get_unix_user_finished (DBusGProxy *proxy, -- DBusGProxyCall *call, -- GdmUserManagerNewSession *new_session) --{ -- GdmUserManager *manager; -- GError *error; -- guint uid; -- gboolean res; -- -- manager = new_session->manager; -- -- g_assert (new_session->get_unix_user_call == call); -- -- error = NULL; -- -- uid = (guint) -1; -- res = dbus_g_proxy_end_call (proxy, -- call, -- &error, -- G_TYPE_UINT, &uid, -- G_TYPE_INVALID); -- new_session->get_unix_user_call = NULL; -- -- if (! res) { -- if (error != NULL) { -- g_debug ("Failed to get uid of session '%s': %s", -- new_session->id, error->message); -- g_error_free (error); -- } else { -- g_debug ("Failed to get uid of session '%s'", -- new_session->id); -- } -- unload_new_session (new_session); -- return; -- } -- -- g_debug ("GdmUserManager: Found uid of session '%s': %u", -- new_session->id, uid); -- -- new_session->uid = (uid_t) uid; -- new_session->state++; -- -- load_new_session_incrementally (new_session); --} -- --static void --get_uid_for_new_session (GdmUserManagerNewSession *new_session) --{ -- DBusGProxyCall *call; -- -- g_assert (new_session->proxy != NULL); -- -- call = dbus_g_proxy_begin_call (new_session->proxy, -- "GetUnixUser", -- (DBusGProxyCallNotify) -- on_get_unix_user_finished, -- new_session, -- NULL, -- G_TYPE_INVALID); -- if (call == NULL) { -- g_warning ("GdmUserManager: failed to make GetUnixUser call"); -- goto failed; -- } -- -- new_session->get_unix_user_call = call; -- return; -- --failed: -- unload_new_session (new_session); --} -- --static void --on_find_user_by_name_finished (DBusGProxy *proxy, -- DBusGProxyCall *call, -- GdmUserManagerFetchUserRequest *request) --{ -- GdmUserManager *manager; -- GError *error; -- char *object_path; -- gboolean res; -- -- g_assert (request->call == call); -- -- error = NULL; -- object_path = NULL; -- manager = request->manager; -- res = dbus_g_proxy_end_call (manager->priv->accounts_proxy, -- call, -- &error, -- DBUS_TYPE_G_OBJECT_PATH, -- &object_path, -- G_TYPE_INVALID); -- if (! res) { -- if (error != NULL) { -- g_debug ("GdmUserManager: Failed to find user %s: %s", -- request->username, error->message); -- g_error_free (error); -- } else { -- g_debug ("GdmUserManager: Failed to find user %s", -- request->username); -- } -- give_up_and_fetch_user_locally (manager, request); -- return; -- } -- -- g_debug ("GdmUserManager: Found object path of user '%s': %s", -- request->username, object_path); -- request->object_path = object_path; -- request->state++; -- -- fetch_user_incrementally (request); --} -- --static void --find_user_in_accounts_service (GdmUserManager *manager, -- GdmUserManagerFetchUserRequest *request) --{ -- DBusGProxyCall *call; -- -- g_debug ("GdmUserManager: Looking for user %s in accounts service", -- request->username); -- -- g_assert (manager->priv->accounts_proxy != NULL); -- -- call = dbus_g_proxy_begin_call (manager->priv->accounts_proxy, -- "FindUserByName", -- (DBusGProxyCallNotify) -- on_find_user_by_name_finished, -- request, -- NULL, -- G_TYPE_STRING, -- request->username, -- G_TYPE_INVALID); -- -- if (call == NULL) { -- g_warning ("GdmUserManager: failed to make FindUserByName('%s') call", -- request->username); -- goto failed; -- } -- -- request->call = call; -- return; -- --failed: -- give_up_and_fetch_user_locally (manager, request); --} -- --static void --set_is_loaded (GdmUserManager *manager, -- gboolean is_loaded) --{ -- if (manager->priv->is_loaded != is_loaded) { -- manager->priv->is_loaded = is_loaded; -- g_object_notify (G_OBJECT (manager), "is-loaded"); -- } --} -- --static void --on_list_cached_users_finished (DBusGProxy *proxy, -- DBusGProxyCall *call_id, -- gpointer data) --{ -- GdmUserManager *manager = data; -- GError *error = NULL; -- GPtrArray *paths; -- -- manager->priv->listing_cached_users = FALSE; -- if (!dbus_g_proxy_end_call (proxy, -- call_id, -- &error, -- dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &paths, -- G_TYPE_INVALID)) { -- g_debug ("GdmUserManager: ListCachedUsers failed: %s", error->message); -- g_error_free (error); -- -- g_object_unref (manager->priv->accounts_proxy); -- manager->priv->accounts_proxy = NULL; -- -- load_users_manually (manager); -- -- return; -- } -- -- maybe_set_is_loaded (manager); -- -- g_ptr_array_foreach (paths, (GFunc)add_new_user_for_object_path, manager); -- -- g_ptr_array_foreach (paths, (GFunc)g_free, NULL); -- g_ptr_array_free (paths, TRUE); -- -- /* Add users who are specifically included */ -- if (manager->priv->include_usernames != NULL) { -- GSList *l; -- -- for (l = manager->priv->include_usernames; l != NULL; l = l->next) { -- GdmUser *user; -- -- g_debug ("GdmUserManager: Adding included user %s", (char *)l->data); -- /* -- * The call to gdm_user_manager_get_user will add the user if it is -- * valid and not already in the hash. -- */ -- user = gdm_user_manager_get_user (manager, l->data); -- if (user == NULL) { -- g_debug ("GdmUserManager: unable to lookup user '%s'", (char *)l->data); -- } -- } -- } --} -- --static void --on_get_x11_display_finished (DBusGProxy *proxy, -- DBusGProxyCall *call, -- GdmUserManagerNewSession *new_session) --{ -- GError *error; -- char *x11_display; -- gboolean res; -- -- g_assert (new_session->get_x11_display_call == call); -- -- error = NULL; -- x11_display = NULL; -- res = dbus_g_proxy_end_call (proxy, -- call, -- &error, -- G_TYPE_STRING, -- &x11_display, -- G_TYPE_INVALID); -- new_session->get_x11_display_call = NULL; -- -- if (! res) { -- if (error != NULL) { -- g_debug ("Failed to get the x11 display of session '%s': %s", -- new_session->id, error->message); -- g_error_free (error); -- } else { -- g_debug ("Failed to get the x11 display of session '%s'", -- new_session->id); -- } -- unload_new_session (new_session); -- return; -- } -- -- g_debug ("GdmUserManager: Found x11 display of session '%s': %s", -- new_session->id, x11_display); -- -- new_session->x11_display = x11_display; -- new_session->state++; -- -- load_new_session_incrementally (new_session); --} -- --static void --get_x11_display_for_new_session (GdmUserManagerNewSession *new_session) --{ -- DBusGProxyCall *call; -- -- g_assert (new_session->proxy != NULL); -- -- call = dbus_g_proxy_begin_call (new_session->proxy, -- "GetX11Display", -- (DBusGProxyCallNotify) -- on_get_x11_display_finished, -- new_session, -- NULL, -- G_TYPE_INVALID); -- if (call == NULL) { -- g_warning ("GdmUserManager: failed to make GetX11Display call"); -- goto failed; -- } -- -- new_session->get_x11_display_call = call; -- return; -- --failed: -- unload_new_session (new_session); --} -- --static gboolean --get_pwent_for_name (const char *name, -- struct passwd **pwentp) --{ -- struct passwd *pwent; -- -- do { -- errno = 0; -- pwent = getpwnam (name); -- } while (pwent == NULL && errno == EINTR); -- -- if (pwentp != NULL) { -- *pwentp = pwent; -- } -- -- return (pwent != NULL); --} -- --static gboolean --get_pwent_for_uid (uid_t uid, -- struct passwd **pwentp) --{ -- struct passwd *pwent; -- -- do { -- errno = 0; -- pwent = getpwuid (uid); -- } while (pwent == NULL && errno == EINTR); -- -- if (pwentp != NULL) { -- *pwentp = pwent; -- } -- -- return (pwent != NULL); --} -- --static void --maybe_add_new_session (GdmUserManagerNewSession *new_session) --{ -- GdmUserManager *manager; -- struct passwd *pwent; -- GdmUser *user; -- -- manager = GDM_USER_MANAGER (new_session->manager); -- -- errno = 0; -- get_pwent_for_uid (new_session->uid, &pwent); -- if (pwent == NULL) { -- g_warning ("Unable to lookup user ID %d: %s", -- (int) new_session->uid, g_strerror (errno)); -- goto failed; -- } -- -- /* check exclusions up front */ -- if (username_in_exclude_list (manager, pwent->pw_name)) { -- g_debug ("GdmUserManager: excluding user '%s'", pwent->pw_name); -- goto failed; -- } -- -- user = gdm_user_manager_get_user (manager, pwent->pw_name); -- if (user == NULL) { -- return; -- } -- -- add_session_for_user (manager, user, new_session->id); -- -- /* if we haven't yet gotten the login frequency -- then at least add one because the session exists */ -- if (gdm_user_get_login_frequency (user) == 0) { -- _gdm_user_update_login_frequency (user, 1); -- } -- -- manager->priv->seat.state = GDM_USER_MANAGER_SEAT_STATE_LOADED; -- unload_new_session (new_session); -- return; -- --failed: -- unload_new_session (new_session); --} -- --static void --load_new_session (GdmUserManager *manager, -- const char *session_id) --{ -- GdmUserManagerNewSession *new_session; -- -- new_session = g_slice_new0 (GdmUserManagerNewSession); -- -- new_session->manager = manager; -- new_session->id = g_strdup (session_id); -- new_session->state = GDM_USER_MANAGER_NEW_SESSION_STATE_UNLOADED + 1; -- -- manager->priv->new_sessions = g_slist_prepend (manager->priv->new_sessions, -- new_session); -- load_new_session_incrementally (new_session); --} -- --static void --seat_session_added (DBusGProxy *seat_proxy, -- const char *session_id, -- GdmUserManager *manager) --{ -- g_debug ("GdmUserManager: Session added: %s", session_id); -- -- load_new_session (manager, session_id); --} -- --static gint --match_new_session_cmpfunc (gconstpointer a, -- gconstpointer b) --{ -- GdmUserManagerNewSession *new_session; -- const char *session_id; -- -- new_session = (GdmUserManagerNewSession *) a; -- session_id = (const char *) b; -- -- return strcmp (new_session->id, session_id); --} -- --static void --seat_session_removed (DBusGProxy *seat_proxy, -- const char *session_id, -- GdmUserManager *manager) --{ -- GdmUser *user; -- GSList *found; -- char *username; -- -- g_debug ("GdmUserManager: Session removed: %s", session_id); -- -- found = g_slist_find_custom (manager->priv->new_sessions, -- session_id, -- match_new_session_cmpfunc); -- -- if (found != NULL) { -- GdmUserManagerNewSession *new_session; -- -- new_session = (GdmUserManagerNewSession *) found->data; -- -- if (new_session->state > GDM_USER_MANAGER_NEW_SESSION_STATE_GET_X11_DISPLAY) { -- g_debug ("GdmUserManager: New session for uid %d on " -- "x11 display %s removed before fully loading", -- (int) new_session->uid, new_session->x11_display); -- } else if (new_session->state > GDM_USER_MANAGER_NEW_SESSION_STATE_GET_UID) { -- g_debug ("GdmUserManager: New session for uid %d " -- "removed before fully loading", -- (int) new_session->uid); -- } else { -- g_debug ("GdmUserManager: New session removed " -- "before fully loading"); -- } -- unload_new_session (new_session); -- return; -- } -- -- /* since the session object may already be gone -- * we can't query CK directly */ -- -- username = g_hash_table_lookup (manager->priv->sessions, session_id); -- if (username == NULL) { -- return; -- } -- -- user = g_hash_table_lookup (manager->priv->users_by_name, username); -- if (user == NULL) { -- /* nothing to do */ -- return; -- } -- -- g_debug ("GdmUserManager: Session removed for %s", username); -- _gdm_user_remove_session (user, session_id); --} -- --static void --on_seat_proxy_destroy (DBusGProxy *proxy, -- GdmUserManager *manager) --{ -- g_debug ("GdmUserManager: seat proxy destroyed"); -- -- manager->priv->seat.proxy = NULL; --} -- --static void --get_seat_proxy (GdmUserManager *manager) --{ -- DBusGProxy *proxy; -- GError *error; -- -- g_assert (manager->priv->seat.proxy == NULL); -- -- error = NULL; -- proxy = dbus_g_proxy_new_for_name_owner (manager->priv->connection, -- CK_NAME, -- manager->priv->seat.id, -- CK_SEAT_INTERFACE, -- &error); -- -- if (proxy == NULL) { -- if (error != NULL) { -- g_warning ("Failed to connect to the ConsoleKit seat object: %s", -- error->message); -- g_error_free (error); -- } else { -- g_warning ("Failed to connect to the ConsoleKit seat object"); -- } -- unload_seat (manager); -- return; -- } -- -- g_signal_connect (proxy, "destroy", G_CALLBACK (on_seat_proxy_destroy), manager); -- -- dbus_g_proxy_add_signal (proxy, -- "SessionAdded", -- DBUS_TYPE_G_OBJECT_PATH, -- G_TYPE_INVALID); -- dbus_g_proxy_add_signal (proxy, -- "SessionRemoved", -- DBUS_TYPE_G_OBJECT_PATH, -- G_TYPE_INVALID); -- dbus_g_proxy_connect_signal (proxy, -- "SessionAdded", -- G_CALLBACK (seat_session_added), -- manager, -- NULL); -- dbus_g_proxy_connect_signal (proxy, -- "SessionRemoved", -- G_CALLBACK (seat_session_removed), -- manager, -- NULL); -- manager->priv->seat.proxy = proxy; -- manager->priv->seat.state = GDM_USER_MANAGER_SEAT_STATE_LOADED; --} -- --static void --unload_seat (GdmUserManager *manager) --{ -- manager->priv->seat.state = GDM_USER_MANAGER_SEAT_STATE_UNLOADED; -- -- if (manager->priv->seat.proxy != NULL) { -- g_object_unref (manager->priv->seat.proxy); -- manager->priv->seat.proxy = NULL; -- } -- -- g_free (manager->priv->seat.id); -- manager->priv->seat.id = NULL; -- -- g_free (manager->priv->seat.session_id); -- manager->priv->seat.session_id = NULL; --} -- --static void --get_accounts_proxy (GdmUserManager *manager) --{ -- DBusGProxy *proxy; -- GError *error; -- -- g_assert (manager->priv->accounts_proxy == NULL); -- -- error = NULL; -- proxy = dbus_g_proxy_new_for_name (manager->priv->connection, -- ACCOUNTS_NAME, -- ACCOUNTS_PATH, -- ACCOUNTS_INTERFACE); -- manager->priv->accounts_proxy = proxy; -- -- dbus_g_proxy_add_signal (proxy, -- "UserAdded", -- DBUS_TYPE_G_OBJECT_PATH, -- G_TYPE_INVALID); -- dbus_g_proxy_add_signal (proxy, -- "UserDeleted", -- DBUS_TYPE_G_OBJECT_PATH, -- G_TYPE_INVALID); -- -- dbus_g_proxy_connect_signal (proxy, -- "UserAdded", -- G_CALLBACK (on_new_user_in_accounts_service), -- manager, -- NULL); -- dbus_g_proxy_connect_signal (proxy, -- "UserDeleted", -- G_CALLBACK (on_user_removed_in_accounts_service), -- manager, -- NULL); --} -- --static void --load_new_session_incrementally (GdmUserManagerNewSession *new_session) --{ -- switch (new_session->state) { -- case GDM_USER_MANAGER_NEW_SESSION_STATE_GET_PROXY: -- get_proxy_for_new_session (new_session); -- break; -- case GDM_USER_MANAGER_NEW_SESSION_STATE_GET_UID: -- get_uid_for_new_session (new_session); -- break; -- case GDM_USER_MANAGER_NEW_SESSION_STATE_GET_X11_DISPLAY: -- get_x11_display_for_new_session (new_session); -- break; -- case GDM_USER_MANAGER_NEW_SESSION_STATE_MAYBE_ADD: -- maybe_add_new_session (new_session); -- break; -- case GDM_USER_MANAGER_NEW_SESSION_STATE_LOADED: -- break; -- default: -- g_assert_not_reached (); -- } --} -- --static void --free_fetch_user_request (GdmUserManagerFetchUserRequest *request) --{ -- GdmUserManager *manager; -- -- manager = request->manager; -- -- manager->priv->fetch_user_requests = g_slist_remove (manager->priv->fetch_user_requests, request); -- g_free (request->username); -- g_free (request->object_path); -- g_slice_free (GdmUserManagerFetchUserRequest, request); --} -- --static void --give_up_and_fetch_user_locally (GdmUserManager *manager, -- GdmUserManagerFetchUserRequest *request) --{ -- -- g_debug ("GdmUserManager: account service unavailable, " -- "fetching user %s locally", -- request->username); -- fetch_user_locally (manager, request->user, request->username); -- request->state = GDM_USER_MANAGER_GET_USER_STATE_UNFETCHED; --} -- --static void --on_user_manager_maybe_ready_for_request (GdmUserManager *manager, -- GParamSpec *pspec, -- GdmUserManagerFetchUserRequest *request) --{ -- if (!manager->priv->is_loaded) { -- return; -- } -- -- g_signal_handlers_disconnect_by_func (manager, on_user_manager_maybe_ready_for_request, request); -- -- request->state++; -- fetch_user_incrementally (request); --} -- --static void --fetch_user_incrementally (GdmUserManagerFetchUserRequest *request) --{ -- GdmUserManager *manager; -- -- g_debug ("GdmUserManager: finding user %s state %d", -- request->username, request->state); -- manager = request->manager; -- switch (request->state) { -- case GDM_USER_MANAGER_GET_USER_STATE_WAIT_FOR_LOADED: -- if (manager->priv->is_loaded) { -- request->state++; -- fetch_user_incrementally (request); -- } else { -- g_debug ("GdmUserManager: waiting for user manager to load before finding user %s", -- request->username); -- g_signal_connect (manager, "notify::is-loaded", -- G_CALLBACK (on_user_manager_maybe_ready_for_request), request); -- -- } -- break; -- -- case GDM_USER_MANAGER_GET_USER_STATE_ASK_ACCOUNTS_SERVICE: -- if (manager->priv->accounts_proxy == NULL) { -- give_up_and_fetch_user_locally (manager, request); -- } else { -- find_user_in_accounts_service (manager, request); -- } -- break; -- case GDM_USER_MANAGER_GET_USER_STATE_FETCHED: -- g_debug ("GdmUserManager: user %s fetched", request->username); -- _gdm_user_update_from_object_path (request->user, request->object_path); -- break; -- case GDM_USER_MANAGER_GET_USER_STATE_UNFETCHED: -- g_debug ("GdmUserManager: user %s was not fetched", request->username); -- break; -- default: -- g_assert_not_reached (); -- } -- -- if (request->state == GDM_USER_MANAGER_GET_USER_STATE_FETCHED || -- request->state == GDM_USER_MANAGER_GET_USER_STATE_UNFETCHED) { -- g_debug ("GdmUserManager: finished handling request for user %s", -- request->username); -- free_fetch_user_request (request); -- } --} -- --static void --fetch_user_from_accounts_service (GdmUserManager *manager, -- GdmUser *user, -- const char *username) --{ -- GdmUserManagerFetchUserRequest *request; -- -- request = g_slice_new0 (GdmUserManagerFetchUserRequest); -- -- request->manager = manager; -- request->username = g_strdup (username); -- request->user = user; -- request->state = GDM_USER_MANAGER_GET_USER_STATE_UNFETCHED + 1; -- -- manager->priv->fetch_user_requests = g_slist_prepend (manager->priv->fetch_user_requests, -- request); -- fetch_user_incrementally (request); --} -- --static void --fetch_user_locally (GdmUserManager *manager, -- GdmUser *user, -- const char *username) --{ -- struct passwd *pwent; -- -- get_pwent_for_name (username, &pwent); -- -- if (pwent != NULL) { -- _gdm_user_update_from_pwent (user, pwent); -- } --} -- --/** -- * gdm_user_manager_get_user: -- * @manager: the manager to query. -- * @username: the login name of the user to get. -- * -- * Retrieves a pointer to the #GdmUser object for the login @username -- * from @manager. Trying to use this object before its -- * #GdmUser:is-loaded property is %TRUE will result in undefined -- * behavior. -- * -- * Returns: (transfer none): #GdmUser object -- **/ --GdmUser * --gdm_user_manager_get_user (GdmUserManager *manager, -- const char *username) --{ -- GdmUser *user; -- -- g_return_val_if_fail (GDM_IS_USER_MANAGER (manager), NULL); -- g_return_val_if_fail (username != NULL && username[0] != '\0', NULL); -- -- user = g_hash_table_lookup (manager->priv->users_by_name, username); -- -- /* if we don't have it loaded try to load it now */ -- if (user == NULL) { -- user = create_new_user (manager); -- -- if (manager->priv->accounts_proxy != NULL) { -- fetch_user_from_accounts_service (manager, user, username); -- } else { -- fetch_user_locally (manager, user, username); -- } -- } -- -- return user; --} -- --/** -- * gdm_user_manager_get_user_by_uid: -- * @manager: the manager to query. -- * @uid: the uid of the user to get. -- * -- * Retrieves a pointer to the #GdmUser object for the uid @uid -- * from @manager. Trying to use this object before its -- * #GdmUser:is-loaded property is %TRUE will result in undefined -- * behavior. -- * -- * Returns: (transfer none): #GdmUser object -- */ --GdmUser * --gdm_user_manager_get_user_by_uid (GdmUserManager *manager, -- gulong uid) --{ -- struct passwd *pwent; -- -- g_return_val_if_fail (GDM_IS_USER_MANAGER (manager), NULL); -- -- get_pwent_for_uid (uid, &pwent); -- if (pwent == NULL) { -- g_warning ("GdmUserManager: unable to lookup uid %d", (int)uid); -- return NULL; -- } -- -- return gdm_user_manager_get_user (manager, pwent->pw_name); --} -- --static void --listify_hash_values_hfunc (gpointer key, -- gpointer value, -- gpointer user_data) --{ -- GSList **list = user_data; -- -- *list = g_slist_prepend (*list, value); --} -- --/** -- * gdm_user_manager_list_users: -- * @manager: a #GdmUserManager -- * -- * Get a list of system user accounts -- * -- * Returns: (element-type GdmUser) (transfer full): List of #GdmUser objects -- */ --GSList * --gdm_user_manager_list_users (GdmUserManager *manager) --{ -- GSList *retval; -- -- g_return_val_if_fail (GDM_IS_USER_MANAGER (manager), NULL); -- -- retval = NULL; -- g_hash_table_foreach (manager->priv->users_by_name, listify_hash_values_hfunc, &retval); -- -- return g_slist_sort (retval, (GCompareFunc) gdm_user_collate); --} -- --static gboolean --parse_value_as_ulong (const char *value, -- gulong *ulongval) --{ -- char *end_of_valid_long; -- glong long_value; -- gulong ulong_value; -- -- errno = 0; -- long_value = strtol (value, &end_of_valid_long, 10); -- -- if (*value == '\0' || *end_of_valid_long != '\0') { -- return FALSE; -- } -- -- ulong_value = long_value; -- if (ulong_value != long_value || errno == ERANGE) { -- return FALSE; -- } -- -- *ulongval = ulong_value; -- -- return TRUE; --} -- --static gboolean --parse_ck_history_line (const char *line, -- char **user_namep, -- gulong *frequencyp) --{ -- GRegex *re; -- GMatchInfo *match_info; -- gboolean res; -- gboolean ret; -- GError *error; -- -- ret = FALSE; -- re = NULL; -- match_info = NULL; -- -- error = NULL; -- re = g_regex_new ("(?P[0-9a-zA-Z]+)[ ]+(?P[0-9]+)", 0, 0, &error); -- if (re == NULL) { -- if (error != NULL) { -- g_critical ("%s", error->message); -- } else { -- g_critical ("Error in regex call"); -- } -- goto out; -- } -- -- g_regex_match (re, line, 0, &match_info); -- -- res = g_match_info_matches (match_info); -- if (! res) { -- g_warning ("Unable to parse history: %s", line); -- goto out; -- } -- -- if (user_namep != NULL) { -- *user_namep = g_match_info_fetch_named (match_info, "username"); -- } -- -- if (frequencyp != NULL) { -- char *freq; -- freq = g_match_info_fetch_named (match_info, "frequency"); -- res = parse_value_as_ulong (freq, frequencyp); -- g_free (freq); -- if (! res) { -- goto out; -- } -- } -- -- ret = TRUE; -- -- out: -- if (match_info != NULL) { -- g_match_info_free (match_info); -- } -- if (re != NULL) { -- g_regex_unref (re); -- } -- return ret; --} -- --static void --process_ck_history_line (GdmUserManager *manager, -- const char *line) --{ -- gboolean res; -- char *username; -- gulong frequency; -- GdmUser *user; -- -- frequency = 0; -- username = NULL; -- res = parse_ck_history_line (line, &username, &frequency); -- if (! res) { -- return; -- } -- -- if (username_in_exclude_list (manager, username)) { -- g_debug ("GdmUserManager: excluding user '%s'", username); -- g_free (username); -- return; -- } -- -- user = gdm_user_manager_get_user (manager, username); -- if (user == NULL) { -- g_debug ("GdmUserManager: unable to lookup user '%s'", username); -- g_free (username); -- return; -- } -- -- _gdm_user_update_login_frequency (user, frequency); -- g_free (username); --} -- --static void --maybe_set_is_loaded (GdmUserManager *manager) --{ -- if (manager->priv->is_loaded) { -- return; -- } -- -- if (manager->priv->ck_history_pid != 0) { -- return; -- } -- -- if (manager->priv->load_passwd_pending) { -- return; -- } -- -- if (manager->priv->get_sessions_call != NULL) { -- return; -- } -- -- if (manager->priv->listing_cached_users) { -- return; -- } -- -- /* Don't set is_loaded yet unless the seat is already loaded -- * or failed to load. -- */ -- if (manager->priv->seat.state != GDM_USER_MANAGER_SEAT_STATE_LOADED -- && manager->priv->seat.state != GDM_USER_MANAGER_SEAT_STATE_UNLOADED) { -- return; -- } -- -- set_is_loaded (manager, TRUE); --} -- --static gboolean --ck_history_watch (GIOChannel *source, -- GIOCondition condition, -- GdmUserManager *manager) --{ -- GIOStatus status; -- gboolean done = FALSE; -- -- g_return_val_if_fail (manager != NULL, FALSE); -- -- if (condition & G_IO_IN) { -- char *str; -- GError *error; -- -- error = NULL; -- status = g_io_channel_read_line (source, &str, NULL, NULL, &error); -- if (error != NULL) { -- g_warning ("GdmUserManager: unable to read line: %s", error->message); -- g_error_free (error); -- } -- -- if (status == G_IO_STATUS_NORMAL) { -- g_debug ("GdmUserManager: history output: %s", str); -- process_ck_history_line (manager, str); -- } else if (status == G_IO_STATUS_EOF) { -- done = TRUE; -- } -- -- g_free (str); -- } else if (condition & G_IO_HUP) { -- done = TRUE; -- } -- -- if (done) { -- manager->priv->ck_history_id = 0; -- if (manager->priv->ck_history_watchdog_id != 0) { -- g_source_remove (manager->priv->ck_history_watchdog_id); -- manager->priv->ck_history_watchdog_id = 0; -- } -- manager->priv->ck_history_pid = 0; -- -- maybe_set_is_loaded (manager); -- -- return FALSE; -- } -- -- return TRUE; --} -- --static int --signal_pid (int pid, -- int signal) --{ -- int status = -1; -- -- status = kill (pid, signal); -- -- if (status < 0) { -- if (errno == ESRCH) { -- g_debug ("Child process %lu was already dead.", -- (unsigned long) pid); -- } else { -- char buf [1024]; -- snprintf (buf, -- sizeof (buf), -- "Couldn't kill child process %lu", -- (unsigned long) pid); -- perror (buf); -- } -- } -- -- return status; --} -- --static gboolean --ck_history_watchdog (GdmUserManager *manager) --{ -- if (manager->priv->ck_history_pid > 0) { -- g_debug ("Killing ck-history process"); -- signal_pid (manager->priv->ck_history_pid, SIGTERM); -- manager->priv->ck_history_pid = 0; -- } -- -- manager->priv->ck_history_watchdog_id = 0; -- return FALSE; --} -- --static gboolean --load_ck_history (GdmUserManager *manager) --{ -- char *command; -- char *since; -- const char *seat_id; -- GError *error; -- gboolean res; -- char **argv; -- int standard_out; -- GIOChannel *channel; -- GTimeVal tv; -- -- g_assert (manager->priv->ck_history_id == 0); -- -- command = NULL; -- -- seat_id = NULL; -- if (manager->priv->seat.id != NULL -- && g_str_has_prefix (manager->priv->seat.id, "/org/freedesktop/ConsoleKit/")) { -- -- seat_id = manager->priv->seat.id + strlen ("/org/freedesktop/ConsoleKit/"); -- } -- -- if (seat_id == NULL) { -- g_warning ("Unable to load CK history: no seat-id found"); -- goto out; -- } -- -- g_get_current_time (&tv); -- tv.tv_sec -= LOGIN_FREQUENCY_TIME_WINDOW_SECS; -- since = g_time_val_to_iso8601 (&tv); -- -- command = g_strdup_printf ("ck-history --frequent --since='%s' --seat='%s' --session-type=''", -- since, -- seat_id); -- g_free (since); -- g_debug ("GdmUserManager: running '%s'", command); -- error = NULL; -- if (! g_shell_parse_argv (command, NULL, &argv, &error)) { -- if (error != NULL) { -- g_warning ("Could not parse command: %s", error->message); -- g_error_free (error); -- } else { -- g_warning ("Could not parse command"); -- } -- goto out; -- } -- -- error = NULL; -- res = g_spawn_async_with_pipes (NULL, -- argv, -- NULL, -- G_SPAWN_SEARCH_PATH, -- NULL, -- NULL, -- &manager->priv->ck_history_pid, /* pid */ -- NULL, -- &standard_out, -- NULL, -- &error); -- g_strfreev (argv); -- if (! res) { -- if (error != NULL) { -- g_warning ("Unable to run ck-history: %s", error->message); -- g_error_free (error); -- } else { -- g_warning ("Unable to run ck-history"); -- } -- goto out; -- } -- -- channel = g_io_channel_unix_new (standard_out); -- g_io_channel_set_close_on_unref (channel, TRUE); -- g_io_channel_set_flags (channel, -- g_io_channel_get_flags (channel) | G_IO_FLAG_NONBLOCK, -- NULL); -- manager->priv->ck_history_watchdog_id = g_timeout_add_seconds (1, (GSourceFunc) ck_history_watchdog, manager); -- manager->priv->ck_history_id = g_io_add_watch (channel, -- G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, -- (GIOFunc)ck_history_watch, -- manager); -- g_io_channel_unref (channel); -- -- out: -- -- g_free (command); -- -- return manager->priv->ck_history_id != 0; --} -- --static void --reload_passwd_file (GHashTable *valid_shells, -- GSList *exclude_users, -- GSList *include_users, -- gboolean include_all, -- GHashTable *current_users_by_name, -- GSList **added_users, -- GSList **removed_users) --{ -- FILE *fp; -- GHashTableIter iter; -- GHashTable *new_users_by_name; -- GdmUser *user; -- char *name; -- -- new_users_by_name = g_hash_table_new_full (g_str_hash, -- g_str_equal, -- NULL, -- g_object_unref); -- -- errno = 0; -- fp = fopen (PATH_PASSWD, "r"); -- if (fp == NULL) { -- g_warning ("Unable to open %s: %s", PATH_PASSWD, g_strerror (errno)); -- goto out; -- } -- -- /* Make sure we keep users who are logged in no matter what. */ -- g_hash_table_iter_init (&iter, current_users_by_name); -- while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer *) &user)) { -- struct passwd *pwent; -- -- get_pwent_for_name (name, &pwent); -- if (pwent == NULL) { -- continue; -- } -- -- g_object_freeze_notify (G_OBJECT (user)); -- _gdm_user_update_from_pwent (user, pwent); -- g_hash_table_insert (new_users_by_name, (char *)gdm_user_get_user_name (user), g_object_ref (user)); -- } -- -- if (include_users != NULL) { -- GSList *l; -- for (l = include_users; l != NULL; l = l->next) { -- struct passwd *pwent; -- -- get_pwent_for_name (l->data, &pwent); -- if (pwent == NULL) { -- continue; -- } -- -- user = g_hash_table_lookup (new_users_by_name, pwent->pw_name); -- if (user != NULL) { -- /* already there */ -- continue; -- } -- -- user = g_hash_table_lookup (current_users_by_name, pwent->pw_name); -- if (user == NULL) { -- user = g_object_new (GDM_TYPE_USER, NULL); -- } else { -- g_object_ref (user); -- } -- g_object_freeze_notify (G_OBJECT (user)); -- _gdm_user_update_from_pwent (user, pwent); -- g_hash_table_insert (new_users_by_name, (char *)gdm_user_get_user_name (user), user); -- } -- } -- -- if (include_all != TRUE) { -- g_debug ("GdmUserManager: include_all is FALSE"); -- } else { -- struct passwd *pwent; -- -- g_debug ("GdmUserManager: include_all is TRUE"); -- -- for (pwent = fgetpwent (fp); -- pwent != NULL; -- pwent = fgetpwent (fp)) { -- -- /* Skip users below MinimalUID... */ -- if (pwent->pw_uid < FALLBACK_MINIMAL_UID) { -- continue; -- } -- -- /* ...And users w/ invalid shells... */ -- if (pwent->pw_shell == NULL -- || !g_hash_table_lookup (valid_shells, pwent->pw_shell)) { -- g_debug ("GdmUserManager: skipping user with bad shell: %s", pwent->pw_name); -- continue; -- } -- -- /* always exclude the "gdm" user. */ -- if (strcmp (pwent->pw_name, GDM_USERNAME) == 0) { -- continue; -- } -- -- /* ...And explicitly excluded users */ -- if (exclude_users != NULL) { -- GSList *found; -- -- found = g_slist_find_custom (exclude_users, -- pwent->pw_name, -- match_name_cmpfunc); -- if (found != NULL) { -- g_debug ("GdmUserManager: explicitly skipping user: %s", pwent->pw_name); -- continue; -- } -- } -- -- user = g_hash_table_lookup (new_users_by_name, pwent->pw_name); -- if (user != NULL) { -- /* already there */ -- continue; -- } -- -- user = g_hash_table_lookup (current_users_by_name, pwent->pw_name); -- if (user == NULL) { -- user = g_object_new (GDM_TYPE_USER, NULL); -- } else { -- g_object_ref (user); -- } -- -- /* Freeze & update users not already in the new list */ -- g_object_freeze_notify (G_OBJECT (user)); -- _gdm_user_update_from_pwent (user, pwent); -- g_hash_table_insert (new_users_by_name, (char *)gdm_user_get_user_name (user), user); -- } -- } -- -- /* Go through and handle added users */ -- g_hash_table_iter_init (&iter, new_users_by_name); -- while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer *) &user)) { -- GdmUser *user2; -- user2 = g_hash_table_lookup (current_users_by_name, name); -- if (user2 == NULL) { -- *added_users = g_slist_prepend (*added_users, g_object_ref (user)); -- } -- } -- -- /* Go through and handle removed users */ -- g_hash_table_iter_init (&iter, current_users_by_name); -- while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer *) &user)) { -- GdmUser *user2; -- user2 = g_hash_table_lookup (new_users_by_name, name); -- if (user2 == NULL) { -- *removed_users = g_slist_prepend (*removed_users, g_object_ref (user)); -- } -- } -- -- out: -- /* Cleanup */ -- -- fclose (fp); -- -- g_hash_table_iter_init (&iter, new_users_by_name); -- while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer *) &user)) { -- g_object_thaw_notify (G_OBJECT (user)); -- } -- -- g_hash_table_destroy (new_users_by_name); --} -- --typedef struct { -- GdmUserManager *manager; -- GSList *exclude_users; -- GSList *include_users; -- gboolean include_all; -- GHashTable *shells; -- GHashTable *current_users_by_name; -- GSList *added_users; -- GSList *removed_users; --} PasswdData; -- --static void --passwd_data_free (PasswdData *data) --{ -- if (data->manager != NULL) { -- g_object_unref (data->manager); -- } -- -- g_slist_foreach (data->added_users, (GFunc) g_object_unref, NULL); -- g_slist_free (data->added_users); -- -- g_slist_foreach (data->removed_users, (GFunc) g_object_unref, NULL); -- g_slist_free (data->removed_users); -- -- g_slist_foreach (data->exclude_users, (GFunc) g_free, NULL); -- g_slist_free (data->exclude_users); -- -- g_slist_foreach (data->include_users, (GFunc) g_free, NULL); -- g_slist_free (data->include_users); -- -- g_slice_free (PasswdData, data); --} -- --static gboolean --reload_passwd_job_done (PasswdData *data) --{ -- GSList *l; -- -- g_debug ("GdmUserManager: done reloading passwd file"); -- -- /* Go through and handle added users */ -- for (l = data->added_users; l != NULL; l = l->next) { -- add_user (data->manager, l->data); -- } -- -- /* Go through and handle removed users */ -- for (l = data->removed_users; l != NULL; l = l->next) { -- remove_user (data->manager, l->data); -- } -- -- data->manager->priv->load_passwd_pending = FALSE; -- -- if (! data->manager->priv->is_loaded) { -- maybe_set_is_loaded (data->manager); -- -- if (data->manager->priv->include_all == TRUE) { -- monitor_local_users (data->manager); -- } -- } -- -- passwd_data_free (data); -- -- return FALSE; --} -- --static gboolean --do_reload_passwd_job (GIOSchedulerJob *job, -- GCancellable *cancellable, -- PasswdData *data) --{ -- g_debug ("GdmUserManager: reloading passwd file worker"); -- -- reload_passwd_file (data->shells, -- data->exclude_users, -- data->include_users, -- data->include_all, -- data->current_users_by_name, -- &data->added_users, -- &data->removed_users); -- -- g_io_scheduler_job_send_to_mainloop_async (job, -- (GSourceFunc) reload_passwd_job_done, -- data, -- NULL); -- -- return FALSE; --} -- --static GSList * --slist_deep_copy (const GSList *list) --{ -- GSList *retval; -- GSList *l; -- -- if (list == NULL) -- return NULL; -- -- retval = g_slist_copy ((GSList *) list); -- for (l = retval; l != NULL; l = l->next) { -- l->data = g_strdup (l->data); -- } -- -- return retval; --} -- --static void --schedule_reload_passwd (GdmUserManager *manager) --{ -- PasswdData *passwd_data; -- -- manager->priv->load_passwd_pending = TRUE; -- -- passwd_data = g_slice_new0 (PasswdData); -- passwd_data->manager = g_object_ref (manager); -- passwd_data->shells = manager->priv->shells; -- passwd_data->exclude_users = slist_deep_copy (manager->priv->exclude_usernames); -- passwd_data->include_users = slist_deep_copy (manager->priv->include_usernames); -- passwd_data->include_all = manager->priv->include_all; -- passwd_data->current_users_by_name = manager->priv->users_by_name; -- passwd_data->added_users = NULL; -- passwd_data->removed_users = NULL; -- -- g_debug ("GdmUserManager: scheduling a passwd file update"); -- -- g_io_scheduler_push_job ((GIOSchedulerJobFunc) do_reload_passwd_job, -- passwd_data, -- NULL, -- G_PRIORITY_DEFAULT, -- NULL); --} -- --static void --load_sessions_from_array (GdmUserManager *manager, -- const char * const *session_ids, -- int number_of_sessions) --{ -- int i; -- -- for (i = 0; i < number_of_sessions; i++) { -- load_new_session (manager, session_ids[i]); -- } --} -- --static void --on_get_sessions_finished (DBusGProxy *proxy, -- DBusGProxyCall *call, -- GdmUserManager *manager) --{ -- GError *error; -- gboolean res; -- GPtrArray *sessions; -- -- g_assert (manager->priv->get_sessions_call == call); -- -- error = NULL; -- sessions = NULL; -- res = dbus_g_proxy_end_call (proxy, -- call, -- &error, -- GDM_DBUS_TYPE_G_OBJECT_PATH_ARRAY, -- &sessions, -- G_TYPE_INVALID); -- -- if (! res) { -- if (error != NULL) { -- g_warning ("unable to determine sessions for seat: %s", -- error->message); -- g_error_free (error); -- } else { -- g_warning ("unable to determine sessions for seat"); -- } -- return; -- } -- -- manager->priv->get_sessions_call = NULL; -- g_assert (sessions->len <= G_MAXINT); -- load_sessions_from_array (manager, -- (const char * const *) sessions->pdata, -- (int) sessions->len); -- g_ptr_array_foreach (sessions, (GFunc) g_free, NULL); -- g_ptr_array_free (sessions, TRUE); -- maybe_set_is_loaded (manager); --} -- --static void --load_sessions (GdmUserManager *manager) --{ -- DBusGProxyCall *call; -- -- if (manager->priv->seat.proxy == NULL) { -- g_debug ("GdmUserManager: no seat proxy; can't load sessions"); -- return; -- } -- -- call = dbus_g_proxy_begin_call (manager->priv->seat.proxy, -- "GetSessions", -- (DBusGProxyCallNotify) -- on_get_sessions_finished, -- manager, -- NULL, -- G_TYPE_INVALID); -- -- if (call == NULL) { -- g_warning ("GdmUserManager: failed to make GetSessions call"); -- return; -- } -- -- manager->priv->get_sessions_call = call; --} -- --static void --reload_shells (GdmUserManager *manager) --{ -- char *shell; -- -- setusershell (); -- -- g_hash_table_remove_all (manager->priv->shells); -- for (shell = getusershell (); shell != NULL; shell = getusershell ()) { -- /* skip well known not-real shells */ -- if (shell == NULL -- || strcmp (shell, "/sbin/nologin") == 0 -- || strcmp (shell, "/bin/false") == 0) { -- g_debug ("GdmUserManager: skipping shell %s", shell); -- continue; -- } -- g_hash_table_insert (manager->priv->shells, -- g_strdup (shell), -- GUINT_TO_POINTER (TRUE)); -- } -- -- endusershell (); --} -- --static void --load_users_manually (GdmUserManager *manager) --{ -- gboolean res; -- -- manager->priv->shells = g_hash_table_new_full (g_str_hash, -- g_str_equal, -- g_free, -- NULL); -- reload_shells (manager); -- -- load_sessions (manager); -- -- res = load_ck_history (manager); -- schedule_reload_passwd (manager); --} -- --static void --load_users (GdmUserManager *manager) --{ -- g_assert (manager->priv->accounts_proxy != NULL); -- g_debug ("GdmUserManager: calling 'ListCachedUsers'"); -- -- dbus_g_proxy_begin_call (manager->priv->accounts_proxy, -- "ListCachedUsers", -- on_list_cached_users_finished, -- manager, -- NULL, -- G_TYPE_INVALID); -- manager->priv->listing_cached_users = TRUE; --} -- --static void --load_seat_incrementally (GdmUserManager *manager) --{ -- g_assert (manager->priv->seat.proxy == NULL); -- -- switch (manager->priv->seat.state) { -- case GDM_USER_MANAGER_SEAT_STATE_GET_SESSION_ID: -- get_current_session_id (manager); -- break; -- case GDM_USER_MANAGER_SEAT_STATE_GET_ID: -- get_seat_id_for_current_session (manager); -- break; -- case GDM_USER_MANAGER_SEAT_STATE_GET_PROXY: -- get_seat_proxy (manager); -- break; -- case GDM_USER_MANAGER_SEAT_STATE_LOADED: -- break; -- default: -- g_assert_not_reached (); -- } -- -- if (manager->priv->seat.state == GDM_USER_MANAGER_SEAT_STATE_LOADED) { -- gboolean res; -- -- load_sessions (manager); -- res = load_ck_history (manager); -- } -- -- maybe_set_is_loaded (manager); --} -- --static gboolean --load_idle (GdmUserManager *manager) --{ -- manager->priv->seat.state = GDM_USER_MANAGER_SEAT_STATE_UNLOADED + 1; -- load_seat_incrementally (manager); -- load_users (manager); -- manager->priv->load_id = 0; -- -- return FALSE; --} -- --static void --queue_load_seat_and_users (GdmUserManager *manager) --{ -- if (manager->priv->load_id > 0) { -- return; -- } -- -- manager->priv->load_id = g_idle_add ((GSourceFunc)load_idle, manager); --} -- --static gboolean --reload_passwd_idle (GdmUserManager *manager) --{ -- schedule_reload_passwd (manager); -- manager->priv->reload_passwd_id = 0; -- -- return FALSE; --} -- --static void --queue_reload_passwd (GdmUserManager *manager) --{ -- if (manager->priv->reload_passwd_id > 0) { -- g_source_remove (manager->priv->reload_passwd_id); -- } -- -- manager->priv->reload_passwd_id = g_timeout_add_seconds (RELOAD_PASSWD_THROTTLE_SECS, (GSourceFunc)reload_passwd_idle, manager); --} -- --static void --on_shells_monitor_changed (GFileMonitor *monitor, -- GFile *file, -- GFile *other_file, -- GFileMonitorEvent event_type, -- GdmUserManager *manager) --{ -- if (event_type != G_FILE_MONITOR_EVENT_CHANGED && -- event_type != G_FILE_MONITOR_EVENT_CREATED) { -- return; -- } -- -- reload_shells (manager); -- queue_reload_passwd (manager); --} -- --static void --on_passwd_monitor_changed (GFileMonitor *monitor, -- GFile *file, -- GFile *other_file, -- GFileMonitorEvent event_type, -- GdmUserManager *manager) --{ -- if (event_type != G_FILE_MONITOR_EVENT_CHANGED && -- event_type != G_FILE_MONITOR_EVENT_CREATED) { -- return; -- } -- -- queue_reload_passwd (manager); --} -- --static void --gdm_user_manager_get_property (GObject *object, -- guint prop_id, -- GValue *value, -- GParamSpec *pspec) --{ -- GdmUserManager *manager; -- -- manager = GDM_USER_MANAGER (object); -- -- switch (prop_id) { -- case PROP_IS_LOADED: -- g_value_set_boolean (value, manager->priv->is_loaded); -- break; -- case PROP_HAS_MULTIPLE_USERS: -- g_value_set_boolean (value, manager->priv->has_multiple_users); -- break; -- case PROP_INCLUDE_ALL: -- g_value_set_boolean (value, manager->priv->include_all); -- break; -- case PROP_INCLUDE_USERNAMES_LIST: -- g_value_set_pointer (value, manager->priv->include_usernames); -- break; -- case PROP_EXCLUDE_USERNAMES_LIST: -- g_value_set_pointer (value, manager->priv->exclude_usernames); -- break; -- default: -- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); -- break; -- } --} -- --static void --set_include_usernames (GdmUserManager *manager, -- GSList *list) --{ -- if (manager->priv->include_usernames != NULL) { -- g_slist_foreach (manager->priv->include_usernames, (GFunc) g_free, NULL); -- g_slist_free (manager->priv->include_usernames); -- } -- manager->priv->include_usernames = slist_deep_copy (list); --} -- --static void --set_exclude_usernames (GdmUserManager *manager, -- GSList *list) --{ -- if (manager->priv->exclude_usernames != NULL) { -- g_slist_foreach (manager->priv->exclude_usernames, (GFunc) g_free, NULL); -- g_slist_free (manager->priv->exclude_usernames); -- } -- manager->priv->exclude_usernames = slist_deep_copy (list); --} -- --static void --set_include_all (GdmUserManager *manager, -- gboolean all) --{ -- if (manager->priv->include_all != all) { -- manager->priv->include_all = all; -- } --} -- --static void --gdm_user_manager_set_property (GObject *object, -- guint prop_id, -- const GValue *value, -- GParamSpec *pspec) --{ -- GdmUserManager *self; -- -- self = GDM_USER_MANAGER (object); -- -- switch (prop_id) { -- case PROP_INCLUDE_ALL: -- set_include_all (self, g_value_get_boolean (value)); -- break; -- case PROP_INCLUDE_USERNAMES_LIST: -- set_include_usernames (self, g_value_get_pointer (value)); -- break; -- case PROP_EXCLUDE_USERNAMES_LIST: -- set_exclude_usernames (self, g_value_get_pointer (value)); -- break; -- default: -- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); -- break; -- } --} -- --static void --monitor_local_users (GdmUserManager *manager) --{ -- GFile *file; -- GError *error; -- -- g_debug ("GdmUserManager: Monitoring local users"); -- -- /* /etc/shells */ -- file = g_file_new_for_path (_PATH_SHELLS); -- error = NULL; -- manager->priv->shells_monitor = g_file_monitor_file (file, -- G_FILE_MONITOR_NONE, -- NULL, -- &error); -- if (manager->priv->shells_monitor != NULL) { -- g_signal_connect (manager->priv->shells_monitor, -- "changed", -- G_CALLBACK (on_shells_monitor_changed), -- manager); -- } else { -- g_warning ("Unable to monitor %s: %s", _PATH_SHELLS, error->message); -- g_error_free (error); -- } -- g_object_unref (file); -- -- /* /etc/passwd */ -- file = g_file_new_for_path (PATH_PASSWD); -- manager->priv->passwd_monitor = g_file_monitor_file (file, -- G_FILE_MONITOR_NONE, -- NULL, -- &error); -- if (manager->priv->passwd_monitor != NULL) { -- g_signal_connect (manager->priv->passwd_monitor, -- "changed", -- G_CALLBACK (on_passwd_monitor_changed), -- manager); -- } else { -- g_warning ("Unable to monitor %s: %s", PATH_PASSWD, error->message); -- g_error_free (error); -- } -- g_object_unref (file); --} -- --static void --gdm_user_manager_class_init (GdmUserManagerClass *klass) --{ -- GObjectClass *object_class = G_OBJECT_CLASS (klass); -- -- object_class->finalize = gdm_user_manager_finalize; -- object_class->get_property = gdm_user_manager_get_property; -- object_class->set_property = gdm_user_manager_set_property; -- -- g_object_class_install_property (object_class, -- PROP_IS_LOADED, -- g_param_spec_boolean ("is-loaded", -- NULL, -- NULL, -- FALSE, -- G_PARAM_READABLE)); -- g_object_class_install_property (object_class, -- PROP_HAS_MULTIPLE_USERS, -- g_param_spec_boolean ("has-multiple-users", -- NULL, -- NULL, -- FALSE, -- G_PARAM_READABLE)); -- g_object_class_install_property (object_class, -- PROP_INCLUDE_ALL, -- g_param_spec_boolean ("include-all", -- NULL, -- NULL, -- FALSE, -- G_PARAM_READWRITE)); -- g_object_class_install_property (object_class, -- PROP_INCLUDE_USERNAMES_LIST, -- g_param_spec_pointer ("include-usernames-list", -- NULL, -- NULL, -- G_PARAM_READWRITE)); -- -- g_object_class_install_property (object_class, -- PROP_EXCLUDE_USERNAMES_LIST, -- g_param_spec_pointer ("exclude-usernames-list", -- NULL, -- NULL, -- G_PARAM_READWRITE)); -- -- signals [USER_ADDED] = -- g_signal_new ("user-added", -- G_TYPE_FROM_CLASS (klass), -- G_SIGNAL_RUN_LAST, -- G_STRUCT_OFFSET (GdmUserManagerClass, user_added), -- NULL, NULL, -- g_cclosure_marshal_VOID__OBJECT, -- G_TYPE_NONE, 1, GDM_TYPE_USER); -- signals [USER_REMOVED] = -- g_signal_new ("user-removed", -- G_TYPE_FROM_CLASS (klass), -- G_SIGNAL_RUN_LAST, -- G_STRUCT_OFFSET (GdmUserManagerClass, user_removed), -- NULL, NULL, -- g_cclosure_marshal_VOID__OBJECT, -- G_TYPE_NONE, 1, GDM_TYPE_USER); -- signals [USER_IS_LOGGED_IN_CHANGED] = -- g_signal_new ("user-is-logged-in-changed", -- G_TYPE_FROM_CLASS (klass), -- G_SIGNAL_RUN_LAST, -- G_STRUCT_OFFSET (GdmUserManagerClass, user_is_logged_in_changed), -- NULL, NULL, -- g_cclosure_marshal_VOID__OBJECT, -- G_TYPE_NONE, 1, GDM_TYPE_USER); -- signals [USER_CHANGED] = -- g_signal_new ("user-changed", -- G_TYPE_FROM_CLASS (klass), -- G_SIGNAL_RUN_LAST, -- G_STRUCT_OFFSET (GdmUserManagerClass, user_changed), -- NULL, NULL, -- g_cclosure_marshal_VOID__OBJECT, -- G_TYPE_NONE, 1, GDM_TYPE_USER); -- -- g_type_class_add_private (klass, sizeof (GdmUserManagerPrivate)); --} -- --/** -- * gdm_user_manager_queue_load: -- * @manager: a #GdmUserManager -- * -- * Queue loading users into user manager. This must be called, and the -- * #GdmUserManager:is-loaded property must be %TRUE before calling -- * gdm_user_manager_list_users() -- */ --void --gdm_user_manager_queue_load (GdmUserManager *manager) --{ -- g_return_if_fail (GDM_IS_USER_MANAGER (manager)); -- -- if (! manager->priv->is_loaded) { -- queue_load_seat_and_users (manager); -- } --} -- --static void --gdm_user_manager_init (GdmUserManager *manager) --{ -- GError *error; -- -- manager->priv = GDM_USER_MANAGER_GET_PRIVATE (manager); -- -- /* sessions */ -- manager->priv->sessions = g_hash_table_new_full (g_str_hash, -- g_str_equal, -- g_free, -- g_free); -- -- /* users */ -- manager->priv->users_by_name = g_hash_table_new_full (g_str_hash, -- g_str_equal, -- g_free, -- g_object_unref); -- -- manager->priv->users_by_object_path = g_hash_table_new_full (g_str_hash, -- g_str_equal, -- NULL, -- g_object_unref); -- -- g_assert (manager->priv->seat.proxy == NULL); -- -- error = NULL; -- manager->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); -- if (manager->priv->connection == NULL) { -- if (error != NULL) { -- g_warning ("Failed to connect to the D-Bus daemon: %s", error->message); -- g_error_free (error); -- } else { -- g_warning ("Failed to connect to the D-Bus daemon"); -- } -- return; -- } -- -- get_accounts_proxy (manager); -- -- manager->priv->seat.state = GDM_USER_MANAGER_SEAT_STATE_UNLOADED; --} -- --static void --gdm_user_manager_finalize (GObject *object) --{ -- GdmUserManager *manager; -- GSList *node; -- -- g_return_if_fail (object != NULL); -- g_return_if_fail (GDM_IS_USER_MANAGER (object)); -- -- manager = GDM_USER_MANAGER (object); -- -- g_return_if_fail (manager->priv != NULL); -- -- if (manager->priv->ck_history_pid > 0) { -- g_debug ("Killing ck-history process"); -- signal_pid (manager->priv->ck_history_pid, SIGTERM); -- } -- -- g_slist_foreach (manager->priv->new_sessions, -- (GFunc) unload_new_session, NULL); -- g_slist_free (manager->priv->new_sessions); -- -- g_slist_foreach (manager->priv->fetch_user_requests, -- (GFunc) free_fetch_user_request, NULL); -- g_slist_free (manager->priv->fetch_user_requests); -- -- node = manager->priv->new_users; -- while (node != NULL) { -- GdmUser *user; -- GSList *next_node; -- -- user = GDM_USER (node->data); -- next_node = node->next; -- -- g_signal_handlers_disconnect_by_func (user, on_new_user_loaded, manager); -- g_object_unref (user); -- manager->priv->new_users = g_slist_delete_link (manager->priv->new_users, node); -- node = next_node; -- } -- -- unload_seat (manager); -- -- if (manager->priv->exclude_usernames != NULL) { -- g_slist_foreach (manager->priv->exclude_usernames, (GFunc) g_free, NULL); -- g_slist_free (manager->priv->exclude_usernames); -- } -- -- if (manager->priv->include_usernames != NULL) { -- g_slist_foreach (manager->priv->include_usernames, (GFunc) g_free, NULL); -- g_slist_free (manager->priv->include_usernames); -- } -- -- if (manager->priv->seat.proxy != NULL) { -- g_object_unref (manager->priv->seat.proxy); -- } -- -- if (manager->priv->accounts_proxy != NULL) { -- g_object_unref (manager->priv->accounts_proxy); -- } -- -- if (manager->priv->ck_history_id != 0) { -- g_source_remove (manager->priv->ck_history_id); -- manager->priv->ck_history_id = 0; -- } -- -- if (manager->priv->ck_history_watchdog_id != 0) { -- g_source_remove (manager->priv->ck_history_watchdog_id); -- manager->priv->ck_history_watchdog_id = 0; -- } -- -- if (manager->priv->load_id > 0) { -- g_source_remove (manager->priv->load_id); -- manager->priv->load_id = 0; -- } -- -- if (manager->priv->reload_passwd_id > 0) { -- g_source_remove (manager->priv->reload_passwd_id); -- manager->priv->reload_passwd_id = 0; -- } -- -- g_hash_table_destroy (manager->priv->sessions); -- -- if (manager->priv->passwd_monitor != NULL) { -- g_file_monitor_cancel (manager->priv->passwd_monitor); -- } -- -- g_hash_table_destroy (manager->priv->users_by_name); -- g_hash_table_destroy (manager->priv->users_by_object_path); -- -- if (manager->priv->shells_monitor != NULL) { -- g_file_monitor_cancel (manager->priv->shells_monitor); -- } -- -- if (manager->priv->shells != NULL) { -- g_hash_table_destroy (manager->priv->shells); -- } -- -- G_OBJECT_CLASS (gdm_user_manager_parent_class)->finalize (object); --} -- --/** -- * gdm_user_manager_ref_default: -- * -- * Queue loading users into user manager. This must be called, and the -- * #GdmUserManager:is-loaded property must be %TRUE before calling -- * gdm_user_manager_list_users() -- * -- * Returns: (transfer full): user manager object -- */ --GdmUserManager * --gdm_user_manager_ref_default (void) --{ -- if (user_manager_object != NULL) { -- g_object_ref (user_manager_object); -- } else { -- user_manager_object = g_object_new (GDM_TYPE_USER_MANAGER, NULL); -- g_object_add_weak_pointer (user_manager_object, -- (gpointer *) &user_manager_object); -- } -- -- return GDM_USER_MANAGER (user_manager_object); --} -diff --git a/gui/simple-greeter/gdm-user-manager.h b/gui/simple-greeter/gdm-user-manager.h -deleted file mode 100644 -index 8dd9ede..0000000 ---- a/gui/simple-greeter/gdm-user-manager.h -+++ /dev/null -@@ -1,91 +0,0 @@ --/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- -- * -- * Copyright (C) 2007 William Jon McCann -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License -- * along with this program; if not, write to the Free Software -- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -- * -- */ -- --#ifndef __GDM_USER_MANAGER_H__ --#define __GDM_USER_MANAGER_H__ -- --#include -- --#include "gdm-user.h" -- --G_BEGIN_DECLS -- --#define GDM_TYPE_USER_MANAGER (gdm_user_manager_get_type ()) --#define GDM_USER_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_USER_MANAGER, GdmUserManager)) --#define GDM_USER_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_USER_MANAGER, GdmUserManagerClass)) --#define GDM_IS_USER_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_USER_MANAGER)) --#define GDM_IS_USER_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_USER_MANAGER)) --#define GDM_USER_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_USER_MANAGER, GdmUserManagerClass)) -- --typedef struct GdmUserManagerPrivate GdmUserManagerPrivate; --typedef struct GdmUserManager GdmUserManager; --typedef struct GdmUserManagerClass GdmUserManagerClass; --typedef enum GdmUserManagerError GdmUserManagerError; -- --struct GdmUserManager --{ -- GObject parent; -- GdmUserManagerPrivate *priv; --}; -- --struct GdmUserManagerClass --{ -- GObjectClass parent_class; -- -- void (* user_added) (GdmUserManager *user_manager, -- GdmUser *user); -- void (* user_removed) (GdmUserManager *user_manager, -- GdmUser *user); -- void (* user_is_logged_in_changed) (GdmUserManager *user_manager, -- GdmUser *user); -- void (* user_changed) (GdmUserManager *user_manager, -- GdmUser *user); --}; -- --enum GdmUserManagerError --{ -- GDM_USER_MANAGER_ERROR_GENERAL, -- GDM_USER_MANAGER_ERROR_KEY_NOT_FOUND --}; -- --#define GDM_USER_MANAGER_ERROR gdm_user_manager_error_quark () -- --GQuark gdm_user_manager_error_quark (void); --GType gdm_user_manager_get_type (void); -- --GdmUserManager * gdm_user_manager_ref_default (void); -- --void gdm_user_manager_queue_load (GdmUserManager *manager); --GSList * gdm_user_manager_list_users (GdmUserManager *manager); --GdmUser * gdm_user_manager_get_user (GdmUserManager *manager, -- const char *username); --GdmUser * gdm_user_manager_get_user_by_uid (GdmUserManager *manager, -- gulong uid); -- --gboolean gdm_user_manager_activate_user_session (GdmUserManager *manager, -- GdmUser *user); -- --gboolean gdm_user_manager_can_switch (GdmUserManager *manager); -- --gboolean gdm_user_manager_goto_login_session (GdmUserManager *manager); -- --G_END_DECLS -- --#endif /* __GDM_USER_MANAGER_H */ -diff --git a/gui/simple-greeter/test-user-manager.c b/gui/simple-greeter/test-user-manager.c -index d0f6427..03b7a21 100644 ---- a/gui/simple-greeter/test-user-manager.c -+++ b/gui/simple-greeter/test-user-manager.c -@@ -30,10 +30,12 @@ - #include - #include - --#include "gdm-user-manager.h" -+#include -+#include -+ - #include "gdm-settings-client.h" - --static GdmUserManager *manager = NULL; -+static ActUserManager *manager = NULL; - static GMainLoop *main_loop = NULL; - - static gboolean do_monitor = FALSE; -@@ -45,7 +47,7 @@ static GOptionEntry entries [] = { - }; - - static void --on_is_loaded_changed (GdmUserManager *manager, -+on_is_loaded_changed (ActUserManager *manager, - GParamSpec *pspec, - gpointer data) - { -@@ -53,9 +55,9 @@ on_is_loaded_changed (GdmUserManager *manager, - - g_debug ("Users loaded"); - -- users = gdm_user_manager_list_users (manager); -+ users = act_user_manager_list_users (manager); - while (users != NULL) { -- g_print ("User: %s\n", gdm_user_get_user_name (users->data)); -+ g_print ("User: %s\n", act_user_get_user_name (users->data)); - users = g_slist_delete_link (users, users); - } - -@@ -65,19 +67,19 @@ on_is_loaded_changed (GdmUserManager *manager, - } - - static void --on_user_added (GdmUserManager *manager, -- GdmUser *user, -+on_user_added (ActUserManager *manager, -+ ActUser *user, - gpointer data) - { -- g_debug ("User added: %s", gdm_user_get_user_name (user)); -+ g_debug ("User added: %s", act_user_get_user_name (user)); - } - - static void --on_user_removed (GdmUserManager *manager, -- GdmUser *user, -+on_user_removed (ActUserManager *manager, -+ ActUser *user, - gpointer data) - { -- g_debug ("User removed: %s", gdm_user_get_user_name (user)); -+ g_debug ("User removed: %s", act_user_get_user_name (user)); - } - - int -@@ -123,7 +125,7 @@ main (int argc, char *argv[]) - exit (1); - } - -- manager = gdm_user_manager_ref_default (); -+ manager = act_user_manager_get_default (); - g_object_set (manager, "include-all", TRUE, NULL); - g_signal_connect (manager, - "notify::is-loaded", -@@ -137,7 +139,6 @@ main (int argc, char *argv[]) - "user-removed", - G_CALLBACK (on_user_removed), - NULL); -- gdm_user_manager_queue_load (manager); - - main_loop = g_main_loop_new (NULL, FALSE); - --- -1.7.4.1 - -From f100b21d67382dbdfdc5305f8cbb7f6bc9233f98 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 18 Feb 2011 18:34:31 -0500 -Subject: [PATCH] greeter: filter out root and gdm users from list - -While the accounts service filters out most of the names -we care about, it doesn't filter out the above two, so make -sure they get filtered. ---- - gui/simple-greeter/gdm-user-chooser-widget.c | 8 ++++++++ - 1 files changed, 8 insertions(+), 0 deletions(-) - -diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c -index a385218..dd06bc4 100644 ---- a/gui/simple-greeter/gdm-user-chooser-widget.c -+++ b/gui/simple-greeter/gdm-user-chooser-widget.c -@@ -743,6 +743,14 @@ add_user (GdmUserChooserWidget *widget, - return; - } - -+ if (strcmp (act_user_get_user_name (user), GDM_USERNAME) == 0) { -+ return; -+ } -+ -+ if (act_user_get_uid (user) == 0) { -+ return; -+ } -+ - if (widget->priv->stock_person_pixbuf != NULL) { - pixbuf = g_object_ref (widget->priv->stock_person_pixbuf); - } else { --- -1.7.4.1 - diff --git a/sources b/sources index 5e3d9cf..0b80886 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -d1a6313d9ea4da24c6399bece989fdd9 gdm-2.91.6.tar.bz2 +44e2f162e97451fd2957078c1877257f gdm-2.91.91.tar.bz2 diff --git a/xklavier-fix.patch b/xklavier-fix.patch deleted file mode 100644 index b05b631..0000000 --- a/xklavier-fix.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 51669cb03613b36b0b1798b1f8d2bba85b3e2a49 Mon Sep 17 00:00:00 2001 -From: Martin Pitt -Date: Mon, 18 Jan 2010 16:09:58 +0100 -Subject: [PATCH] Fix crash in getting system keyboard layout - -In get_system_default_layout(), use a static variable for -xkl_engine_get_instance() result, and don't close the X Display. - -This fixes the crash that happens at the second call of -get_system_default_layout(): xkl_engine_get_instance() returns a singleton -which saves the passed X Display instance, so we must never close it. - -https://launchpad.net/bugs/505972 ---- - daemon/gdm-session-direct.c | 23 ++++++++++++----------- - 1 files changed, 12 insertions(+), 11 deletions(-) - -diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c -index 011a919..d2e1a83 100644 ---- a/daemon/gdm-session-direct.c -+++ b/daemon/gdm-session-direct.c -@@ -601,16 +601,19 @@ get_default_language_name (GdmSessionDirect *session) - static char * - get_system_default_layout (GdmSessionDirect *session) - { -- char *result; -- Display *display; -+ char *result = NULL; -+ static XklEngine *engine = NULL; - -- result = NULL; -- display = XOpenDisplay (session->priv->display_name); -- if (display) { -- XklConfigRec *config; -- XklEngine *engine = xkl_engine_get_instance (display); -- if (engine) -- { -+ if (engine == NULL) { -+ Display *display = XOpenDisplay (session->priv->display_name); -+ if (display != NULL) { -+ engine = xkl_engine_get_instance (display); -+ } -+ /* do NOT call XCloseDisplay (display) here; -+ * xkl_engine_get_instance() is a singleton which saves the display */ -+ } -+ -+ if (engine != NULL) { - XklConfigRec *config = xkl_config_rec_new (); - if (xkl_config_rec_get_from_server (config, engine) && config->layouts && config->layouts[0]) { - if (config->variants && config->variants[0] && config->variants[0][0]) -@@ -619,8 +622,6 @@ get_system_default_layout (GdmSessionDirect *session) - result = g_strdup (config->layouts[0]); - } - g_object_unref (config); -- } -- XCloseDisplay (display); - } - - if (!result) --- -1.6.6 -