gdm r5692 - in trunk: . daemon gui gui/simple-greeter gui/user-switch-applet po



Author: mccann
Date: Tue Feb  5 03:48:04 2008
New Revision: 5692
URL: http://svn.gnome.org/viewvc/gdm?rev=5692&view=rev

Log:
2008-02-04  William Jon McCann  <jmccann redhat com>

	* configure.ac:
	* daemon/gdm-slave.c: (_get_primary_user_session_id):
	* gui/Makefile.am:
	* gui/simple-greeter/Makefile.am:
	* gui/simple-greeter/gdm-user-manager.c: (start_new_login_session),
	(_get_primary_user_session_id), (activate_session_id),
	(session_is_login_window), (_get_login_window_session_id),
	(gdm_user_manager_goto_login_session),
	(gdm_user_manager_activate_user_session),
	(maybe_add_session_for_user), (seat_session_added),
	(gdm_user_manager_get_user_by_uid):
	* gui/simple-greeter/gdm-user-manager.h:
	* gui/simple-greeter/gdm-user.c: (_gdm_user_add_session),
	(_gdm_user_remove_session), (gdm_user_get_num_sessions),
	(gdm_user_get_sessions):
	* gui/simple-greeter/gdm-user.h:
	* gui/user-switch-applet/GNOME_GdmUserSwitchApplet.server.in.in:
	* gui/user-switch-applet/GNOME_GdmUserSwitchApplet.xml:
	* gui/user-switch-applet/Makefile.am:
	* gui/user-switch-applet/Makefile.in:
	* gui/user-switch-applet/applet.c: (about_me_cb), (get_glade_xml),
	(make_label_bold), (make_label_small_italic),
	(prefs_radio_toggled_cb), (prefs_xnest_check_toggled_cb),
	(prefs_lock_check_toggled_cb), (reset_login_screen_item),
	(system_can_do_xnest), (reset_login_window_item),
	(menubar_button_press_event_cb), (prefs_cb), (help_cb), (about_cb),
	(admin_cb), (setup_cb), (set_menuitem_icon), (applet_style_set_cb),
	(applet_change_background_cb), (applet_key_press_event_cb),
	(applet_size_allocate_cb), (gdm_applet_data_free),
	(menubar_expose_event_cb), (sort_menu_comparedatafunc),
	(sort_menu), (menu_style_set_cb), (menuitem_destroy_cb),
	(menuitem_style_set_cb), (user_notify_display_name_cb),
	(menu_expose_cb), (switch_to_user_session), (maybe_lock_screen),
	(do_switch), (user_item_activate_cb), (user_sessions_changed_cb),
	(manager_user_added_cb), (login_screen_activate_cb),
	(login_window_activate_cb), (display_key_changed),
	(xnest_key_changed), (client_notify_applet_func),
	(client_notify_global_func), (client_notify_lockdown_func),
	(applet_fill_cb):
	* gui/user-switch-applet/gdm-user-menu-item.c: (user_weak_notify),
	(reset_label), (reset_icon), (user_notify_cb),
	(user_icon_changed_cb), (user_sessions_changed_cb),
	(_gdm_user_menu_item_set_user), (gdm_user_menu_item_set_property),
	(gdm_user_menu_item_get_property), (gdm_user_menu_item_finalize),
	(gdm_user_menu_item_expose_event),
	(gdm_user_menu_item_size_request), (gdm_user_menu_item_class_init),
	(image_style_set_cb), (label_style_set_cb),
	(gdm_user_menu_item_init), (gdm_user_menu_item_new),
	(gdm_user_menu_item_get_user), (gdm_user_menu_item_get_icon_size),
	(gdm_user_menu_item_set_icon_size):
	* gui/user-switch-applet/gdm-user-menu-item.h:
	* gui/user-switch-applet/gdm-user-switch-applet.glade:
	* gui/user-switch-applet/gdm-user-switch-applet.schemas.in:
	Add a user switcher applet.  This is here at the moment instead
	of in fusa so that we can share code and stay in sync.  This
	is important since it is very likely we'll need to change interfaces
	slightly.



Added:
   trunk/gui/user-switch-applet/
   trunk/gui/user-switch-applet/GNOME_GdmUserSwitchApplet.server.in.in
   trunk/gui/user-switch-applet/GNOME_GdmUserSwitchApplet.xml
   trunk/gui/user-switch-applet/Makefile.am
   trunk/gui/user-switch-applet/Makefile.in
   trunk/gui/user-switch-applet/applet.c
   trunk/gui/user-switch-applet/gdm-user-menu-item.c
   trunk/gui/user-switch-applet/gdm-user-menu-item.h
   trunk/gui/user-switch-applet/gdm-user-switch-applet.glade
   trunk/gui/user-switch-applet/gdm-user-switch-applet.schemas.in
Modified:
   trunk/ChangeLog
   trunk/configure.ac
   trunk/daemon/gdm-slave.c
   trunk/gui/Makefile.am
   trunk/gui/simple-greeter/Makefile.am
   trunk/gui/simple-greeter/gdm-user-manager.c
   trunk/gui/simple-greeter/gdm-user-manager.h
   trunk/gui/simple-greeter/gdm-user.c
   trunk/gui/simple-greeter/gdm-user.h
   trunk/po/ChangeLog
   trunk/po/POTFILES.in
   trunk/po/POTFILES.skip

Modified: trunk/configure.ac
==============================================================================
--- trunk/configure.ac	(original)
+++ trunk/configure.ac	Tue Feb  5 03:48:04 2008
@@ -47,6 +47,7 @@
 SCROLLKEEPER_REQUIRED_VERSION=0.1.4
 GCONF_REQUIRED_VERSION=2.6.1
 POLICYKIT_REQUIRED_VERSION=0.7
+GNOME_PANEL_REQUIRED_VERSION=2.0.0
 
 EXTRA_COMPILE_WARNINGS(yes)
 
@@ -117,20 +118,12 @@
 AC_SUBST(SIMPLE_CHOOSER_CFLAGS)
 AC_SUBST(SIMPLE_CHOOSER_LIBS)
 
-PKG_CHECK_MODULES(SETTINGS_DAEMON,
+PKG_CHECK_MODULES(APPLET,
         gtk+-2.0 >= $GTK_REQUIRED_VERSION
-        gconf-2.0 >= $GCONF_REQUIRED_VERSION
-        gmodule-2.0
-)
-AC_SUBST(SETTINGS_DAEMON_CFLAGS)
-AC_SUBST(SETTINGS_DAEMON_LIBS)
-
-PKG_CHECK_MODULES(SETTINGS_PLUGIN,
-        gtk+-2.0 >= $GTK_REQUIRED_VERSION
-        gconf-2.0 >= $GCONF_REQUIRED_VERSION
-)
-AC_SUBST(SETTINGS_PLUGIN_CFLAGS)
-AC_SUBST(SETTINGS_PLUGIN_LIBS)
+        libpanelapplet-2.0 >= $GNOME_PANEL_REQUIRED_VERSION
+        libglade-2.0 >= $LIBGLADE_REQUIRED_VERSION)
+AC_SUBST(APPLET_CFLAGS)
+AC_SUBST(APPLET_LIBS)
 
 PLUGIN_LIBTOOL_FLAGS="-export_dynamic -module -avoid-version"
 AC_SUBST(PLUGIN_LIBTOOL_FLAGS)
@@ -1339,6 +1332,7 @@
 gui/simple-greeter/Makefile
 gui/simple-greeter/libnotificationarea/Makefile
 gui/simple-chooser/Makefile
+gui/user-switch-applet/Makefile
 utils/Makefile
 data/Makefile
 data/faces/Makefile

Modified: trunk/daemon/gdm-slave.c
==============================================================================
--- trunk/daemon/gdm-slave.c	(original)
+++ trunk/daemon/gdm-slave.c	Tue Feb  5 03:48:04 2008
@@ -851,7 +851,7 @@
 
         if (slave->priv->display_seat_id == NULL || slave->priv->display_seat_id[0] == '\0') {
                 g_debug ("GdmSlave: display seat id is not set; can't switch sessions");
-                return FALSE;
+                return NULL;
         }
 
         ret = FALSE;
@@ -917,18 +917,13 @@
 
                 ssid = g_ptr_array_index (sessions, i);
 
-                if (! x11_session_is_on_seat (slave, ssid, slave->priv->display_seat_id)) {
-                        goto next;
-                }
-
-                /* FIXME: better way to choose? */
-                if (primary_ssid == NULL) {
+                if (x11_session_is_on_seat (slave, ssid, slave->priv->display_seat_id)) {
                         primary_ssid = g_strdup (ssid);
+                        break;
                 }
-
-        next:
-                g_free (ssid);
         }
+
+        g_ptr_array_foreach (sessions, (GFunc)g_free, NULL);
         g_ptr_array_free (sessions, TRUE);
 
  out:

Modified: trunk/gui/Makefile.am
==============================================================================
--- trunk/gui/Makefile.am	(original)
+++ trunk/gui/Makefile.am	Tue Feb  5 03:48:04 2008
@@ -1,6 +1,7 @@
 NULL =
 
-SUBDIRS =		\
-	simple-chooser	\
-	simple-greeter	\
+SUBDIRS =			\
+	simple-chooser		\
+	simple-greeter		\
+	user-switch-applet	\
 	$(NULL)

Modified: trunk/gui/simple-greeter/Makefile.am
==============================================================================
--- trunk/gui/simple-greeter/Makefile.am	(original)
+++ trunk/gui/simple-greeter/Makefile.am	Tue Feb  5 03:48:04 2008
@@ -28,6 +28,33 @@
 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_CPPFLAGS = 		\
+	$(DISABLE_DEPRECATED_CFLAGS)	\
+	$(NULL)
+
+libgdmuser_la_CFLAGS =			\
+	$(SIMPLE_GREETER_CFLAGS)	\
+	$(NULL)
+
+libgdmuser_la_LIBADD =			\
+	$(NULL)
+
+libgdmuser_la_LDFLAGS = 	\
+	-export-dynamic 	\
+	$(NULL)
+
 noinst_PROGRAMS = 			\
 	test-greeter-login-window	\
 	test-remote-login-window	\
@@ -50,18 +77,14 @@
 	gdm-user-chooser-widget.c	\
 	gdm-user-chooser-dialog.h	\
 	gdm-user-chooser-dialog.c	\
-	gdm-user-manager.h		\
-	gdm-user-manager.c		\
-	gdm-user-private.h		\
-	gdm-user.h			\
-	gdm-user.c			\
 	$(NULL)
 
 test_greeter_login_window_LDADD =	\
+	$(top_builddir)/common/libgdmcommon.la	\
+	libgdmuser.la			\
 	$(SIMPLE_GREETER_LIBS)		\
 	$(POLKIT_GNOME_LIBS)		\
 	$(RBAC_LIBS)			\
-	$(top_builddir)/common/libgdmcommon.la	\
 	$(NULL)
 
 test_greeter_panel_SOURCES = 	\
@@ -140,28 +163,20 @@
 	gdm-user-chooser-widget.c	\
 	gdm-user-chooser-dialog.h	\
 	gdm-user-chooser-dialog.c	\
-	gdm-user-manager.h		\
-	gdm-user-manager.c		\
-	gdm-user-private.h		\
-	gdm-user.h			\
-	gdm-user.c			\
 	$(NULL)
 
 test_user_chooser_LDADD =	\
+	libgdmuser.la		\
 	$(SIMPLE_GREETER_LIBS)	\
 	$(POLKIT_GNOME_LIBS)	\
 	$(NULL)
 
 test_user_manager_SOURCES = 	\
 	test-user-manager.c	\
-	gdm-user-manager.h	\
-	gdm-user-manager.c	\
-	gdm-user-private.h	\
-	gdm-user.h		\
-	gdm-user.c		\
 	$(NULL)
 
 test_user_manager_LDADD =	\
+	libgdmuser.la		\
 	$(SIMPLE_GREETER_LIBS)	\
 	$(POLKIT_GNOME_LIBS)	\
 	$(NULL)
@@ -204,21 +219,16 @@
 	gdm-session-chooser-widget.c	\
 	gdm-user-chooser-widget.h	\
 	gdm-user-chooser-widget.c	\
-	gdm-user-manager.h		\
-	gdm-user-manager.c		\
-	gdm-user-private.h		\
-	gdm-user.h			\
-	gdm-user.c			\
 	$(NULL)
 
 gdm_simple_greeter_LDADD = 		\
 	$(top_builddir)/common/libgdmcommon.la	\
+	libgdmuser.la			\
 	$(top_builddir)/gui/simple-greeter/libnotificationarea/libnotificationarea.la	\
 	$(EXTRA_GREETER_LIBS)   	\
 	$(SIMPLE_GREETER_LIBS)		\
 	$(POLKIT_GNOME_LIBS)		\
 	$(RBAC_LIBS)			\
-	$(top_builddir)/common/libgdmcommon.la	\
 	$(NULL)
 
 gladedir = $(pkgdatadir)

Modified: trunk/gui/simple-greeter/gdm-user-manager.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-user-manager.c	(original)
+++ trunk/gui/simple-greeter/gdm-user-manager.c	Tue Feb  5 03:48:04 2008
@@ -125,6 +125,317 @@
         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) {
+                g_warning ("Unable to start new login: %s", error->message);
+                g_error_free (error);
+        }
+
+        return res;
+}
+
+/* needs to stay in sync with gdm-slave */
+static char *
+_get_primary_user_session_id (GdmUserManager *manager,
+                              GdmUser        *user)
+{
+        gboolean    res;
+        gboolean    ret;
+        gboolean    can_activate_sessions;
+        GError     *error;
+        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;
+        }
+
+        ret = FALSE;
+        primary_ssid = NULL;
+        sessions = NULL;
+
+        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) {
+                g_warning ("unable to determine if seat can activate sessions: %s",
+                           error->message);
+                g_error_free (error);
+                goto out;
+        }
+
+        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,
+                     const char     *session_id)
+{
+        DBusError    local_error;
+        DBusMessage *message;
+        DBusMessage *reply;
+        gboolean     ret;
+
+        ret = FALSE;
+
+        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:
+        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) {
+                g_debug ("Failed to identify the session type: %s", error->message);
+                g_error_free (error);
+                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    ret;
+        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;
+        }
+
+        ret = FALSE;
+        primary_ssid = NULL;
+        sessions = NULL;
+
+        g_debug ("GdmSlave: 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) {
+                g_warning ("unable to determine if seat can activate sessions: %s",
+                           error->message);
+                g_error_free (error);
+                goto out;
+        }
+
+        if (! can_activate_sessions) {
+                g_debug ("GdmSlave: 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) {
+                g_warning ("unable to determine sessions for user: %s",
+                           error->message);
+                g_error_free (error);
+                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);
+
+        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_activate_user_session (GdmUserManager *manager,
+                                        GdmUser        *user)
+{
+        gboolean ret;
+        char    *ssid;
+        gboolean res;
+
+        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);
+        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)
@@ -192,7 +503,6 @@
         return seat_id;
 }
 
-
 static char *
 get_x11_display_for_session (DBusGConnection *connection,
                              const char      *session_id)
@@ -262,6 +572,11 @@
                 goto out;
         }
 
+        if (g_hash_table_lookup (manager->priv->exclusions, gdm_user_get_user_name (user))) {
+                g_debug ("GdmUserManager: excluding user '%s'", gdm_user_get_user_name (user));
+                goto out;
+        }
+
         g_hash_table_insert (manager->priv->sessions,
                              g_strdup (ssid),
                              g_strdup (gdm_user_get_user_name (user)));
@@ -476,6 +791,7 @@
         gboolean       res;
         struct passwd *pwent;
         GdmUser       *user;
+        gboolean       is_new;
 
         g_debug ("Session added: %s", session_id);
 
@@ -494,11 +810,27 @@
 
         user = g_hash_table_lookup (manager->priv->users, pwent->pw_name);
         if (user == NULL) {
+                g_debug ("Creating new user");
+
+                user = create_user (manager);
+                _gdm_user_update (user, pwent);
+                is_new = TRUE;
                 /* add the user */
                 user = add_new_user_for_pwent (manager, pwent);
+        } else {
+                is_new = FALSE;
         }
 
-        maybe_add_session_for_user (manager, user, session_id);
+        res = maybe_add_session_for_user (manager, user, session_id);
+
+        /* only add the user if we added a session */
+        if (is_new) {
+                if (res) {
+                        add_user (manager, user);
+                } else {
+                        g_object_unref (user);
+                }
+        }
 }
 
 static void
@@ -632,6 +964,30 @@
         return user;
 }
 
+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);
+
+        pwent = getpwuid (uid);
+        if (pwent == NULL) {
+                g_warning ("GdmUserManager: unable to lookup uid %d", (int)uid);
+                return NULL;
+        }
+
+        user = g_hash_table_lookup (manager->priv->users, pwent->pw_name);
+
+        if (user == NULL) {
+                user = add_new_user_for_pwent (manager, pwent);
+        }
+
+        return user;
+}
+
 static void
 listify_hash_values_hfunc (gpointer key,
                            gpointer value,

Modified: trunk/gui/simple-greeter/gdm-user-manager.h
==============================================================================
--- trunk/gui/simple-greeter/gdm-user-manager.h	(original)
+++ trunk/gui/simple-greeter/gdm-user-manager.h	Tue Feb  5 03:48:04 2008
@@ -72,6 +72,14 @@
 GSList *            gdm_user_manager_list_users            (GdmUserManager *manager);
 GdmUser *           gdm_user_manager_get_user              (GdmUserManager *manager,
                                                             const char     *user_name);
+GdmUser *           gdm_user_manager_get_user_by_uid       (GdmUserManager *manager,
+                                                            uid_t           uid);
+
+gboolean            gdm_user_manager_activate_user_session (GdmUserManager *manager,
+                                                            GdmUser        *user);
+
+gboolean            gdm_user_manager_goto_login_session    (GdmUserManager *manager);
+
 G_END_DECLS
 
 #endif /* __GDM_USER_MANAGER_H */

Modified: trunk/gui/simple-greeter/gdm-user.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-user.c	(original)
+++ trunk/gui/simple-greeter/gdm-user.c	Tue Feb  5 03:48:04 2008
@@ -70,7 +70,7 @@
         char           *real_name;
         char           *home_dir;
         char           *shell;
-        GSList         *sessions;
+        GList          *sessions;
         gulong          login_frequency;
 };
 
@@ -105,15 +105,15 @@
 _gdm_user_add_session (GdmUser    *user,
                        const char *ssid)
 {
-        GSList *li;
+        GList *li;
 
         g_return_if_fail (GDM_IS_USER (user));
         g_return_if_fail (ssid != NULL);
 
-        li = g_slist_find_custom (user->sessions, ssid, (GCompareFunc)session_compare);
+        li = g_list_find_custom (user->sessions, ssid, (GCompareFunc)session_compare);
         if (li == NULL) {
                 g_debug ("GdmUser: adding session %s", ssid);
-                user->sessions = g_slist_prepend (user->sessions, g_strdup (ssid));
+                user->sessions = g_list_prepend (user->sessions, g_strdup (ssid));
                 g_signal_emit (user, signals[SESSIONS_CHANGED], 0);
         } else {
                 g_debug ("GdmUser: session already present: %s", ssid);
@@ -124,16 +124,16 @@
 _gdm_user_remove_session (GdmUser    *user,
                           const char *ssid)
 {
-        GSList *li;
+        GList *li;
 
         g_return_if_fail (GDM_IS_USER (user));
         g_return_if_fail (ssid != NULL);
 
-        li = g_slist_find_custom (user->sessions, ssid, (GCompareFunc)session_compare);
+        li = g_list_find_custom (user->sessions, ssid, (GCompareFunc)session_compare);
         if (li != NULL) {
                 g_debug ("GdmUser: removing session %s", ssid);
                 g_free (li->data);
-                user->sessions = g_slist_delete_link (user->sessions, li);
+                user->sessions = g_list_delete_link (user->sessions, li);
                 g_signal_emit (user, signals[SESSIONS_CHANGED], 0);
         } else {
                 g_debug ("GdmUser: session not found: %s", ssid);
@@ -143,7 +143,13 @@
 guint
 gdm_user_get_num_sessions (GdmUser    *user)
 {
-        return g_slist_length (user->sessions);
+        return g_list_length (user->sessions);
+}
+
+GList *
+gdm_user_get_sessions (GdmUser *user)
+{
+        return user->sessions;
 }
 
 static void

Modified: trunk/gui/simple-greeter/gdm-user.h
==============================================================================
--- trunk/gui/simple-greeter/gdm-user.h	(original)
+++ trunk/gui/simple-greeter/gdm-user.h	Tue Feb  5 03:48:04 2008
@@ -37,21 +37,22 @@
 
 typedef struct _GdmUser GdmUser;
 
-GType                 gdm_user_get_type           (void) G_GNUC_CONST;
+GType                 gdm_user_get_type            (void) G_GNUC_CONST;
 
-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_home_directory (GdmUser   *user);
-G_CONST_RETURN char  *gdm_user_get_shell          (GdmUser   *user);
-guint                 gdm_user_get_num_sessions   (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);
+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);
 gulong                gdm_user_get_login_frequency (GdmUser   *user);
 
-GdkPixbuf            *gdm_user_render_icon        (GdmUser   *user,
-                                                   gint       icon_size);
+GdkPixbuf            *gdm_user_render_icon         (GdmUser   *user,
+                                                    gint       icon_size);
 
-gint                  gdm_user_collate            (GdmUser   *user1,
-                                                   GdmUser   *user2);
+gint                  gdm_user_collate             (GdmUser   *user1,
+                                                    GdmUser   *user2);
 
 G_END_DECLS
 

Added: trunk/gui/user-switch-applet/GNOME_GdmUserSwitchApplet.server.in.in
==============================================================================
--- (empty file)
+++ trunk/gui/user-switch-applet/GNOME_GdmUserSwitchApplet.server.in.in	Tue Feb  5 03:48:04 2008
@@ -0,0 +1,38 @@
+<oaf_info>
+  <oaf_server iid="OAFIID:GNOME_GdmUserSwitchApplet_Factory" type="exe"
+              location="@LIBEXECDIR@/gdm-user-switch-applet">
+
+    <oaf_attribute name="repo_ids" type="stringv">
+      <item value="IDL:Bonobo/GenericFactory:1.0"/>
+      <item value="IDL:Bonobo/Unknown:1.0"/>
+    </oaf_attribute>
+    <oaf_attribute name="name" type="string" _value="User Switcher Applet Factory"/>
+    <oaf_attribute name="description" type="string" _value="User Switcher Applet Factory"/>
+    <oaf_attribute name="bonobo:environment" type="stringv">
+       <item value="DBUS_SESSION_BUS_ADDRESS"/>
+     <oaf_attribute name="bugzilla:bugzilla" type="string" value="GNOME"/>
+     <oaf_attribute name="bugzilla:product" type="string" value="gdm-user-switch-applet"/>
+     <oaf_attribute name="bugzilla:component" type="string" value="Applet"/>
+     <oaf_attribute name="bugzilla:version" type="string" value="@VERSION@"/>
+     <oaf_attribute name="bugzilla:other_binaries" type="string" value="gdm-user-switch-applet"/>
+    </oaf_attribute>
+  </oaf_server>
+
+  <oaf_server iid="OAFIID:GNOME_GdmUserSwitchApplet" type="factory"
+              location="OAFIID:GNOME_GdmUserSwitchApplet_Factory">
+
+    <oaf_attribute name="repo_ids" type="stringv">
+      <item value="IDL:GNOME/Vertigo/PanelAppletShell:1.0"/>
+      <item value="IDL:Bonobo/Control:1.0"/>
+      <item value="IDL:Bonobo/Unknown:1.0"/>
+    </oaf_attribute>
+    <oaf_attribute name="name" type="string" _value="User Switcher 2"/>
+    <oaf_attribute name="description" type="string" _value="A menu to quickly switch between users"/>
+    <oaf_attribute name="panel:icon" type="string" value="stock_people"/>
+    <oaf_attribute name="bugzilla:bugzilla" type="string" value="GNOME"/>
+    <oaf_attribute name="bugzilla:product" type="string" value="gdm-user-switch-applet"/>
+    <oaf_attribute name="bugzilla:component" type="string" value="Applet"/>
+    <oaf_attribute name="bugzilla:version" type="string" value="@VERSION@"/>
+    <oaf_attribute name="bugzilla:other_binaries" type="string" value="gdm-user-switch-applet"/>
+  </oaf_server>
+</oaf_info>

Added: trunk/gui/user-switch-applet/GNOME_GdmUserSwitchApplet.xml
==============================================================================
--- (empty file)
+++ trunk/gui/user-switch-applet/GNOME_GdmUserSwitchApplet.xml	Tue Feb  5 03:48:04 2008
@@ -0,0 +1,38 @@
+<Root>
+  <popups>
+    <popup name="button3">
+      <menuitem
+       name="About Me Item"
+       verb="GdmAboutMe"
+       _label="Edit Personal _Information"/>
+      <menuitem
+       name="Users and Groups Admin Item"
+       verb="GdmUsersGroupsAdmin"
+       _label="_Edit Users and Groups"/>
+      <menuitem
+       name="GDM Setup Item"
+       verb="GdmGdmSetup"
+       _label="_Setup Login Screen"/>
+      <separator
+       name="GdmSeparator"/>
+      <menuitem
+       name="Preferences Item"
+       verb="GdmPreferences"
+       _label="_Preferences"
+       pixtype="stock"
+       pixname="gtk-properties"/>
+      <menuitem
+       name="Help Item"
+       verb="GdmHelp"
+       _label="_Help"
+       pixtype="stock"
+       pixname="gtk-help"/>
+      <menuitem
+       name="About Item"
+       verb="GdmAbout"
+       _label="_About"
+       pixtype="stock"
+       pixname="gtk-about"/>
+    </popup>
+  </popups>
+</Root>

Added: trunk/gui/user-switch-applet/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/gui/user-switch-applet/Makefile.am	Tue Feb  5 03:48:04 2008
@@ -0,0 +1,89 @@
+NULL =
+
+INCLUDES = \
+	-I$(top_srcdir)/gui/simple-greeter		\
+	-DPREFIX=\""$(prefix)"\" 			\
+	-DLIBDIR=\""$(libdir)"\" 			\
+	-DDATADIR=\""$(datadir)"\"		 	\
+	-DSYSCONFDIR=\""$(sysconfdir)"\"		\
+	-DLIBLOCALEDIR=\""$(prefix)/lib/locale"\"	\
+	-DGNOMELOCALEDIR=\""$(datadir)/locale"\"	\
+	-DGLADEDIR=\""$(pkgdatadir)"\" 	\
+	-DLIBEXECDIR=\""$(libexecdir)"\" 		\
+	-DSBINDIR=\""$(sbindir)"\"		 	\
+	$(GTK_CFLAGS)					\
+	$(APPLET_CFLAGS)				\
+	$(NULL)
+
+libexec_PROGRAMS =			\
+	gdm-user-switch-applet		\
+	$(NULL)
+
+gdm_user_switch_applet_SOURCES =  	\
+	applet.c 			\
+	gdm-user-menu-item.h		\
+	gdm-user-menu-item.c		\
+	$(NULL)
+
+gdm_user_switch_applet_LDADD = 		\
+	$(top_builddir)/gui/simple-greeter/libgdmuser.la	\
+	$(APPLET_LIBS)					\
+	$(NULL)
+
+schemasdir   = @GCONF_SCHEMA_FILE_DIR@
+schemas_in_files = gdm-user-switch-applet.schemas.in
+schemas_DATA = $(schemas_in_files:.schemas.in=.schemas)
+
+ INTLTOOL_SCHEMAS_RULE@
+
+gladedir = $(pkgdatadir)
+glade_DATA = 				\
+	gdm-user-switch-applet.glade	\
+	$(NULL)
+
+# Bonobo UI
+uidir =	$(datadir)/gnome-2.0/ui
+ui_DATA =					\
+	GNOME_GdmUserSwitchApplet.xml		\
+	$(NULL)
+
+# Bonobo .server
+serverdir = $(libdir)/bonobo/servers
+server_in_files =				\
+	GNOME_GdmUserSwitchApplet.server.in	\
+	$(NULL)
+server_DATA = $(server_in_files:.server.in=.server)
+
+$(server_in_files): $(server_in_files:.server.in=.server.in.in)
+	sed -e "s|\ LIBEXECDIR\@|$(libexecdir)|" -e "s|\ VERSION\@|$(VERSION)|" $< > $@
+
+ INTLTOOL_SERVER_RULE@
+
+EXTRA_DIST = 			\
+	$(schemas_in_files)	\
+	$(glade_DATA)		\
+	$(ui_DATA)		\
+	GNOME_GdmUserSwitchApplet.server.in.in	\
+	$(NULL)
+
+DISTCLEANFILES =                        \
+	$(server_in_files)		\
+        $(schemas_DATA)                 \
+	$(server_DATA)			\
+        $(NULL)
+
+MAINTAINERCLEANFILES =                  \
+        *~                              \
+        Makefile.in
+
+if GCONF_SCHEMAS_INSTALL
+# don't do this if we are building in eg. rpm
+install-data-local: $(schemas_DATA)
+	if test -z "$(DESTDIR)" ; then \
+		for p in $(schemas_DATA) ; do \
+			GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(top_builddir)/gui/user-switch-applet/$$p ; \
+		done \
+	fi
+else
+install-data-local:
+endif

Added: trunk/gui/user-switch-applet/Makefile.in
==============================================================================
--- (empty file)
+++ trunk/gui/user-switch-applet/Makefile.in	Tue Feb  5 03:48:04 2008
@@ -0,0 +1,772 @@
+# Makefile.in generated by automake 1.10 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ SET_MAKE@
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+libexec_PROGRAMS = gdm-user-switch-applet$(EXEEXT) $(am__EXEEXT_1)
+subdir = gui/user-switch-applet
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gnome-doc-utils.m4 \
+	$(top_srcdir)/m4/intltool.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__EXEEXT_1 =
+am__installdirs = "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(gladedir)" \
+	"$(DESTDIR)$(schemasdir)" "$(DESTDIR)$(serverdir)" \
+	"$(DESTDIR)$(uidir)"
+libexecPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(libexec_PROGRAMS)
+am__objects_1 =
+am_gdm_user_switch_applet_OBJECTS = applet.$(OBJEXT) \
+	gdm-user-menu-item.$(OBJEXT) $(am__objects_1)
+gdm_user_switch_applet_OBJECTS = $(am_gdm_user_switch_applet_OBJECTS)
+am__DEPENDENCIES_1 =
+gdm_user_switch_applet_DEPENDENCIES =  \
+	$(top_builddir)/gui/simple-greeter/libgdmuser.la \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(gdm_user_switch_applet_SOURCES)
+DIST_SOURCES = $(gdm_user_switch_applet_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+gladeDATA_INSTALL = $(INSTALL_DATA)
+schemasDATA_INSTALL = $(INSTALL_DATA)
+serverDATA_INSTALL = $(INSTALL_DATA)
+uiDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(glade_DATA) $(schemas_DATA) $(server_DATA) $(ui_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+APPLET_CFLAGS = @APPLET_CFLAGS@
+APPLET_LIBS = @APPLET_LIBS@
+AR = @AR@
+AT_BINDIR = @AT_BINDIR@
+AT_SPI_REGISTRYD_DIR = @AT_SPI_REGISTRYD_DIR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BINDIR = @BINDIR@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_CFLAGS = @CHECK_CFLAGS@
+CHECK_LIBS = @CHECK_LIBS@
+COMMON_CFLAGS = @COMMON_CFLAGS@
+COMMON_LIBS = @COMMON_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DAEMON_CFLAGS = @DAEMON_CFLAGS@
+DAEMON_LIBS = @DAEMON_LIBS@
+DATADIR = @DATADIR@
+DATADIRNAME = @DATADIRNAME@
+DBUS_SYS_DIR = @DBUS_SYS_DIR@
+DEBUG_CFLAGS = @DEBUG_CFLAGS@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DOC_USER_FORMATS = @DOC_USER_FORMATS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXTRA_CHOOSER_LIBS = @EXTRA_CHOOSER_LIBS@
+EXTRA_DAEMON_LIBS = @EXTRA_DAEMON_LIBS@
+EXTRA_DYNAMIC_LIBS = @EXTRA_DYNAMIC_LIBS@
+EXTRA_FLEXI_LIBS = @EXTRA_FLEXI_LIBS@
+EXTRA_GREETER_LIBS = @EXTRA_GREETER_LIBS@
+EXTRA_SETUP_LIBS = @EXTRA_SETUP_LIBS@
+EXTRA_SLAVE_LIBS = @EXTRA_SLAVE_LIBS@
+EXTRA_TEST_LIBS = @EXTRA_TEST_LIBS@
+EXTRA_XNEST_LIBS = @EXTRA_XNEST_LIBS@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GCONFTOOL = @GCONFTOOL@
+GCONF_CFLAGS = @GCONF_CFLAGS@
+GCONF_LIBS = @GCONF_LIBS@
+GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@
+GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@
+GDMCHOOSER = @GDMCHOOSER@
+GDM_CUSTOM_CONF = @GDM_CUSTOM_CONF@
+GDM_DEFAULTS_CONF = @GDM_DEFAULTS_CONF@
+GDM_OLD_CONF = @GDM_OLD_CONF@
+GDM_PID_FILE = @GDM_PID_FILE@
+GDM_USER_PATH = @GDM_USER_PATH@
+GDM_WORKING_DIR = @GDM_WORKING_DIR@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HALT_COMMAND = @HALT_COMMAND@
+HAVE_PAM = @HAVE_PAM@
+HAVE_POLKIT_GNOME = @HAVE_POLKIT_GNOME@
+HELP_DIR = @HELP_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
+INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
+INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
+INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
+INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
+INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
+INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
+INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
+INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
+INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
+INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
+INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
+INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
+INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
+INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
+LANG_CONFIG_FILE = @LANG_CONFIG_FILE@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBEXECDIR = @LIBEXECDIR@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBWRAP_LIBS = @LIBWRAP_LIBS@
+LN_S = @LN_S@
+LOCALSTATEDIR = @LOCALSTATEDIR@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+OMF_DIR = @OMF_DIR@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PAM_LIBS = @PAM_LIBS@
+PAM_PREFIX = @PAM_PREFIX@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGIN_LIBTOOL_FLAGS = @PLUGIN_LIBTOOL_FLAGS@
+POFILES = @POFILES@
+POLKIT_GNOME_CFLAGS = @POLKIT_GNOME_CFLAGS@
+POLKIT_GNOME_LIBS = @POLKIT_GNOME_LIBS@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+RANLIB = @RANLIB@
+RBAC_LIBS = @RBAC_LIBS@
+REBOOT_COMMAND = @REBOOT_COMMAND@
+SBINDIR = @SBINDIR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIMPLE_CHOOSER_CFLAGS = @SIMPLE_CHOOSER_CFLAGS@
+SIMPLE_CHOOSER_LIBS = @SIMPLE_CHOOSER_LIBS@
+SIMPLE_GREETER_CFLAGS = @SIMPLE_GREETER_CFLAGS@
+SIMPLE_GREETER_LIBS = @SIMPLE_GREETER_LIBS@
+SOUND_PROGRAM = @SOUND_PROGRAM@
+STRIP = @STRIP@
+SUSPEND_COMMAND = @SUSPEND_COMMAND@
+SYSCONFDIR = @SYSCONFDIR@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WARN_CFLAGS = @WARN_CFLAGS@
+WITH_CONSOLE_KIT = @WITH_CONSOLE_KIT@
+XDMCP_LIBS = @XDMCP_LIBS@
+XEVIE_OPTION = @XEVIE_OPTION@
+XGETTEXT = @XGETTEXT@
+XINERAMA_LIBS = @XINERAMA_LIBS@
+XLIB_CFLAGS = @XLIB_CFLAGS@
+XLIB_LIBS = @XLIB_LIBS@
+XMKMF = @XMKMF@
+XSESSION_SHELL = @XSESSION_SHELL@
+X_CFLAGS = @X_CFLAGS@
+X_CONFIG_OPTIONS = @X_CONFIG_OPTIONS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PATH = @X_PATH@
+X_PRE_LIBS = @X_PRE_LIBS@
+X_SERVER = @X_SERVER@
+X_SERVER_PATH = @X_SERVER_PATH@
+X_XNEST_CMD = @X_XNEST_CMD@
+X_XNEST_CONFIG_OPTIONS = @X_XNEST_CONFIG_OPTIONS@
+X_XNEST_UNSCALED_FONTPATH = @X_XNEST_UNSCALED_FONTPATH@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+authdir = @authdir@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+dmconfdir = @dmconfdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+gdmconfdir = @gdmconfdir@
+gdmlocaledir = @gdmlocaledir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+logdir = @logdir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pixmapdir = @pixmapdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+sysconfsubdir = @sysconfsubdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+INCLUDES = \
+	-I$(top_srcdir)/gui/simple-greeter		\
+	-DPREFIX=\""$(prefix)"\" 			\
+	-DLIBDIR=\""$(libdir)"\" 			\
+	-DDATADIR=\""$(datadir)"\"		 	\
+	-DSYSCONFDIR=\""$(sysconfdir)"\"		\
+	-DLIBLOCALEDIR=\""$(prefix)/lib/locale"\"	\
+	-DGNOMELOCALEDIR=\""$(datadir)/locale"\"	\
+	-DGLADEDIR=\""$(pkgdatadir)"\" 	\
+	-DLIBEXECDIR=\""$(libexecdir)"\" 		\
+	-DSBINDIR=\""$(sbindir)"\"		 	\
+	$(GTK_CFLAGS)					\
+	$(APPLET_CFLAGS)				\
+	$(NULL)
+
+gdm_user_switch_applet_SOURCES = \
+	applet.c 			\
+	gdm-user-menu-item.h		\
+	gdm-user-menu-item.c		\
+	$(NULL)
+
+gdm_user_switch_applet_LDADD = \
+	$(top_builddir)/gui/simple-greeter/libgdmuser.la	\
+	$(APPLET_LIBS)					\
+	$(NULL)
+
+schemasdir = @GCONF_SCHEMA_FILE_DIR@
+schemas_in_files = gdm-user-switch-applet.schemas.in
+schemas_DATA = $(schemas_in_files:.schemas.in=.schemas)
+gladedir = $(pkgdatadir)
+glade_DATA = \
+	gdm-user-switch-applet.glade	\
+	$(NULL)
+
+
+# Bonobo UI
+uidir = $(datadir)/gnome-2.0/ui
+ui_DATA = \
+	GNOME_GdmUserSwitchApplet.xml		\
+	$(NULL)
+
+
+# Bonobo .server
+serverdir = $(libdir)/bonobo/servers
+server_in_files = \
+	GNOME_GdmUserSwitchApplet.server.in	\
+	$(NULL)
+
+server_DATA = $(server_in_files:.server.in=.server)
+EXTRA_DIST = \
+	$(schemas_in_files)	\
+	$(glade_DATA)		\
+	$(ui_DATA)		\
+	GNOME_GdmUserSwitchApplet.server.in.in	\
+	$(NULL)
+
+DISTCLEANFILES = \
+	$(server_in_files)		\
+        $(schemas_DATA)                 \
+	$(server_DATA)			\
+        $(NULL)
+
+MAINTAINERCLEANFILES = \
+        *~                              \
+        Makefile.in
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  gui/user-switch-applet/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  gui/user-switch-applet/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-libexecPROGRAMS: $(libexec_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)"
+	@list='$(libexec_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	     || test -f $$p1 \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(libexecPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(libexecdir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(libexecPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(libexecdir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-libexecPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(libexec_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(libexecdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(libexecdir)/$$f"; \
+	done
+
+clean-libexecPROGRAMS:
+	@list='$(libexec_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+gdm-user-switch-applet$(EXEEXT): $(gdm_user_switch_applet_OBJECTS) $(gdm_user_switch_applet_DEPENDENCIES) 
+	@rm -f gdm-user-switch-applet$(EXEEXT)
+	$(LINK) $(gdm_user_switch_applet_OBJECTS) $(gdm_user_switch_applet_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ AMDEP_TRUE@@am__include@ @am__quote  /$(DEPDIR)/applet Po am__quote@
+ AMDEP_TRUE@@am__include@ @am__quote  /$(DEPDIR)/gdm-user-menu-item Po am__quote@
+
+.c.o:
+ am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+ am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-gladeDATA: $(glade_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(gladedir)" || $(MKDIR_P) "$(DESTDIR)$(gladedir)"
+	@list='$(glade_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(gladeDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(gladedir)/$$f'"; \
+	  $(gladeDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(gladedir)/$$f"; \
+	done
+
+uninstall-gladeDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(glade_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(gladedir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(gladedir)/$$f"; \
+	done
+install-schemasDATA: $(schemas_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(schemasdir)" || $(MKDIR_P) "$(DESTDIR)$(schemasdir)"
+	@list='$(schemas_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(schemasDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(schemasdir)/$$f'"; \
+	  $(schemasDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(schemasdir)/$$f"; \
+	done
+
+uninstall-schemasDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(schemas_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(schemasdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(schemasdir)/$$f"; \
+	done
+install-serverDATA: $(server_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(serverdir)" || $(MKDIR_P) "$(DESTDIR)$(serverdir)"
+	@list='$(server_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(serverDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(serverdir)/$$f'"; \
+	  $(serverDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(serverdir)/$$f"; \
+	done
+
+uninstall-serverDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(server_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(serverdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(serverdir)/$$f"; \
+	done
+install-uiDATA: $(ui_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(uidir)" || $(MKDIR_P) "$(DESTDIR)$(uidir)"
+	@list='$(ui_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(uiDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(uidir)/$$f'"; \
+	  $(uiDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(uidir)/$$f"; \
+	done
+
+uninstall-uiDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(ui_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(uidir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(uidir)/$$f"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(gladedir)" "$(DESTDIR)$(schemasdir)" "$(DESTDIR)$(serverdir)" "$(DESTDIR)$(uidir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic clean-libexecPROGRAMS clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-gladeDATA \
+	install-schemasDATA install-serverDATA install-uiDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am: install-libexecPROGRAMS
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-gladeDATA uninstall-libexecPROGRAMS \
+	uninstall-schemasDATA uninstall-serverDATA uninstall-uiDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-libexecPROGRAMS clean-libtool ctags distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-gladeDATA install-html install-html-am \
+	install-info install-info-am install-libexecPROGRAMS \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-schemasDATA install-serverDATA \
+	install-strip install-uiDATA installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-gladeDATA uninstall-libexecPROGRAMS \
+	uninstall-schemasDATA uninstall-serverDATA uninstall-uiDATA
+
+
+ INTLTOOL_SCHEMAS_RULE@
+
+$(server_in_files): $(server_in_files:.server.in=.server.in.in)
+	sed -e "s|\ LIBEXECDIR\@|$(libexecdir)|" -e "s|\ VERSION\@|$(VERSION)|" $< > $@
+
+ INTLTOOL_SERVER_RULE@
+
+# don't do this if we are building in eg. rpm
+ GCONF_SCHEMAS_INSTALL_TRUE@install-data-local: $(schemas_DATA)
+ GCONF_SCHEMAS_INSTALL_TRUE@	if test -z "$(DESTDIR)" ; then \
+ GCONF_SCHEMAS_INSTALL_TRUE@		for p in $(schemas_DATA) ; do \
+ GCONF_SCHEMAS_INSTALL_TRUE@			GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(top_builddir)/gui/user-switch-applet/$$p ; \
+ GCONF_SCHEMAS_INSTALL_TRUE@		done \
+ GCONF_SCHEMAS_INSTALL_TRUE@	fi
+ GCONF_SCHEMAS_INSTALL_FALSE@install-data-local:
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

Added: trunk/gui/user-switch-applet/applet.c
==============================================================================
--- (empty file)
+++ trunk/gui/user-switch-applet/applet.c	Tue Feb  5 03:48:04 2008
@@ -0,0 +1,1827 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2004-2005 James M. Cape <jcape ignore-your tv>.
+ *
+ * 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 <string.h>
+
+#include <glib/gi18n.h>
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include <gconf/gconf.h>
+#include <gconf/gconf-client.h>
+
+#include <glade/glade-xml.h>
+
+#include <bonobo/bonobo-main.h>
+#include <bonobo/bonobo-ui-util.h>
+
+#include <libgnome/gnome-init.h>
+#include <libgnomeui/gnome-help.h>
+
+#include <panel-applet.h>
+#include <panel-applet-gconf.h>
+
+#include "gdm-user-manager.h"
+#include "gdm-user-menu-item.h"
+
+#define DISPLAY_KEY     "display_style"
+#define USE_XNEST_KEY   "use_xnest"
+#define LOCK_KEY        "lock_screen_after_switch"
+
+#define GLOBAL_DIR      "/apps/gdm-user-switch-applet"
+#define SHOW_WINDOW_KEY "/apps/gdm-user-switch-applet/show_window_item"
+#define SHOW_SCREEN_KEY "/apps/gdm-user-switch-applet/show_screen_item"
+#define ACTIVE_ONLY_KEY "/apps/gdm-user-switch-applet/show_active_users_only"
+
+#define LOCKDOWN_DIR    "/desktop/gnome/lockdown"
+#define LOCKDOWN_KEY    LOCKDOWN_DIR "/disable_user_switching"
+
+typedef struct _GdmAppletData
+{
+        PanelApplet    *applet;
+
+        GConfClient    *client;
+        GdmUserManager *manager;
+
+        GtkWidget      *prefs;
+
+        GtkWidget      *menubar;
+        GtkWidget      *imglabel;
+        GtkWidget      *menu;
+        GtkWidget      *separator_item;
+        GtkWidget      *login_screen_item;
+        GtkWidget      *login_window_item;
+        GSList         *items;
+
+        guint           client_notify_applet_id;
+        guint           client_notify_global_id;
+        guint           client_notify_lockdown_id;
+        guint           user_notify_id;
+        GQuark          user_menu_item_quark;
+        gint8           pixel_size;
+        GtkIconSize     icon_size;
+} GdmAppletData;
+
+typedef struct _SelectorResponseData
+{
+        GdmAppletData  *adata;
+        GtkRadioButton *radio;
+} SelectorResponseData;
+
+static GtkTooltips *tooltips = NULL;
+static GnomeProgram *program = NULL;
+
+static gboolean applet_fill_cb (PanelApplet   *applet,
+                                const char    *iid,
+                                GdmAppletData *adata);
+
+PANEL_APPLET_BONOBO_FACTORY ("OAFIID:GNOME_GdmUserSwitchApplet_Factory",
+                             PANEL_TYPE_APPLET,
+                             "gdm-user-switch-applet", "0",
+                             (PanelAppletFactoryCallback)applet_fill_cb,
+                             NULL);
+
+static void
+about_me_cb (BonoboUIComponent *ui_container,
+             gpointer           data,
+             const char       *cname)
+{
+        GError *err;
+
+        err = NULL;
+        if (! g_spawn_command_line_async ("gnome-about-me", &err)) {
+                g_critical ("Could not run `gnome-about-me' to change photo: %s",
+                            err->message);
+                g_error_free (err);
+                bonobo_ui_component_set_prop (ui_container,
+                                              "/commands/GdmAboutMe",
+                                              "hidden", "1",
+                                              NULL);
+        }
+}
+
+static GladeXML *
+get_glade_xml (const char *root)
+{
+        GladeXML *xml;
+
+        xml = glade_xml_new (GLADEDIR "/gdm-user-switch-applet.glade", root, NULL);
+
+        if (!xml) {
+                GtkWidget *dialog;
+
+                dialog = gtk_message_dialog_new (NULL,
+                                                 0,
+                                                 GTK_MESSAGE_ERROR,
+                                                 GTK_BUTTONS_CLOSE,
+                                                 _("Missing Required File"));
+                gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+                                                          _("The User Selector's interfaces file, `%s', could not be opened. It is likely that this application was not properly installed or configured."),
+                                                          GLADEDIR "/gdm-user-switch-applet.glade");
+                gtk_dialog_run (GTK_DIALOG (dialog));
+                gtk_widget_destroy (dialog);
+                bonobo_main_quit ();
+                return NULL;
+        }
+
+        return xml;
+}
+
+static void
+make_label_bold (GtkLabel *label)
+{
+        PangoAttrList  *list;
+        PangoAttribute *attr;
+        gboolean        existing_list;
+
+        list = gtk_label_get_attributes (label);
+        existing_list = (list != NULL);
+        if (!existing_list) {
+                list = pango_attr_list_new ();
+        } else {
+                pango_attr_list_ref (list);
+        }
+
+        attr = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
+        attr->start_index = 0;
+        attr->end_index = (guint) -1;
+        pango_attr_list_insert (list, attr);
+
+        gtk_label_set_attributes (label, list);
+        pango_attr_list_unref (list);
+}
+
+static void
+make_label_small_italic (GtkLabel *label)
+{
+        PangoAttrList  *list;
+        PangoAttribute *attr;
+        gboolean        existing_list;
+
+        list = gtk_label_get_attributes (label);
+        existing_list = (list != NULL);
+        if (!existing_list) {
+                list = pango_attr_list_new ();
+        } else {
+                pango_attr_list_ref (list);
+        }
+
+        attr = pango_attr_style_new (PANGO_STYLE_ITALIC);
+        attr->start_index = 0;
+        attr->end_index = (guint) -1;
+        pango_attr_list_insert (list, attr);
+
+        attr = pango_attr_scale_new (PANGO_SCALE_SMALL);
+        attr->start_index = 0;
+        attr->end_index = (guint) -1;
+        pango_attr_list_insert (list, attr);
+
+        gtk_label_set_attributes (label, list);
+        pango_attr_list_unref (list);
+}
+
+static void
+prefs_radio_toggled_cb (GtkToggleButton *button,
+                        GdmAppletData   *adata)
+{
+        if (gtk_toggle_button_get_active (button)) {
+                gpointer value;
+
+                value = g_object_get_data (G_OBJECT (button),
+                                           "prefs-radio-display-style");
+                panel_applet_gconf_set_string (adata->applet, DISPLAY_KEY, value, NULL);
+        }
+}
+
+static void
+prefs_xnest_check_toggled_cb (GtkToggleButton *button,
+                              GdmAppletData   *adata)
+{
+        panel_applet_gconf_set_bool (adata->applet, USE_XNEST_KEY,
+                                     gtk_toggle_button_get_active (button), NULL);
+}
+
+static void
+prefs_lock_check_toggled_cb (GtkToggleButton *button,
+                             GdmAppletData   *adata)
+{
+        panel_applet_gconf_set_bool (adata->applet, LOCK_KEY,
+                                     gtk_toggle_button_get_active (button), NULL);
+}
+
+static void
+reset_login_screen_item (GtkWidget   *widget,
+                         gboolean     use_xnest_value,
+                         const char *pref_value)
+{
+        if (!pref_value || strcmp (pref_value, "always") == 0)
+                gtk_widget_show (widget);
+        else if (pref_value && strcmp (pref_value, "never") == 0)
+                gtk_widget_hide (widget);
+        else if (use_xnest_value)
+                gtk_widget_hide (widget);
+        else
+                gtk_widget_show (widget);
+}
+
+static gboolean
+system_can_do_xnest (void)
+{
+        char *tmp;
+        gboolean retval;
+
+        tmp = g_find_program_in_path ("Xnest");
+        retval = (tmp != NULL ? TRUE : FALSE);
+        g_free (tmp);
+
+        return retval;
+}
+
+static void
+reset_login_window_item (GtkWidget   *widget,
+                         gboolean     use_xnest_value,
+                         const char *pref_value)
+{
+        if (!system_can_do_xnest ())
+                gtk_widget_hide (widget);
+        else if (pref_value && strcmp (pref_value, "always") == 0)
+                gtk_widget_show (widget);
+        else if (pref_value && strcmp (pref_value, "never") == 0)
+                gtk_widget_hide (widget);
+        else if (use_xnest_value)
+                gtk_widget_show (widget);
+        else
+                gtk_widget_hide (widget);
+}
+
+/*
+ * gnome-panel/applets/wncklet/window-menu.c:window_filter_button_press()
+ *
+ * Copyright (C) 2005 James M. Cape.
+ * Copyright (C) 2003 Sun Microsystems, Inc.
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ * Copyright (C) 2000 Helix Code, Inc.
+ */
+static gboolean
+menubar_button_press_event_cb (GtkWidget      *menubar,
+                               GdkEventButton *event,
+                               GdmAppletData  *adata)
+{
+        if (event->button != 1) {
+                g_signal_stop_emission_by_name (menubar, "button-press-event");
+                /* Reset the login window item */
+        } else {
+                gboolean use_xnest;
+                char    *value;
+
+                use_xnest = panel_applet_gconf_get_bool (adata->applet,
+                                                         USE_XNEST_KEY,
+                                                         NULL);
+                value = gconf_client_get_string (adata->client, SHOW_WINDOW_KEY, NULL);
+                reset_login_window_item (GTK_WIDGET (adata->login_window_item), use_xnest,
+                                         value);
+                g_free (value);
+        }
+
+        return FALSE;
+}
+
+static void
+prefs_cb (BonoboUIComponent *ui_container,
+          GdmAppletData     *adata,
+          const char        *cname)
+{
+        GladeXML      *xml;
+        GtkWidget     *warning_box;
+        GtkWidget     *label;
+        GtkWidget     *username_radio;
+        GtkWidget     *text_radio;
+        GtkWidget     *icon_radio;
+        GtkWidget     *check;
+        char          *key;
+        char          *value;
+        gboolean       has_lockdown;
+        gboolean       xnest_available;
+        gboolean       label_setup_done;
+        GdmUser       *user;
+
+        if (adata->prefs) {
+                gtk_window_set_screen (GTK_WINDOW (adata->prefs),
+                                       gtk_widget_get_screen (GTK_WIDGET (adata->applet)));
+                gtk_window_present (GTK_WINDOW (adata->prefs));
+                return;
+        }
+
+        xml = get_glade_xml ("prefs_dialog");
+
+        if (!xml)
+                return;
+
+        adata->prefs = glade_xml_get_widget (xml, "prefs_dialog");
+        gtk_dialog_set_default_response (GTK_DIALOG (adata->prefs),
+                                         GTK_RESPONSE_CLOSE);
+        gtk_window_set_transient_for (GTK_WINDOW (adata->prefs),
+                                      GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (adata->applet))));
+        gtk_window_set_screen (GTK_WINDOW (adata->prefs),
+                               gtk_widget_get_screen (GTK_WIDGET (adata->applet)));
+        g_signal_connect (adata->prefs,
+                          "response",
+                          G_CALLBACK (gtk_widget_destroy),
+                          NULL);
+        g_signal_connect (adata->prefs,
+                          "delete-event",
+                          G_CALLBACK (gtk_true),
+                          NULL);
+        g_object_add_weak_pointer (G_OBJECT (adata->prefs),
+                                   (gpointer *) &adata->prefs);
+
+        warning_box = glade_xml_get_widget (xml, "warning_box");
+
+        label = glade_xml_get_widget (xml, "appearance_label");
+        make_label_bold (GTK_LABEL (label));
+
+        label = glade_xml_get_widget (xml, "options_label");
+        make_label_bold (GTK_LABEL (label));
+
+        username_radio = glade_xml_get_widget (xml, "username_radio");
+        text_radio = glade_xml_get_widget (xml, "text_radio");
+        icon_radio = glade_xml_get_widget (xml, "icon_radio");
+
+        has_lockdown = panel_applet_get_locked_down (adata->applet);
+
+        value = panel_applet_gconf_get_string (adata->applet, DISPLAY_KEY, NULL);
+        if (!value || strcmp (value, "text") == 0) {
+                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (text_radio), TRUE);
+        } else if (strcmp (value, "icon") == 0) {
+                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (icon_radio), TRUE);
+        } else if (strcmp (value, "username") == 0) {
+                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (username_radio), TRUE);
+        }
+        g_free (value);
+
+        g_object_set_data (G_OBJECT (username_radio),
+                           "prefs-radio-display-style",
+                           "username");
+        g_signal_connect (username_radio,
+                          "toggled",
+                          G_CALLBACK (prefs_radio_toggled_cb),
+                          adata);
+
+        user = gdm_user_manager_get_user_by_uid (adata->manager, getuid ());
+        if (user != NULL) {
+                gtk_label_set_text (GTK_LABEL (GTK_BIN (username_radio)->child),
+                                    gdm_user_get_real_name (user));
+        }
+
+        g_object_set_data (G_OBJECT (text_radio),
+                           "prefs-radio-display-style",
+                           "text");
+        g_signal_connect (text_radio,
+                          "toggled",
+                          G_CALLBACK (prefs_radio_toggled_cb),
+                          adata);
+
+        g_object_set_data (G_OBJECT (icon_radio),
+                           "prefs-radio-display-style", "icon");
+        g_signal_connect (icon_radio,
+                          "toggled",
+                          G_CALLBACK (prefs_radio_toggled_cb),
+                          adata);
+
+        label_setup_done = FALSE;
+        key = panel_applet_gconf_get_full_key (adata->applet, DISPLAY_KEY);
+        if (has_lockdown || !gconf_client_key_is_writable (adata->client, key, NULL)) {
+                GtkWidget *label;
+
+                gtk_widget_set_sensitive (username_radio, FALSE);
+                gtk_widget_set_sensitive (text_radio, FALSE);
+                gtk_widget_set_sensitive (icon_radio, FALSE);
+
+                label = glade_xml_get_widget (xml, "warning_label");
+                make_label_small_italic (GTK_LABEL (label));
+                label_setup_done = TRUE;
+
+                gtk_widget_show (warning_box);
+        }
+        g_free (key);
+
+        /* [_] Lock the screen after switching */
+        check = glade_xml_get_widget (xml, "lock_check");
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check),
+                                      panel_applet_gconf_get_bool (adata->applet,
+                                                                   LOCK_KEY,
+                                                                   NULL));
+        g_signal_connect (check,
+                          "toggled",
+                          G_CALLBACK (prefs_lock_check_toggled_cb),
+                          adata);
+        key = panel_applet_gconf_get_full_key (adata->applet, LOCK_KEY);
+        if (has_lockdown || !gconf_client_key_is_writable (adata->client, key, NULL)) {
+                gtk_widget_set_sensitive (check, FALSE);
+
+                if (!label_setup_done) {
+                        GtkWidget *label;
+
+                        label = glade_xml_get_widget (xml, "warning_label");
+                        make_label_small_italic (GTK_LABEL (label));
+                        label_setup_done = TRUE;
+
+                        gtk_widget_show (warning_box);
+                }
+        }
+        g_free (key);
+
+        /* [_] Create new logins in nested windows */
+        check = glade_xml_get_widget (xml, "xnest_check");
+        xnest_available = system_can_do_xnest ();
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check),
+                                      (panel_applet_gconf_get_bool (adata->applet,
+                                                                    USE_XNEST_KEY,
+                                                                    NULL) &&
+                                       xnest_available));
+        g_signal_connect (check,
+                          "toggled",
+                          G_CALLBACK (prefs_xnest_check_toggled_cb),
+                          adata);
+        key = panel_applet_gconf_get_full_key (adata->applet, USE_XNEST_KEY);
+        if (has_lockdown || !gconf_client_key_is_writable (adata->client, key, NULL)) {
+                gtk_widget_set_sensitive (check, FALSE);
+
+                if (!label_setup_done) {
+                        GtkWidget *label;
+
+                        label = glade_xml_get_widget (xml, "warning_label");
+                        make_label_small_italic (GTK_LABEL (label));
+                        label_setup_done = TRUE;
+
+                        gtk_widget_show (warning_box);
+                }
+        } else if (!xnest_available) {
+                gtk_widget_set_sensitive (check, FALSE);
+        }
+        g_free (key);
+
+        gtk_window_present (GTK_WINDOW (adata->prefs));
+}
+
+static void
+help_cb (BonoboUIComponent *ui_container,
+         GdmAppletData     *adata,
+         const char        *cname)
+{
+        GError *err;
+
+        err = NULL;
+        gnome_help_display_on_screen ("gdm-user-switch-applet", NULL,
+                                      gtk_widget_get_screen (GTK_WIDGET (adata->applet)),
+                                      &err);
+        if (err) {
+                g_warning ("Could not open help document: %s", err->message);
+                g_error_free (err);
+        }
+}
+
+static void
+about_cb (BonoboUIComponent *ui_container,
+          gpointer           data,
+          const char       *cname)
+{
+        static const char *authors[] = {
+                "James M. Cape <jcape ignore-your tv>",
+                "Thomas Thurman <thomas thurman org uk>",
+                "William Jon McCann <jmccann redhat com>",
+                NULL
+        };
+        static char *license[] = {
+                N_("The User Switch Applet 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."),
+                N_("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."),
+                N_("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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA "),
+                NULL
+        };
+        char *license_i18n;
+
+        license_i18n = g_strjoinv ("\n\n", license);
+
+        gtk_show_about_dialog (NULL,
+                               "version", VERSION,
+                               "copyright", "Copyright \xc2\xa9 2004-2005 James M. Cape.\n"
+                               "Copyright \xc2\xa9 2006 Thomas Thurman.\n"
+                               "Copyright \xc2\xa9 2008 Red Hat Inc.",
+                               "comments", _("A menu to quickly switch between users."),
+                               "authors", authors,
+                               "license", license_i18n,
+                               "wrap-license", TRUE,
+                               "translator-credits", _("translator-credits"),
+                               "logo-icon-name", "stock_people",
+                               NULL);
+
+        g_free (license_i18n);
+}
+
+
+static void
+admin_cb (BonoboUIComponent *ui_container,
+          gpointer           data,
+          const char       *cname)
+{
+#ifdef USERS_ADMIN
+        char   **args;
+        gboolean res;
+        GError  *err;
+
+        err = NULL;
+        if (!g_shell_parse_argv (USERS_ADMIN, NULL, &args, &err)) {
+                g_critical ("Could not parse users and groups management command line `%s': %s",
+                            USERS_ADMIN, err->message);
+                return;
+        }
+
+        res = g_spawn_async (g_get_home_dir (),
+                             args,
+                             NULL,
+                             (G_SPAWN_STDOUT_TO_DEV_NULL |
+                              G_SPAWN_STDERR_TO_DEV_NULL |
+                              G_SPAWN_SEARCH_PATH),
+                             NULL,
+                             NULL,
+                             NULL,
+                             &err);
+        if (! res) {
+                g_critical ("Could not run `%s' to manage users and groups: %s",
+                            USERS_ADMIN, err->message);
+                g_error_free (err);
+        }
+        g_strfreev (args);
+#endif /* USERS_ADMIN */
+}
+
+static void
+setup_cb (BonoboUIComponent *ui_container,
+          gpointer           data,
+          const char       *cname)
+{
+#ifdef GDM_SETUP
+        char **args;
+        GError *err;
+
+        err = NULL;
+        if (!g_shell_parse_argv (GDM_SETUP, NULL, &args, &err)) {
+                g_critical ("Could not parse GDM configuration command line `%s': %s",
+                            GDM_SETUP, err->message);
+                return;
+        }
+
+        if (!g_spawn_async (g_get_home_dir (), args, NULL,
+                            (G_SPAWN_STDOUT_TO_DEV_NULL |
+                             G_SPAWN_STDERR_TO_DEV_NULL |
+                             G_SPAWN_SEARCH_PATH),
+                            NULL, NULL, NULL, &err)) {
+                g_critical ("Could not run `%s' to configure GDM: %s",
+                            GDM_SETUP, err->message);
+                g_error_free (err);
+        }
+        g_strfreev (args);
+#endif /* GDM_SETUP */
+}
+
+static void
+set_menuitem_icon (BonoboUIComponent *component,
+                   const char       *item_path,
+                   GtkIconTheme      *theme,
+                   const char       *icon_name,
+                   gint               icon_size)
+{
+        GdkPixbuf *pixbuf;
+        gint width, height;
+
+        pixbuf = gtk_icon_theme_load_icon (theme, icon_name, icon_size, 0, NULL);
+        if (!pixbuf)
+                return;
+
+        width = gdk_pixbuf_get_width (pixbuf);
+        height = gdk_pixbuf_get_height (pixbuf);
+        if (width > icon_size + 4 || height > icon_size + 4) {
+                GdkPixbuf *tmp;
+                if (height > width) {
+                        width *= (gdouble) icon_size / (gdouble) height;
+                        height = icon_size;
+                } else {
+                        height *= (gdouble) icon_size / (gdouble) width;
+                        width = icon_size;
+                }
+                tmp = gdk_pixbuf_scale_simple (pixbuf, width, height, GDK_INTERP_BILINEAR);
+                g_object_unref (pixbuf);
+                pixbuf = tmp;
+        }
+
+        bonobo_ui_util_set_pixbuf (component, item_path, pixbuf, NULL);
+        g_object_unref (pixbuf);
+}
+
+static void
+applet_style_set_cb (GtkWidget *widget,
+                     GtkStyle  *old_style,
+                     gpointer   data)
+{
+        BonoboUIComponent *component;
+        GdkScreen *screen;
+        GtkIconTheme *theme;
+        gint width, height, icon_size;
+
+        if (gtk_widget_has_screen (widget))
+                screen = gtk_widget_get_screen (widget);
+        else
+                screen = gdk_screen_get_default ();
+
+        if (gtk_icon_size_lookup_for_settings (gtk_settings_get_for_screen (screen),
+                                               GTK_ICON_SIZE_MENU, &width, &height))
+                icon_size = MAX (width, height);
+        else
+                icon_size = 16;
+
+        theme = gtk_icon_theme_get_for_screen (screen);
+        component = panel_applet_get_popup_component (PANEL_APPLET (widget));
+
+        set_menuitem_icon (component, "/commands/GdmAboutMe",
+                           theme, "user-info", icon_size);
+        set_menuitem_icon (component, "/commands/GdmUsersGroupsAdmin",
+                           theme, "stock_people", icon_size);
+        set_menuitem_icon (component, "/commands/GdmGdmSetup",
+                           theme, "gdm-setup", icon_size);
+}
+
+static void
+applet_change_background_cb (PanelApplet               *applet,
+                             PanelAppletBackgroundType  type,
+                             GdkColor                  *color,
+                             GdkPixmap                 *pixmap,
+                             gpointer                   data)
+{
+        GdmAppletData *adata;
+        GtkRcStyle *rc_style;
+        GtkStyle   *style;
+
+        adata = data;
+
+        gtk_widget_set_style (adata->menubar, NULL);
+        rc_style = gtk_rc_style_new ();
+        gtk_widget_modify_style (GTK_WIDGET (adata->menubar), rc_style);
+        gtk_rc_style_unref (rc_style);
+
+        switch (type) {
+        case PANEL_NO_BACKGROUND:
+                break;
+        case PANEL_COLOR_BACKGROUND:
+                gtk_widget_modify_bg (adata->menubar, GTK_STATE_NORMAL, color);
+                break;
+        case PANEL_PIXMAP_BACKGROUND:
+                style = gtk_style_copy (adata->menubar->style);
+                if (style->bg_pixmap[GTK_STATE_NORMAL])
+                        g_object_unref (style->bg_pixmap[GTK_STATE_NORMAL]);
+
+                style->bg_pixmap[GTK_STATE_NORMAL] = g_object_ref (pixmap);
+                gtk_widget_set_style (adata->menubar, style);
+                g_object_unref (style);
+                break;
+        }
+}
+
+/*
+ * gnome-panel/applets/wncklet/window-menu.c:window_menu_key_press_event()
+ *
+ * Copyright (C) 2003 Sun Microsystems, Inc.
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ * Copyright (C) 2000 Helix Code, Inc.
+ */
+static gboolean
+applet_key_press_event_cb (GtkWidget   *widget,
+                           GdkEventKey *event,
+                           gpointer     data)
+{
+        GdmAppletData *adata;
+        GtkMenuShell *menu_shell;
+
+        switch (event->keyval) {
+        case GDK_KP_Enter:
+        case GDK_ISO_Enter:
+        case GDK_3270_Enter:
+        case GDK_Return:
+        case GDK_space:
+        case GDK_KP_Space:
+                adata = data;
+                menu_shell = GTK_MENU_SHELL (adata->menubar);
+                /*
+                 * We need to call _gtk_menu_shell_activate() here as is done in
+                 * window_key_press_handler in gtkmenubar.c which pops up menu
+                 * when F10 is pressed.
+                 *
+                 * As that function is private its code is replicated here.
+                 */
+                if (!menu_shell->active) {
+                        gtk_grab_add (GTK_WIDGET (menu_shell));
+                        menu_shell->have_grab = TRUE;
+                        menu_shell->active = TRUE;
+                }
+
+                gtk_menu_shell_select_first (menu_shell, FALSE);
+                return TRUE;
+        default:
+                break;
+        }
+
+        return FALSE;
+}
+
+/*
+ * gnome-panel/applets/wncklet/window-menu.c:window_menu_size_allocate()
+ *
+ * Copyright (C) 2003 Sun Microsystems, Inc.
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ * Copyright (C) 2000 Helix Code, Inc.
+ */
+static void
+applet_size_allocate_cb (GtkWidget     *widget,
+                         GtkAllocation *allocation,
+                         gpointer       data)
+{
+        GdmAppletData *adata;
+        GList *children;
+        GtkWidget *top_item;
+        PanelAppletOrient orient;
+        gint item_border;
+        gint pixel_size;
+        gdouble text_angle = 0.0;
+        GtkPackDirection pack_direction = GTK_PACK_DIRECTION_LTR;
+
+        adata = data;
+        children = gtk_container_get_children (GTK_CONTAINER (adata->menubar));
+        top_item = GTK_WIDGET (children->data);
+        g_list_free (children);
+
+        orient = panel_applet_get_orient (PANEL_APPLET (widget));
+
+        item_border = (MAX (top_item->style->xthickness,
+                            top_item->style->ythickness) * 2);
+
+        switch (orient) {
+        case PANEL_APPLET_ORIENT_UP:
+        case PANEL_APPLET_ORIENT_DOWN:
+                gtk_widget_set_size_request (top_item, -1, allocation->height);
+                pixel_size = allocation->height - item_border;
+                pack_direction = GTK_PACK_DIRECTION_RTL;
+                text_angle = 0.0;
+                break;
+        case PANEL_APPLET_ORIENT_LEFT:
+                gtk_widget_set_size_request (top_item, allocation->width, -1);
+                pixel_size = allocation->width - item_border;
+                pack_direction = GTK_PACK_DIRECTION_TTB;
+                text_angle = 270.0;
+                break;
+        case PANEL_APPLET_ORIENT_RIGHT:
+                gtk_widget_set_size_request (top_item, allocation->width, -1);
+                pixel_size = allocation->width - item_border;
+                pack_direction = GTK_PACK_DIRECTION_TTB;
+                text_angle = 90.0;
+                break;
+        default:
+                g_assert_not_reached ();
+                break;
+        }
+
+        gtk_menu_bar_set_pack_direction (GTK_MENU_BAR (adata->menubar),
+                                         pack_direction);
+
+        if (GTK_IS_IMAGE (adata->imglabel)) {
+                gtk_image_set_pixel_size (GTK_IMAGE (adata->imglabel),
+                                          pixel_size - 4);
+        } else {
+                gtk_label_set_angle (GTK_LABEL (adata->imglabel), text_angle);
+        }
+}
+
+
+static void
+gdm_applet_data_free (GdmAppletData *adata)
+{
+        if (adata->prefs)
+                gtk_widget_destroy (adata->prefs);
+
+        gconf_client_notify_remove (adata->client, adata->client_notify_applet_id);
+        gconf_client_notify_remove (adata->client, adata->client_notify_global_id);
+        gconf_client_remove_dir (adata->client, GLOBAL_DIR, NULL);
+        g_object_unref (adata->client);
+        g_object_unref (adata->manager);
+        g_object_unref (tooltips);
+
+        g_free (adata);
+}
+
+
+/*
+ * gnome-panel/applets/wncklet/window-menu.c:window_menu_on_expose()
+ *
+ * Copyright (C) 2003 Sun Microsystems, Inc.
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ * Copyright (C) 2000 Helix Code, Inc.
+ */
+static gboolean
+menubar_expose_event_cb (GtkWidget      *widget,
+                         GdkEventExpose *event,
+                         gpointer        data)
+{
+        GdmAppletData *adata;
+
+        adata = data;
+
+        if (GTK_WIDGET_HAS_FOCUS (adata->applet))
+                gtk_paint_focus (widget->style, widget->window, GTK_WIDGET_STATE (widget),
+                                 NULL, widget, "menu-applet", 0, 0, -1, -1);
+
+        return FALSE;
+}
+
+static gint
+sort_menu_comparedatafunc (gconstpointer a,
+                           gconstpointer b,
+                           gpointer      data)
+{
+        GdmAppletData *adata;
+        gboolean a_is_user, b_is_user;
+
+        a_is_user = GDM_IS_USER_MENU_ITEM (a);
+        b_is_user = GDM_IS_USER_MENU_ITEM (b);
+
+        if (a_is_user && !b_is_user)
+                return -1;
+
+        if (b_is_user && !a_is_user)
+                return 1;
+
+        if (a_is_user && b_is_user)
+                return gdm_user_collate (gdm_user_menu_item_get_user ((GdmUserMenuItem *) a),
+                                         gdm_user_menu_item_get_user ((GdmUserMenuItem *) b));
+
+        adata = data;
+        if (a == adata->separator_item)
+                return -1;
+
+        if (b == adata->separator_item)
+                return 1;
+
+        if (a == adata->login_screen_item)
+                return -1;
+
+        if (b == adata->login_screen_item)
+                return 1;
+
+        return 0;
+}
+
+static void
+sort_menu (GdmAppletData *adata)
+{
+        GSList *items;
+        guint n_items, n_rows, n_cols, row, column, count;
+        gint screen_height;
+
+        if (!gtk_widget_has_screen (adata->menu))
+                return;
+
+        adata->items = g_slist_sort_with_data (adata->items,
+                                               sort_menu_comparedatafunc, adata);
+
+        screen_height = gdk_screen_get_height (gtk_widget_get_screen (adata->menu));
+
+        n_items = 0;
+        items = adata->items;
+        while (items) {
+                if (GTK_WIDGET_VISIBLE (items->data))
+                        n_items++;
+
+                items = items->next;
+        }
+
+        /* FIXME: Do a better job of figuring out exactly how big the menuitems are */
+        n_rows = (gdouble) screen_height / (gdouble) (adata->pixel_size + 16);
+        n_cols = (gdouble) n_items / (gdouble) n_rows;
+        n_rows = (gdouble) n_items / (gdouble) (n_cols + 1);
+
+        row = 0;
+        column = 0;
+        count = 0;
+        items = adata->items;
+        while (items) {
+                if (GTK_WIDGET_VISIBLE (items->data)) {
+                        gtk_menu_attach (GTK_MENU (adata->menu), items->data,
+                                         column, column + 1, row, row + 1);
+                        row++;
+                        if (row > n_rows) {
+                                row = 0;
+                                column++;
+                        }
+
+                        /* Just re-attaching them doesn't alter the order you get them
+                         * in when you move through with the arrow keys, though; we
+                         * have to set that explicitly.
+                         */
+                        gtk_menu_reorder_child (GTK_MENU (adata->menu),
+                                                items->data, count++);
+                }
+
+                items = items->next;
+        }
+}
+
+static void
+menu_style_set_cb (GtkWidget *menu,
+                   GtkStyle  *old_style,
+                   gpointer   data)
+{
+        GdmAppletData *adata;
+        GtkSettings *settings;
+        gint width, height;
+
+        adata = data;
+        adata->icon_size = gtk_icon_size_from_name ("panel-menu");
+
+        if (adata->icon_size == GTK_ICON_SIZE_INVALID)
+                adata->icon_size = gtk_icon_size_register ("panel-menu", 24, 24);
+
+        if (gtk_widget_has_screen (menu))
+                settings = gtk_settings_get_for_screen (gtk_widget_get_screen (menu));
+        else
+                settings = gtk_settings_get_default ();
+
+        if (!gtk_icon_size_lookup_for_settings (settings, adata->icon_size,
+                                                &width, &height))
+                adata->pixel_size = -1;
+        else
+                adata->pixel_size = MAX (width, height);
+
+        sort_menu (adata);
+}
+
+static void
+menuitem_destroy_cb (GtkWidget *menuitem,
+                     gpointer   data)
+{
+        GdmAppletData *adata;
+        GSList *li;
+
+        adata = data;
+
+        if (GDM_IS_USER_MENU_ITEM (menuitem)) {
+                GdmUser *user;
+
+                user = gdm_user_menu_item_get_user (GDM_USER_MENU_ITEM (menuitem));
+                if (user)
+                        g_object_set_qdata (G_OBJECT (user),
+                                            adata->user_menu_item_quark, NULL);
+        }
+
+        li = g_slist_find (adata->items, menuitem);
+        adata->items = g_slist_delete_link (adata->items, li);
+        sort_menu (adata);
+}
+
+static void
+menuitem_style_set_cb (GtkWidget *menuitem,
+                       GtkStyle  *old_style,
+                       gpointer   data)
+{
+        GdmAppletData *adata;
+
+        adata = data;
+
+        if (GDM_IS_USER_MENU_ITEM (menuitem))
+                gdm_user_menu_item_set_icon_size (GDM_USER_MENU_ITEM (menuitem),
+                                                   adata->pixel_size);
+        else
+                {
+                        GtkWidget *image;
+                        const char *icon_name;
+
+                        if (menuitem == adata->login_screen_item)
+                                icon_name = "gdm";
+                        else if (menuitem == adata->login_window_item)
+                                icon_name = "gdm-xnest";
+                        else
+                                icon_name = GTK_STOCK_MISSING_IMAGE;
+
+                        image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (menuitem));
+                        gtk_image_set_pixel_size (GTK_IMAGE (image), adata->pixel_size);
+                        gtk_image_set_from_icon_name (GTK_IMAGE (image), icon_name,
+                                                      adata->icon_size);
+                }
+}
+
+
+static void
+user_notify_display_name_cb (GObject    *object,
+                             GParamSpec *pspec,
+                             gpointer    data)
+{
+        gtk_label_set_text (data, gdm_user_get_real_name (GDM_USER (object)));
+}
+
+
+/* Called every time the menu is displayed (and also for some reason
+ * immediately it's created, which does no harm). All we have to do
+ * here is kick off a request to GDM to let us know which users are
+ * logged in, so we can display check marks next to their names.
+ */
+static gboolean
+menu_expose_cb (GtkWidget *menu,
+                gpointer   data)
+{
+
+        return FALSE;
+}
+
+static void
+switch_to_user_session (GdmAppletData *adata,
+                        GdmUser       *user)
+{
+        gboolean res;
+
+        res = gdm_user_manager_activate_user_session (adata->manager, user);
+}
+
+static void
+maybe_lock_screen (GdmAppletData *adata)
+{
+        if (panel_applet_gconf_get_bool (adata->applet, LOCK_KEY, NULL)) {
+                char      *args[3];
+                GError    *err;
+                GdkScreen *screen;
+                gboolean   use_gscreensaver = TRUE;
+
+                args[0] = g_find_program_in_path ("gnome-screensaver-command");
+                if (!args[0]) {
+                        args[0] = g_find_program_in_path ("xscreensaver-command");
+                        use_gscreensaver = FALSE;
+                }
+                if (!args[0]) {
+                        return;
+                }
+
+                if (use_gscreensaver) {
+                        args[1] = "--lock";
+                } else {
+                        args[1] = "-lock";
+                }
+                args[2] = NULL;
+
+                if (gtk_widget_has_screen (GTK_WIDGET (adata->applet))) {
+                        screen = gtk_widget_get_screen (GTK_WIDGET (adata->applet));
+                } else {
+                        screen = gdk_screen_get_default ();
+                }
+
+                err = NULL;
+                if (!gdk_spawn_on_screen (screen, g_get_home_dir (), args, NULL,
+                                          (G_SPAWN_STDERR_TO_DEV_NULL |
+                                           G_SPAWN_STDOUT_TO_DEV_NULL),
+                                          NULL, NULL, NULL, &err)) {
+                        g_warning (_("Can't lock screen: %s"), err->message);
+                        g_error_free (err);
+                }
+
+                if (use_gscreensaver) {
+                        args[1] = "--throttle";
+                } else {
+                        args[1] = "-throttle";
+                }
+
+                if (!gdk_spawn_on_screen (screen, g_get_home_dir (), args, NULL,
+                                          (G_SPAWN_STDERR_TO_DEV_NULL |
+                                           G_SPAWN_STDOUT_TO_DEV_NULL),
+                                          NULL, NULL, NULL, &err)) {
+                        g_warning (_("Can't temporarily set screensaver to blank screen: %s"),
+                                   err->message);
+                        g_error_free (err);
+                }
+
+                g_free (args[0]);
+        }
+}
+
+static void
+do_switch (GdmAppletData *adata,
+           GdmUser       *user,
+           gboolean       use_xnest)
+{
+        guint num_sessions;
+
+        g_debug ("Do user switch");
+
+        if (user == NULL) {
+                /* FIXME: xnest?? */
+                gdm_user_manager_goto_login_session (adata->manager);
+                return;
+        }
+
+        num_sessions = gdm_user_get_num_sessions (user);
+        if (num_sessions > 0) {
+                switch_to_user_session (adata, user);
+        } else {
+                gdm_user_manager_goto_login_session (adata->manager);
+        }
+
+        maybe_lock_screen (adata);
+}
+
+static void
+user_item_activate_cb (GtkWidget     *menuitem,
+                       GdmAppletData *adata)
+{
+        GdmUserMenuItem *item;
+        GdmUser         *user;
+
+        item = GDM_USER_MENU_ITEM (menuitem);
+        user = gdm_user_menu_item_get_user (item);
+
+        do_switch (adata, user, FALSE);
+}
+
+static void
+user_sessions_changed_cb (GdmUser       *user,
+                          GdmAppletData *adata)
+{
+        GtkWidget *menuitem;
+        gboolean active_only;
+
+        menuitem = g_object_get_qdata (G_OBJECT (user), adata->user_menu_item_quark);
+        if (!menuitem)
+                return;
+
+        active_only = gconf_client_get_bool (adata->client, ACTIVE_ONLY_KEY, NULL);
+        if (active_only) {
+                guint num;
+                num = gdm_user_get_num_sessions (user);
+                if (num > 0) {
+                        gtk_widget_show (menuitem);
+                } else {
+                        gtk_widget_hide (menuitem);
+                }
+        } else {
+                gtk_widget_show (menuitem);
+        }
+
+        sort_menu (adata);
+}
+
+static void
+manager_user_added_cb (GdmUserManager *manager,
+                       GdmUser        *user,
+                       GdmAppletData  *adata)
+{
+        GtkWidget *menuitem;
+        gboolean active_only;
+
+        menuitem = gdm_user_menu_item_new (user);
+        g_object_set_qdata (G_OBJECT (user), adata->user_menu_item_quark, menuitem);
+        g_signal_connect (menuitem, "style-set",
+                          G_CALLBACK (menuitem_style_set_cb), adata);
+        g_signal_connect (menuitem, "destroy",
+                          G_CALLBACK (menuitem_destroy_cb), adata);
+        g_signal_connect (menuitem, "activate",
+                          G_CALLBACK (user_item_activate_cb), adata);
+        gtk_menu_shell_append (GTK_MENU_SHELL (adata->menu), menuitem);
+        adata->items = g_slist_prepend (adata->items, menuitem);
+
+        active_only = gconf_client_get_bool (adata->client, ACTIVE_ONLY_KEY, NULL);
+        if (active_only) {
+                guint num;
+                num = gdm_user_get_num_sessions (user);
+                if (num > 0) {
+                        gtk_widget_show (menuitem);
+                }
+        } else {
+                gtk_widget_show (menuitem);
+        }
+        g_signal_connect (user, "sessions-changed",
+                          G_CALLBACK (user_sessions_changed_cb), adata);
+        sort_menu (adata);
+}
+
+static void
+login_screen_activate_cb (GtkMenuItem *item,
+                          gpointer     data)
+{
+        GdmAppletData *adata;
+        GdmUser       *user;
+
+        adata = data;
+        user = NULL;
+
+        do_switch (adata, user, FALSE);
+}
+
+static void
+login_window_activate_cb (GtkMenuItem *item,
+                          gpointer     data)
+{
+        GdmAppletData *adata;
+        GdmUser       *user;
+
+        adata = data;
+        user = NULL;
+
+        if (!system_can_do_xnest ()) {
+                g_critical ("%s: (%s): FIXME: show an error dialog when Xnest is missing.",
+                            G_STRLOC, G_STRFUNC);
+                gtk_widget_hide (GTK_WIDGET (item));
+        } else {
+                do_switch (adata, user, TRUE);
+        }
+}
+
+static void
+display_key_changed (GdmAppletData *adata,
+                     GConfClient   *client,
+                     GConfValue    *value)
+{
+        const char *str;
+        GtkWidget  *parent;
+        GdmUser    *user;
+
+        str = gconf_value_get_string (value);
+        parent = adata->imglabel->parent;
+        user = gdm_user_manager_get_user_by_uid (adata->manager, getuid ());
+        if (str == NULL) {
+                if (adata->user_notify_id) {
+                        g_signal_handler_disconnect (user, adata->user_notify_id);
+                        adata->user_notify_id = 0;
+                        gtk_label_set_text (GTK_LABEL (adata->imglabel), _("Users"));
+                } else {
+                        gtk_widget_destroy (adata->imglabel);
+                        adata->imglabel = gtk_label_new (_("Users"));
+                        gtk_box_pack_start (GTK_BOX (parent), adata->imglabel,
+                                            TRUE, TRUE, 0);
+                        gtk_widget_show (adata->imglabel);
+                }
+                return;
+        }
+
+        if (strcmp (str, "username") == 0) {
+                if (GTK_IS_IMAGE (adata->imglabel)) {
+                        gtk_widget_destroy (adata->imglabel);
+
+                        adata->imglabel = gtk_label_new (gdm_user_get_real_name (user));
+                        adata->user_notify_id =
+                                g_signal_connect (user, "notify::display-name",
+                                                  G_CALLBACK (user_notify_display_name_cb),
+                                                  adata->imglabel);
+                        gtk_box_pack_start (GTK_BOX (parent), adata->imglabel,
+                                            TRUE, TRUE, 0);
+                        gtk_widget_show (adata->imglabel);
+                } else if (!adata->user_notify_id) {
+                        gtk_label_set_text (GTK_LABEL (adata->imglabel),
+                                            gdm_user_get_real_name (user));
+                        adata->user_notify_id =
+                                g_signal_connect (user, "notify::display-name",
+                                                  G_CALLBACK (user_notify_display_name_cb),
+                                                  adata->imglabel);
+                }
+        } else if (strcmp (str, "icon") == 0) {
+                if (!GTK_IS_IMAGE (adata->imglabel)) {
+                        guint item_border;
+
+                        if (adata->user_notify_id) {
+                                g_signal_handler_disconnect (user, adata->user_notify_id);
+                                adata->user_notify_id = 0;
+                        }
+                        if (adata->imglabel->parent->style)
+                                item_border = (MAX (adata->imglabel->parent->style->xthickness,
+                                                    adata->imglabel->parent->style->ythickness) * 2);
+                        else
+                                item_border = 0;
+
+                        gtk_widget_destroy (adata->imglabel);
+
+                        adata->imglabel =
+                                gtk_image_new_from_icon_name ("stock_people",
+                                                              GTK_ICON_SIZE_MENU);
+                        gtk_box_pack_start (GTK_BOX (parent), adata->imglabel,
+                                            TRUE, TRUE, 0);
+                        gtk_widget_show (adata->imglabel);
+                }
+        } else {
+                if (adata->user_notify_id) {
+                        g_signal_handler_disconnect (user, adata->user_notify_id);
+                        adata->user_notify_id = 0;
+                        gtk_label_set_text (GTK_LABEL (adata->imglabel), _("Users"));
+                } else {
+                        gtk_widget_destroy (adata->imglabel);
+                        adata->imglabel = gtk_label_new (_("Users"));
+                        gtk_box_pack_start (GTK_BOX (parent), adata->imglabel,
+                                            TRUE, TRUE, 0);
+                        gtk_widget_show (adata->imglabel);
+                }
+        }
+}
+
+static void
+xnest_key_changed (GdmAppletData *adata,
+                   GConfClient   *client,
+                   GConfValue    *value)
+{
+        char *str;
+
+        str = gconf_client_get_string (client, SHOW_SCREEN_KEY, NULL);
+        reset_login_screen_item (adata->login_screen_item,
+                                 gconf_value_get_bool (value), str);
+        g_free (str);
+
+        str = gconf_client_get_string (client, SHOW_WINDOW_KEY, NULL);
+        reset_login_window_item (adata->login_window_item,
+                                 gconf_value_get_bool (value), str);
+        g_free (str);
+
+        if (GTK_WIDGET_VISIBLE (adata->login_screen_item) ||
+            GTK_WIDGET_VISIBLE (adata->login_window_item)) {
+                gtk_widget_show (adata->separator_item);
+        } else {
+                gtk_widget_hide (adata->separator_item);
+        }
+}
+
+static void
+client_notify_applet_func (GConfClient   *client,
+                           guint          cnxn_id,
+                           GConfEntry    *entry,
+                           GdmAppletData *adata)
+{
+        GConfValue *value;
+        char       *key;
+
+        value = gconf_entry_get_value (entry);
+
+        if (!value)
+                return;
+
+        key = g_path_get_basename (gconf_entry_get_key (entry));
+
+        if (!key)
+                return;
+
+        if (strcmp (key, DISPLAY_KEY) == 0) {
+                display_key_changed (adata, client, value);
+        } else if (strcmp (key, USE_XNEST_KEY) == 0) {
+                xnest_key_changed (adata, client, value);
+        }
+
+        g_free (key);
+}
+
+
+static void
+client_notify_global_func (GConfClient   *client,
+                           guint          cnxn_id,
+                           GConfEntry    *entry,
+                           GdmAppletData *adata)
+{
+        GConfValue *value;
+        const char *key;
+
+        value = gconf_entry_get_value (entry);
+        key = gconf_entry_get_key (entry);
+
+        if (!value || !key)
+                return;
+
+        if (strcmp (key, SHOW_SCREEN_KEY) == 0)
+                reset_login_screen_item (adata->login_screen_item,
+                                         panel_applet_gconf_get_bool (adata->applet,
+                                                                      USE_XNEST_KEY, NULL),
+                                         gconf_value_get_string (value));
+        else if (strcmp (key, SHOW_WINDOW_KEY) == 0)
+                reset_login_window_item (adata->login_window_item,
+                                         panel_applet_gconf_get_bool (adata->applet,
+                                                                      USE_XNEST_KEY, NULL),
+                                         gconf_value_get_string (value));
+        else if (strcmp (key, ACTIVE_ONLY_KEY) == 0) {
+                GSList *items;
+
+                items = adata->items;
+                while (items) {
+                        if (GDM_IS_USER_MENU_ITEM (items->data)) {
+                                if (gconf_value_get_bool (value)) {
+                                        guint num;
+                                        num = gdm_user_get_num_sessions (gdm_user_menu_item_get_user (items->data));
+                                        if (num > 0) {
+                                                gtk_widget_show (items->data);
+                                        } else
+                                                gtk_widget_hide (items->data);
+                                } else
+                                        gtk_widget_show (items->data);
+                        }
+
+                        items = items->next;
+                }
+        }
+
+        if (GTK_WIDGET_VISIBLE (adata->login_screen_item) ||
+            GTK_WIDGET_VISIBLE (adata->login_window_item))
+                gtk_widget_show (adata->separator_item);
+        else
+                gtk_widget_hide (adata->separator_item);
+
+        sort_menu (adata);
+}
+
+
+static void
+client_notify_lockdown_func (GConfClient   *client,
+                             guint          cnxn_id,
+                             GConfEntry    *entry,
+                             GdmAppletData *adata)
+{
+        GConfValue *value;
+        const char *key;
+
+        value = gconf_entry_get_value (entry);
+        key = gconf_entry_get_key (entry);
+
+        if (!value || !key)
+                return;
+
+        if (strcmp (key, LOCKDOWN_KEY) == 0) {
+                if (gconf_value_get_bool (value)) {
+                        gtk_widget_hide ( GTK_WIDGET (adata->applet));
+                } else {
+                        gtk_widget_show ( GTK_WIDGET (adata->applet));
+                }
+        }
+}
+
+static gboolean
+applet_fill_cb (PanelApplet   *applet,
+                const char    *iid,
+                GdmAppletData *adata)
+{
+        static const BonoboUIVerb menu_verbs[] = {
+                BONOBO_UI_VERB ("GdmAboutMe", about_me_cb),
+                BONOBO_UI_VERB ("GdmUsersGroupsAdmin", admin_cb),
+                BONOBO_UI_VERB ("GdmGdmSetup", setup_cb),
+                BONOBO_UI_VERB ("GdmPreferences", (BonoboUIVerbFn)prefs_cb),
+                BONOBO_UI_VERB ("GdmHelp", (BonoboUIVerbFn)help_cb),
+                BONOBO_UI_VERB ("GdmAbout", about_cb),
+                BONOBO_UI_VERB_END
+        };
+        static gboolean    first_time = FALSE;
+        GtkWidget         *menuitem;
+        GtkWidget         *hbox;
+        GSList            *users;
+        char              *tmp;
+        char              *key;
+        char              *value;
+        gboolean           use_xnest;
+        gboolean           active_only;
+        BonoboUIComponent *popup_component;
+
+        if (strcmp (iid, "OAFIID:GNOME_GdmUserSwitchApplet") != 0)
+                return FALSE;
+
+        /* Global GdmManager */
+        if (!first_time)
+                {
+                        gint argc = 1;
+                        char *argv[2] = { "gdm-user-switch-applet", NULL};
+
+                        first_time = TRUE;
+
+                        program = gnome_program_init ("gdm-user-switch-applet",
+                                                      VERSION,
+                                                      LIBGNOME_MODULE,
+                                                      argc, argv,
+                                                      GNOME_PROGRAM_STANDARD_PROPERTIES,
+                                                      NULL);
+
+                        /* Do this here so it's only done once. */
+                        gtk_rc_parse_string ("style \"gdm-user-switch-menubar-style\"\n"
+                                             "{\n"
+                                             "GtkMenuBar::shadow-type = none\n"
+                                             "GtkMenuBar::internal-padding = 0\n"
+                                             "}\n"
+                                             "style \"gdm-user-switch-applet-style\"\n"
+                                             "{\n"
+                                             "GtkWidget::focus-line-width = 0\n"
+                                             "GtkWidget::focus-padding = 0\n"
+                                             "}\n"
+                                             "widget \"*.gdm-user-switch-menubar\" style \"gdm-user-switch-menubar-style\"\n"
+                                             "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"));
+                }
+
+        adata = g_new0 (GdmAppletData, 1);
+        adata->applet = applet;
+
+        adata->client = gconf_client_get_default ();
+        adata->manager = gdm_user_manager_ref_default ();
+
+        tmp = g_strdup_printf ("applet-user-menu-item-%p", adata);
+        adata->user_menu_item_quark = g_quark_from_string (tmp);
+        g_free (tmp);
+
+        if (!tooltips) {
+                tooltips = gtk_tooltips_new ();
+                g_object_ref (tooltips);
+                gtk_object_sink (GTK_OBJECT (tooltips));
+        } else {
+                g_object_ref (tooltips);
+        }
+
+        gtk_tooltips_set_tip (tooltips, GTK_WIDGET (applet), _("User Switcher"), NULL);
+        gtk_container_set_border_width (GTK_CONTAINER (applet), 0);
+        gtk_widget_set_name (GTK_WIDGET (applet), "gdm-user-switch-applet");
+        panel_applet_set_flags (applet, PANEL_APPLET_EXPAND_MINOR);
+        panel_applet_setup_menu_from_file (applet, NULL,
+                                           DATADIR "/gnome-2.0/ui/GNOME_GdmUserSwitchApplet.xml",
+                                           NULL, menu_verbs, adata);
+
+        popup_component = panel_applet_get_popup_component (applet);
+        if (panel_applet_get_locked_down (applet))
+                bonobo_ui_component_set_prop (popup_component, "/commands/GdmPreferences",
+                                              "hidden", "0", NULL);
+
+        /* Hide the admin context menu items if locked down or no cmd-line */
+        if (gconf_client_get_bool (adata->client,
+                                   "/desktop/gnome/lockdown/inhibit_command_line",
+                                   NULL) ||
+            panel_applet_get_locked_down (applet)) {
+                bonobo_ui_component_set_prop (popup_component,
+                                              "/popups/button3/GdmSeparator",
+                                              "hidden", "1", NULL);
+                bonobo_ui_component_set_prop (popup_component,
+                                              "/commands/GdmUsersGroupsAdmin",
+                                              "hidden", "1", NULL);
+                bonobo_ui_component_set_prop (popup_component, "/commands/GdmGdmSetup",
+                                              "hidden", "1", NULL);
+        } else {
+#ifndef USERS_ADMIN
+#  ifdef GDM_SETUP
+                bonobo_ui_component_set_prop (popup_component,
+                                              "/popups/button3/GdmSeparator",
+                                              "hidden", "1",
+                                              NULL);
+#  endif /* !GDM_SETUP */
+                bonobo_ui_component_set_prop (popup_component,
+                                              "/commands/GdmUsersGroupsAdmin",
+                                              "hidden", "1",
+                                              NULL);
+#endif /* !USERS_ADMIN */
+
+#ifndef GDM_SETUP
+                bonobo_ui_component_set_prop (popup_component, "/commands/GdmGdmSetup",
+                                              "hidden", "1",
+                                              NULL);
+#endif /* !GDM_SETUP */
+        }
+
+        /* Hide the gdmphotosetup item if it can't be found in the path. */
+        tmp = g_find_program_in_path ("gnome-about-me");
+        if (!tmp) {
+                bonobo_ui_component_set_prop (popup_component,
+                                              "/commands/GdmAboutMe",
+                                              "hidden", "1",
+                                              NULL);
+        } else {
+                g_free (tmp);
+        }
+
+        panel_applet_add_preferences (applet,
+                                      "/schemas/apps/gdm-user-switch-applet/per-applet",
+                                      NULL);
+        g_signal_connect (adata->applet, "style-set",
+                          G_CALLBACK (applet_style_set_cb), adata);
+        g_signal_connect (applet, "change-background",
+                          G_CALLBACK (applet_change_background_cb), adata);
+        g_signal_connect (applet, "size-allocate",
+                          G_CALLBACK (applet_size_allocate_cb), adata);
+        g_signal_connect (applet, "key-press-event",
+                          G_CALLBACK (applet_key_press_event_cb), adata);
+        g_signal_connect_after (applet, "focus-in-event",
+                                G_CALLBACK (gtk_widget_queue_draw), NULL);
+        g_signal_connect_after (applet, "focus-out-event",
+                                G_CALLBACK (gtk_widget_queue_draw), NULL);
+        g_object_set_data_full (G_OBJECT (applet), "gdm-applet-data", adata,
+                                (GDestroyNotify) gdm_applet_data_free);
+
+        adata->menubar = gtk_menu_bar_new ();
+        gtk_widget_set_name (adata->menubar, "gdm-user-switch-menubar");
+        GTK_WIDGET_SET_FLAGS (adata->menubar,
+                              GTK_WIDGET_FLAGS (adata->menubar) | GTK_CAN_FOCUS);
+        g_signal_connect (adata->menubar, "button-press-event",
+                          G_CALLBACK (menubar_button_press_event_cb), adata);
+        g_signal_connect_after (adata->menubar, "expose-event",
+                                G_CALLBACK (menubar_expose_event_cb), adata);
+        gtk_container_add (GTK_CONTAINER (applet), adata->menubar);
+        gtk_widget_show (adata->menubar);
+
+        menuitem = gtk_menu_item_new ();
+        gtk_menu_shell_append (GTK_MENU_SHELL (adata->menubar), menuitem);
+        gtk_widget_show (menuitem);
+
+        hbox = gtk_hbox_new (FALSE, 0);
+        gtk_container_add (GTK_CONTAINER (menuitem), hbox);
+        gtk_widget_show (hbox);
+
+        value = panel_applet_gconf_get_string (applet, DISPLAY_KEY, NULL);
+        if (value) {
+                if (strcmp (value, "username") == 0) {
+                        GdmUser *user;
+
+                        user = gdm_user_manager_get_user_by_uid (adata->manager, getuid ());
+                        adata->imglabel = gtk_label_new (gdm_user_get_real_name (user));
+                        adata->user_notify_id =
+                                g_signal_connect (user, "notify::display-name",
+                                                  G_CALLBACK (user_notify_display_name_cb),
+                                                  adata->imglabel);
+                        gtk_box_pack_start (GTK_BOX (hbox), adata->imglabel, TRUE, TRUE, 0);
+                        gtk_widget_show (adata->imglabel);
+                } else if (strcmp (value, "icon") == 0) {
+                        adata->imglabel = gtk_image_new_from_icon_name ("stock_people",
+                                                                                        GTK_ICON_SIZE_MENU);
+                        gtk_container_add (GTK_CONTAINER (hbox), adata->imglabel);
+                        gtk_widget_show (adata->imglabel);
+                } else {
+                        adata->imglabel = gtk_label_new (_("Users"));
+                        gtk_box_pack_start (GTK_BOX (hbox), adata->imglabel, TRUE, TRUE, 0);
+                        gtk_widget_show (adata->imglabel);
+                }
+        } else {
+                adata->imglabel = gtk_label_new (_("Users"));
+                gtk_box_pack_start (GTK_BOX (hbox), adata->imglabel, TRUE, TRUE, 0);
+                gtk_widget_show (adata->imglabel);
+        }
+        g_free (value);
+
+        adata->menu = gtk_menu_new ();
+        gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), adata->menu);
+        g_signal_connect (adata->menu, "style-set",
+                          G_CALLBACK (menu_style_set_cb), adata);
+        g_signal_connect (adata->menu, "show",
+                          G_CALLBACK (menu_expose_cb), adata);
+        gtk_widget_show (adata->menu);
+
+        active_only = gconf_client_get_bool (adata->client, ACTIVE_ONLY_KEY, NULL);
+
+        /* This next part populates the list with all the users we currently know
+         * about. For almost all cases, this is the empty list, because we're
+         * asynchronous, and the data hasn't come back from the callback saying who
+         * the users are yet. However, if someone has two GDMs on their toolbars (why,
+         * I have no freaking idea, but bear with me here), the menu of the second
+         * one to be initialised needs to be filled in from the start rather than
+         * depending on getting data from the callback like the first one.
+         */
+        users = gdm_user_manager_list_users (adata->manager);
+        while (users) {
+                menuitem = gdm_user_menu_item_new (users->data);
+                g_object_set_qdata (users->data, adata->user_menu_item_quark, menuitem);
+                g_signal_connect (menuitem, "style-set",
+                                  G_CALLBACK (menuitem_style_set_cb), adata);
+                g_signal_connect (menuitem, "destroy",
+                                  G_CALLBACK (menuitem_destroy_cb), adata);
+                g_signal_connect (menuitem, "activate",
+                                  G_CALLBACK (user_item_activate_cb), adata);
+                gtk_menu_shell_append (GTK_MENU_SHELL (adata->menu), menuitem);
+                adata->items = g_slist_prepend (adata->items, menuitem);
+
+                if (active_only) {
+                        guint num;
+                        num = gdm_user_get_num_sessions (users->data);
+                        if (num > 0) {
+                                gtk_widget_show (menuitem);
+                        }
+                } else {
+                        gtk_widget_show (menuitem);
+                }
+                g_signal_connect (users->data, "sessions-changed",
+                                  G_CALLBACK (user_sessions_changed_cb), adata);
+
+                users = g_slist_delete_link (users, users);
+        }
+
+        g_signal_connect (adata->manager, "user-added",
+                          G_CALLBACK (manager_user_added_cb), adata);
+
+        adata->separator_item = gtk_separator_menu_item_new ();
+        gtk_menu_shell_append (GTK_MENU_SHELL (adata->menu), adata->separator_item);
+        adata->items = g_slist_prepend (adata->items, adata->separator_item);
+
+        adata->login_screen_item = gtk_image_menu_item_new_with_label (_("Other"));
+        gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (adata->login_screen_item),
+                                       gtk_image_new ());
+        gtk_menu_shell_append (GTK_MENU_SHELL (adata->menu),
+                               adata->login_screen_item);
+        g_signal_connect (adata->login_screen_item, "style-set",
+                          G_CALLBACK (menuitem_style_set_cb), adata);
+        g_signal_connect (adata->login_screen_item, "destroy",
+                          G_CALLBACK (menuitem_destroy_cb), adata);
+        g_signal_connect (adata->login_screen_item, "activate",
+                          G_CALLBACK (login_screen_activate_cb), adata);
+        adata->items = g_slist_prepend (adata->items, adata->login_screen_item);
+
+        adata->login_window_item = gtk_image_menu_item_new_with_label (_("Login Window"));
+        gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (adata->login_window_item),
+                                       gtk_image_new ());
+        gtk_menu_shell_append (GTK_MENU_SHELL (adata->menu),
+                               adata->login_window_item);
+        g_signal_connect (adata->login_window_item, "style-set",
+                          G_CALLBACK (menuitem_style_set_cb), adata);
+        g_signal_connect (adata->login_window_item, "destroy",
+                          G_CALLBACK (menuitem_destroy_cb), adata);
+        g_signal_connect (adata->login_window_item, "activate",
+                          G_CALLBACK (login_window_activate_cb), adata);
+        adata->items = g_slist_prepend (adata->items, adata->login_window_item);
+
+        use_xnest = panel_applet_gconf_get_bool (applet, USE_XNEST_KEY, NULL);
+        value = gconf_client_get_string (adata->client, SHOW_SCREEN_KEY, NULL);
+        reset_login_screen_item (adata->login_screen_item, use_xnest, value);
+        g_free (value);
+
+        value = gconf_client_get_string (adata->client, SHOW_WINDOW_KEY, NULL);
+        reset_login_window_item (adata->login_window_item, use_xnest, value);
+        g_free (value);
+
+        if (GTK_WIDGET_VISIBLE (adata->login_screen_item) ||
+            GTK_WIDGET_VISIBLE (adata->login_window_item))
+                gtk_widget_show (adata->separator_item);
+        else
+                gtk_widget_hide (adata->separator_item);
+
+        key = panel_applet_gconf_get_full_key (applet, DISPLAY_KEY);
+        if (key) {
+                char *path;
+
+                path = g_path_get_dirname (key);
+                g_free (key);
+                adata->client_notify_applet_id =
+                        gconf_client_notify_add (adata->client,
+                                                 path,
+                                                 (GConfClientNotifyFunc)client_notify_applet_func,
+                                                 adata,
+                                                 NULL,
+                                                 NULL);
+                g_free (path);
+        }
+
+        gconf_client_add_dir (adata->client, GLOBAL_DIR,
+                              GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
+        adata->client_notify_global_id =
+                gconf_client_notify_add (adata->client,
+                                         GLOBAL_DIR,
+                                         (GConfClientNotifyFunc)client_notify_global_func,
+                                         adata,
+                                         NULL,
+                                         NULL);
+
+        adata->client_notify_lockdown_id =
+                gconf_client_notify_add (adata->client,
+                                         LOCKDOWN_KEY,
+                                         (GConfClientNotifyFunc)client_notify_lockdown_func,
+                                         adata,
+                                         NULL,
+                                         NULL);
+
+        adata->items = g_slist_sort_with_data (adata->items,
+                                               sort_menu_comparedatafunc, adata);
+
+        if (gconf_client_get_bool (adata->client, LOCKDOWN_KEY, NULL)) {
+                gtk_widget_hide (GTK_WIDGET (applet));
+        } else {
+                gtk_widget_show (GTK_WIDGET (applet));
+        }
+
+        return TRUE;
+}
+

Added: trunk/gui/user-switch-applet/gdm-user-menu-item.c
==============================================================================
--- (empty file)
+++ trunk/gui/user-switch-applet/gdm-user-menu-item.c	Tue Feb  5 03:48:04 2008
@@ -0,0 +1,425 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2005 James M. Cape <jcape ignore-your tv>.
+ *
+ * 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 <unistd.h>
+#include <sys/types.h>
+
+#include <string.h>
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#include "gdm-user-menu-item.h"
+
+#define DEFAULT_ICON_SIZE               24
+#define CLOSE_ENOUGH_SIZE               2
+
+enum
+{
+        PROP_0,
+        PROP_USER,
+        PROP_ICON_SIZE
+};
+
+struct _GdmUserMenuItem
+{
+        GtkImageMenuItem parent;
+
+        GdmUser         *user;
+
+        GtkWidget       *image;
+        GtkWidget       *label;
+
+        gulong           user_notify_id;
+        gulong           user_icon_changed_id;
+        gulong           user_sessions_changed_id;
+        gint             icon_size;
+};
+
+struct _GdmUserMenuItemClass
+{
+        GtkImageMenuItemClass parent_class;
+};
+
+G_DEFINE_TYPE (GdmUserMenuItem, gdm_user_menu_item, GTK_TYPE_IMAGE_MENU_ITEM);
+
+
+static void
+user_weak_notify (gpointer  data,
+                  GObject  *user_ptr)
+{
+        GDM_USER_MENU_ITEM (data)->user = NULL;
+
+        gtk_widget_destroy (data);
+}
+
+
+static void
+reset_label (GdmUserMenuItem *item)
+{
+        gtk_label_set_markup (GTK_LABEL (item->label),
+                              gdm_user_get_real_name (item->user));
+}
+
+static void
+reset_icon (GdmUserMenuItem *item)
+{
+        GdkPixbuf *pixbuf;
+
+        if (!item->user || !gtk_widget_has_screen (GTK_WIDGET (item)))
+                return;
+
+        g_assert (item->icon_size != 0);
+
+        pixbuf = gdm_user_render_icon (item->user, item->icon_size);
+        if (pixbuf != NULL) {
+                gtk_image_set_from_pixbuf (GTK_IMAGE (item->image), pixbuf);
+                g_object_unref (pixbuf);
+        }
+}
+
+static void
+user_notify_cb (GObject    *object,
+                GParamSpec *pspec,
+                gpointer    data)
+{
+        if (!pspec || !pspec->name)
+                return;
+
+        if (strcmp (pspec->name, "user-name") == 0 ||
+            strcmp (pspec->name, "display-name") == 0)
+                reset_label (data);
+}
+
+
+static void
+user_icon_changed_cb (GdmUser *user,
+                      gpointer  data)
+{
+        if (gtk_widget_has_screen (data))
+                reset_icon (data);
+}
+
+static void
+user_sessions_changed_cb (GdmUser *user,
+                          gpointer  data)
+{
+        if (gdm_user_get_uid (user) == getuid ())
+                gtk_widget_set_sensitive (data, (gdm_user_get_num_sessions (user) > 1));
+}
+
+static void
+_gdm_user_menu_item_set_user (GdmUserMenuItem *item,
+                              GdmUser         *user)
+{
+        item->user = user;
+        g_object_weak_ref (G_OBJECT (item->user), user_weak_notify, item);
+        item->user_notify_id = g_signal_connect (item->user, "notify",
+                                                 G_CALLBACK (user_notify_cb), item);
+        item->user_icon_changed_id = g_signal_connect (item->user, "icon-changed",
+                                                       G_CALLBACK (user_icon_changed_cb), item);
+        item->user_sessions_changed_id = g_signal_connect (item->user, "sessions-changed",
+                                                           G_CALLBACK (user_sessions_changed_cb), item);
+
+        if (gtk_widget_get_style (GTK_WIDGET (item))) {
+                reset_icon (item);
+                reset_label (item);
+        }
+}
+
+static void
+gdm_user_menu_item_set_property (GObject      *object,
+                                 guint         param_id,
+                                 const GValue *value,
+                                 GParamSpec   *pspec)
+{
+        GdmUserMenuItem *item;
+
+        item = GDM_USER_MENU_ITEM (object);
+
+        switch (param_id) {
+        case PROP_USER:
+                _gdm_user_menu_item_set_user (item, g_value_get_object (value));
+                break;
+        case PROP_ICON_SIZE:
+                gdm_user_menu_item_set_icon_size (item, g_value_get_int (value));
+                break;
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+                break;
+        }
+}
+
+static void
+gdm_user_menu_item_get_property (GObject    *object,
+                                  guint       param_id,
+                                  GValue     *value,
+                                  GParamSpec *pspec)
+{
+        GdmUserMenuItem *item;
+
+        item = GDM_USER_MENU_ITEM (object);
+
+        switch (param_id) {
+        case PROP_USER:
+                g_value_set_object (value, item->user);
+                break;
+        case PROP_ICON_SIZE:
+                g_value_set_int (value, item->icon_size);
+                break;
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+                break;
+        }
+}
+
+
+static void
+gdm_user_menu_item_finalize (GObject *object)
+{
+        GdmUserMenuItem *item;
+
+        item = GDM_USER_MENU_ITEM (object);
+
+        if (item->user) {
+                g_signal_handler_disconnect (item->user, item->user_notify_id);
+                g_signal_handler_disconnect (item->user, item->user_icon_changed_id);
+                g_signal_handler_disconnect (item->user, item->user_sessions_changed_id);
+                g_object_weak_unref (G_OBJECT (item->user), user_weak_notify, object);
+        }
+
+        if (G_OBJECT_CLASS (gdm_user_menu_item_parent_class)->finalize)
+                (*G_OBJECT_CLASS (gdm_user_menu_item_parent_class)->finalize) (object);
+}
+
+
+static gboolean
+gdm_user_menu_item_expose_event (GtkWidget      *widget,
+                                 GdkEventExpose *event)
+{
+        int           horizontal_padding;
+        int           indicator_size;
+        int           indicator_spacing;
+        int           offset;
+        int           x;
+        int           y;
+        GtkShadowType shadow_type;
+        gboolean      retval;
+
+        if (GTK_WIDGET_CLASS (gdm_user_menu_item_parent_class)->expose_event) {
+                retval = (*GTK_WIDGET_CLASS (gdm_user_menu_item_parent_class)->expose_event) (widget,
+                                                                                              event);
+        } else {
+                retval = TRUE;
+        }
+
+        if (! GTK_WIDGET_DRAWABLE (widget)) {
+                return retval;
+        }
+
+        horizontal_padding = 0;
+        indicator_size = 0;
+        indicator_spacing = 0;
+        gtk_widget_style_get (widget,
+                              "horizontal-padding", &horizontal_padding,
+                              "indicator-size", &indicator_size,
+                              "indicator-spacing", &indicator_spacing,
+                              NULL);
+
+        offset = GTK_CONTAINER (widget)->border_width + widget->style->xthickness + 2;
+
+        if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) {
+                x = widget->allocation.x + widget->allocation.width -
+                        offset - horizontal_padding - indicator_size + indicator_spacing +
+                        (indicator_size - indicator_spacing - indicator_size) / 2;
+        } else {
+                x = widget->allocation.x + offset + horizontal_padding +
+                        (indicator_size - indicator_spacing - indicator_size) / 2;
+        }
+
+        y = widget->allocation.y + (widget->allocation.height - indicator_size) / 2;
+
+        if (gdm_user_get_num_sessions (GDM_USER_MENU_ITEM (widget)->user) > 0) {
+                shadow_type = GTK_SHADOW_IN; /* they have displays, so mark it checked */
+        } else {
+                shadow_type = GTK_SHADOW_OUT; /* they haave no displays, so no check */
+        }
+
+        gtk_paint_check (widget->style, widget->window, GTK_WIDGET_STATE (widget),
+                         shadow_type, &(event->area), widget, "check",
+                         x, y, indicator_size, indicator_size);
+
+        return TRUE;
+}
+
+static void
+gdm_user_menu_item_size_request (GtkWidget      *widget,
+                                 GtkRequisition *req)
+{
+        int indicator_size;
+        int indicator_spacing;
+
+        if (GTK_WIDGET_CLASS (gdm_user_menu_item_parent_class)->size_request)
+                (*GTK_WIDGET_CLASS (gdm_user_menu_item_parent_class)->size_request) (widget,
+                                                                                     req);
+
+        indicator_size = 0;
+        indicator_spacing = 0;
+        gtk_widget_style_get (widget,
+                              "indicator-size", &indicator_size,
+                              "indicator-spacing", &indicator_spacing,
+                              NULL);
+        req->width += indicator_size + indicator_spacing;
+}
+
+static void
+gdm_user_menu_item_class_init (GdmUserMenuItemClass *class)
+{
+        GObjectClass   *gobject_class;
+        GtkWidgetClass *widget_class;
+
+        gobject_class = G_OBJECT_CLASS (class);
+        widget_class = GTK_WIDGET_CLASS (class);
+
+        gobject_class->set_property = gdm_user_menu_item_set_property;
+        gobject_class->get_property = gdm_user_menu_item_get_property;
+        gobject_class->finalize = gdm_user_menu_item_finalize;
+
+        widget_class->size_request = gdm_user_menu_item_size_request;
+        widget_class->expose_event = gdm_user_menu_item_expose_event;
+
+        g_object_class_install_property (gobject_class,
+                                         PROP_USER,
+                                         g_param_spec_object ("user",
+                                                              _("User"),
+                                                              _("The user this menu item represents."),
+                                                              GDM_TYPE_USER,
+                                                              (G_PARAM_READWRITE |
+                                                               G_PARAM_CONSTRUCT_ONLY)));
+        g_object_class_install_property (gobject_class,
+                                         PROP_ICON_SIZE,
+                                         g_param_spec_int ("icon-size",
+                                                           _("Icon Size"),
+                                                           _("The size of the icon to use."),
+                                                           12, G_MAXINT, DEFAULT_ICON_SIZE,
+                                                           G_PARAM_READWRITE));
+
+        gtk_widget_class_install_style_property (widget_class,
+                                                 g_param_spec_int ("indicator-size",
+                                                                   _("Indicator Size"),
+                                                                   _("Size of check indicator"),
+                                                                   0, G_MAXINT, 12,
+                                                                   G_PARAM_READABLE));
+        gtk_widget_class_install_style_property (widget_class,
+                                                 g_param_spec_int ("indicator-spacing",
+                                                                   _("Indicator Spacing"),
+                                                                   _("Space between the username and the indicator"),
+                                                                   0, G_MAXINT, 8,
+                                                                   G_PARAM_READABLE));
+}
+
+
+static void
+image_style_set_cb (GtkWidget *widget,
+                    GtkStyle  *old_style,
+                    gpointer   data)
+{
+        reset_icon (data);
+}
+
+static void
+label_style_set_cb (GtkWidget *widget,
+                    GtkStyle  *old_style,
+                    gpointer   data)
+{
+        reset_label (data);
+}
+
+static void
+gdm_user_menu_item_init (GdmUserMenuItem *item)
+{
+        GtkWidget *box;
+
+        item->icon_size = DEFAULT_ICON_SIZE;
+
+        item->image = gtk_image_new ();
+        g_signal_connect (item->image, "style-set",
+                          G_CALLBACK (image_style_set_cb), item);
+        gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item),
+                                       item->image);
+        gtk_widget_show (item->image);
+
+        box = gtk_hbox_new (FALSE, 12);
+        gtk_container_add (GTK_CONTAINER (item), box);
+        gtk_widget_show (box);
+
+        item->label = gtk_label_new (NULL);
+        gtk_label_set_use_markup (GTK_LABEL (item->label), TRUE);
+        gtk_misc_set_alignment (GTK_MISC (item->label), 0.0, 0.5);
+        g_signal_connect (item->label, "style-set",
+                          G_CALLBACK (label_style_set_cb), item);
+        gtk_container_add (GTK_CONTAINER (box), item->label);
+        gtk_widget_show (item->label);
+}
+
+GtkWidget *
+gdm_user_menu_item_new (GdmUser *user)
+{
+        g_return_val_if_fail (GDM_IS_USER (user), NULL);
+
+        return g_object_new (GDM_TYPE_USER_MENU_ITEM, "user", user, NULL);
+}
+
+GdmUser *
+gdm_user_menu_item_get_user (GdmUserMenuItem *item)
+{
+        g_return_val_if_fail (GDM_IS_USER_MENU_ITEM (item), NULL);
+
+        return item->user;
+}
+
+int
+gdm_user_menu_item_get_icon_size (GdmUserMenuItem *item)
+{
+        g_return_val_if_fail (GDM_IS_USER_MENU_ITEM (item), -1);
+
+        return item->icon_size;
+}
+
+void
+gdm_user_menu_item_set_icon_size (GdmUserMenuItem *item,
+                                  int              pixel_size)
+{
+        g_return_if_fail (GDM_IS_USER_MENU_ITEM (item));
+        g_return_if_fail (pixel_size != 0);
+
+        if (pixel_size < 0)
+                item->icon_size = DEFAULT_ICON_SIZE;
+        else
+                item->icon_size = pixel_size;
+
+        if (gtk_widget_get_style (GTK_WIDGET (item))) {
+                reset_icon (item);
+                reset_label (item);
+        }
+
+        g_object_notify (G_OBJECT (item), "icon-size");
+}

Added: trunk/gui/user-switch-applet/gdm-user-menu-item.h
==============================================================================
--- (empty file)
+++ trunk/gui/user-switch-applet/gdm-user-menu-item.h	Tue Feb  5 03:48:04 2008
@@ -0,0 +1,61 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2004-2005 James M. Cape <jcape ignore-your tv>.
+ *
+ * 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
+ */
+
+/*
+ * A menu item bound to a GdmUser.
+ */
+
+#ifndef __GDM_USER_MENU_ITEM__
+#define __GDM_USER_MENU_ITEM__ 1
+
+#include <gtk/gtkimagemenuitem.h>
+
+#include "gdm-user.h"
+
+G_BEGIN_DECLS
+
+#define GDM_TYPE_USER_MENU_ITEM \
+  (gdm_user_menu_item_get_type ())
+#define GDM_USER_MENU_ITEM(object) \
+  (G_TYPE_CHECK_INSTANCE_CAST ((object), GDM_TYPE_USER_MENU_ITEM, GdmUserMenuItem))
+#define GDM_USER_MENU_ITEM_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST ((klass), GDM_TYPE_USER_MENU_ITEM, GdmUserMenuItemClass))
+#define GDM_IS_USER_MENU_ITEM(object) \
+  (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDM_TYPE_USER_MENU_ITEM))
+#define GDM_IS_USER_MENU_ITEM_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE ((klass), GDM_TYPE_USER_MENU_ITEM))
+#define GDM_USER_MENU_ITEM_GET_CLASS(object) \
+  (G_TYPE_INSTANCE_GET_CLASS ((object), GDM_TYPE_USER_MENU_ITEM, GdmUserMenuItemClass))
+
+typedef struct _GdmUserMenuItem GdmUserMenuItem;
+typedef struct _GdmUserMenuItemClass GdmUserMenuItemClass;
+
+GType      gdm_user_menu_item_get_type      (void) G_GNUC_CONST;
+
+GtkWidget *gdm_user_menu_item_new           (GdmUser         *user);
+
+GdmUser   *gdm_user_menu_item_get_user      (GdmUserMenuItem *item);
+
+gint       gdm_user_menu_item_get_icon_size (GdmUserMenuItem *item);
+void       gdm_user_menu_item_set_icon_size (GdmUserMenuItem *item,
+                                             gint             pixel_size);
+
+G_END_DECLS
+
+#endif /* !__GDM_USER_MENU_ITEM__ */

Added: trunk/gui/user-switch-applet/gdm-user-switch-applet.glade
==============================================================================
--- (empty file)
+++ trunk/gui/user-switch-applet/gdm-user-switch-applet.glade	Tue Feb  5 03:48:04 2008
@@ -0,0 +1,832 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd";>
+
+<glade-interface>
+
+<widget class="GtkDialog" id="selector_dialog">
+  <property name="border_width">6</property>
+  <property name="title" translatable="yes">Multiple Logins Found - User Switcher</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">False</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="has_separator">False</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog-vbox2">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">3</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="dialog-action_area2">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="cancelbutton1">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-6</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="okbutton1">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-5</property>
+
+	      <child>
+		<widget class="GtkAlignment" id="alignment3">
+		  <property name="visible">True</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xscale">0</property>
+		  <property name="yscale">0</property>
+		  <property name="top_padding">0</property>
+		  <property name="bottom_padding">0</property>
+		  <property name="left_padding">0</property>
+		  <property name="right_padding">0</property>
+
+		  <child>
+		    <widget class="GtkHBox" id="hbox1">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">2</property>
+
+		      <child>
+			<widget class="GtkImage" id="image3">
+			  <property name="visible">True</property>
+			  <property name="icon_size">4</property>
+			  <property name="icon_name">gtk-go-forward</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="label3">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">Continue</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHBox" id="hbox2">
+	  <property name="border_width">4</property>
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">12</property>
+
+	  <child>
+	    <widget class="GtkImage" id="image4">
+	      <property name="visible">True</property>
+	      <property name="stock">gtk-dialog-question</property>
+	      <property name="icon_size">6</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="vbox4">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label4">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">&lt;span weight=&quot;bold&quot; size=&quot;larger&quot;&gt;Multiple Logins Found&lt;/span&gt;</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">True</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">True</property>
+		  <property name="xalign">0</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="label5">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">The user you want to switch to is logged in multiple times on this computer. Which login do you want to switch to?</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">True</property>
+		  <property name="selectable">True</property>
+		  <property name="xalign">0</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<placeholder/>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkDialog" id="prefs_dialog">
+  <property name="border_width">6</property>
+  <property name="title" translatable="yes">User Switcher Preferences</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">False</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="role">Prefs</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="has_separator">False</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog_box">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">1</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="dialog_action_area">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="close_button">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="has_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-close</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-7</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="main_box">
+	  <property name="border_width">6</property>
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">12</property>
+
+	  <child>
+	    <widget class="GtkVBox" id="appearance_box">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="appearance_label">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">Appearance</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkAlignment" id="appearance_alignment">
+		  <property name="visible">True</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xscale">1</property>
+		  <property name="yscale">1</property>
+		  <property name="top_padding">6</property>
+		  <property name="bottom_padding">0</property>
+		  <property name="left_padding">12</property>
+		  <property name="right_padding">0</property>
+
+		  <child>
+		    <widget class="GtkVBox" id="appearance_box">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">6</property>
+
+		      <child>
+			<widget class="GtkRadioButton" id="username_radio">
+			  <property name="visible">True</property>
+			  <property name="tooltip" translatable="yes">Use the current user's name for the menu title</property>
+			  <property name="can_focus">True</property>
+			  <property name="label"></property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkRadioButton" id="text_radio">
+			  <property name="visible">True</property>
+			  <property name="tooltip" translatable="yes">Use the word `Users' as the menu title</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">Users</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">True</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			  <property name="group">username_radio</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkRadioButton" id="icon_radio">
+			  <property name="visible">True</property>
+			  <property name="tooltip" translatable="yes">Use the `people' icon for the menu title</property>
+			  <property name="can_focus">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			  <property name="group">username_radio</property>
+
+			  <child>
+			    <widget class="GtkImage" id="image1">
+			      <property name="visible">True</property>
+			      <property name="icon_size">1</property>
+			      <property name="icon_name">stock_people</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			    </widget>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="options_box">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="options_label">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">Options</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkAlignment" id="options_alignment">
+		  <property name="visible">True</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xscale">1</property>
+		  <property name="yscale">1</property>
+		  <property name="top_padding">6</property>
+		  <property name="bottom_padding">0</property>
+		  <property name="left_padding">12</property>
+		  <property name="right_padding">0</property>
+
+		  <child>
+		    <widget class="GtkVBox" id="options_box">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">6</property>
+
+		      <child>
+			<widget class="GtkCheckButton" id="lock_check">
+			  <property name="visible">True</property>
+			  <property name="tooltip" translatable="yes">When changing to a different display, activate the screensaver for this display.</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">_Lock the screen after switching users</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">True</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkCheckButton" id="xnest_check">
+			  <property name="visible">True</property>
+			  <property name="tooltip" translatable="yes">When a new login must be created to switch users, create it in a window instead of on a new screen</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">Create new logins in _nested windows</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="warning_box">
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkImage" id="warning_image">
+		  <property name="visible">True</property>
+		  <property name="icon_size">1</property>
+		  <property name="icon_name">gtk-dialog-warning</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="warning_label">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">Some preferences have been locked by the system adminstrator.</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">True</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkDialog" id="error_dialog">
+  <property name="border_width">6</property>
+  <property name="title" translatable="yes">User Switcher Error</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">False</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="has_separator">False</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog_box">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">3</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="dialog_action_area">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="close_button">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-close</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-7</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHBox" id="main_box">
+	  <property name="border_width">4</property>
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">12</property>
+
+	  <child>
+	    <widget class="GtkImage" id="dialog_image">
+	      <property name="visible">True</property>
+	      <property name="stock">gtk-dialog-error</property>
+	      <property name="icon_size">6</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="contents_box">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkLabel" id="primary_label">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label"></property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">True</property>
+		  <property name="xalign">0</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="secondary_label">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label"></property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">True</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">True</property>
+		  <property name="selectable">True</property>
+		  <property name="xalign">0</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkExpander" id="details_expander">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="expanded">True</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkAlignment" id="details_alignment">
+		      <property name="visible">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xscale">1</property>
+		      <property name="yscale">1</property>
+		      <property name="top_padding">6</property>
+		      <property name="bottom_padding">0</property>
+		      <property name="left_padding">12</property>
+		      <property name="right_padding">0</property>
+
+		      <child>
+			<widget class="GtkScrolledWindow" id="details_scrolledwindow">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+			  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+			  <property name="shadow_type">GTK_SHADOW_NONE</property>
+			  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+			  <child>
+			    <widget class="GtkViewport" id="details_viewport">
+			      <property name="visible">True</property>
+			      <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label"></property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">True</property>
+				  <property name="selectable">True</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="details_title">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Details</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="type">label_item</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>

Added: trunk/gui/user-switch-applet/gdm-user-switch-applet.schemas.in
==============================================================================
--- (empty file)
+++ trunk/gui/user-switch-applet/gdm-user-switch-applet.schemas.in	Tue Feb  5 03:48:04 2008
@@ -0,0 +1,78 @@
+<?xml version="1.0"?>
+<gconfschemafile>
+  <schemalist>
+    <schema>
+      <key>/schemas/apps/gdm-user-switch-applet/per-applet/display_style</key>
+      <owner>gdm-user-switch-applet</owner>
+      <type>string</type>
+      <default>text</default>
+      <locale name="C">
+        <short>Display Style</short>
+        <long>Specifies how to display the applet in the panel. Use "username"
+        to display the current user's name, "icon" to show the people icon, or
+        "text" to use the word `Users.'</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/apps/gdm-user-switch-applet/per-applet/lock_screen_after_switch</key>
+      <owner>gdm-user-switch-applet</owner>
+      <type>bool</type>
+      <default>TRUE</default>
+      <locale name="C">
+        <short>Lock Screen After Switch</short>
+        <long>Whether or not to lock the screen after switching to a different
+        console.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/apps/gdm-user-switch-applet/per-applet/use_xnest</key>
+      <owner>gdm-user-switch-applet</owner>
+      <type>bool</type>
+      <default>FALSE</default>
+      <locale name="C">
+        <short>Use Xnest</short>
+        <long>Whether or not to create new Xnest windows instead of spawning
+        new consoles when switching users.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/apps/gdm-user-switch-applet/show_screen_item</key>
+      <applyto>/apps/gdm-user-switch-applet/show_screen_item</applyto>
+      <owner>gdm-user-switch-applet</owner>
+      <type>string</type>
+      <default>always</default>
+      <locale name="C">
+        <short>Show "Other" Menuitem</short>
+        <long>When to show the "Other" item. Possible values include:
+        "always" to always show the item, "never" to never show the item, and
+        "auto" (the default) to show the item when the applet is in console (not
+        Xnest) mode.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/apps/gdm-user-switch-applet/show_window_item</key>
+      <applyto>/apps/gdm-user-switch-applet/show_window_item</applyto>
+      <owner>gdm-user-switch-applet</owner>
+      <type>string</type>
+      <default>auto</default>
+      <locale name="C">
+        <short>Show "Login Window" Menuitem</short>
+        <long>When to show the "Login Window" item. Possible values include:
+        "always" to always show the item, "never" to never show the item, and
+        "auto" (the default) to show the item when the applet is in Xnest mode.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/apps/gdm-user-switch-applet/show_active_users_only</key>
+      <applyto>/apps/gdm-user-switch-applet/show_active_users_only</applyto>
+      <owner>gdm-user-switch-applet</owner>
+      <type>bool</type>
+      <default>FALSE</default>
+      <locale name="C">
+        <short>Show Active Users Only</short>
+        <long>Whether to show only users who are currently logged in, or all
+        users.</long>
+      </locale>
+    </schema>
+  </schemalist>
+</gconfschemafile>

Modified: trunk/po/POTFILES.in
==============================================================================
--- trunk/po/POTFILES.in	(original)
+++ trunk/po/POTFILES.in	Tue Feb  5 03:48:04 2008
@@ -64,4 +64,10 @@
 gui/simple-greeter/gdm-user.c
 gui/simple-greeter/gdm-user-chooser-widget.c
 gui/simple-greeter/greeter-main.c
+gui/user-switch-applet/GNOME_GdmUserSwitchApplet.server.in.in
+gui/user-switch-applet/GNOME_GdmUserSwitchApplet.xml
+gui/user-switch-applet/applet.c
+gui/user-switch-applet/gdm-user-menu-item.c
+gui/user-switch-applet/gdm-user-switch-applet.glade
+gui/user-switch-applet/gdm-user-switch-applet.schemas.in
 utils/gdmflexiserver.c

Modified: trunk/po/POTFILES.skip
==============================================================================
--- trunk/po/POTFILES.skip	(original)
+++ trunk/po/POTFILES.skip	Tue Feb  5 03:48:04 2008
@@ -7,5 +7,6 @@
 # remove these unless you fix "make distcheck" a different way.
 #
 data/gdm.schemas.in
+gui/user-switch-applet/GNOME_GdmUserSwitchApplet.server.in
 
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]