gdm r5692 - in trunk: . daemon gui gui/simple-greeter gui/user-switch-applet po
- From: mccann svn gnome org
- To: svn-commits-list gnome org
- Subject: gdm r5692 - in trunk: . daemon gui gui/simple-greeter gui/user-switch-applet po
- Date: Tue, 5 Feb 2008 03:48:05 +0000 (GMT)
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"><span weight="bold" size="larger">Multiple Logins Found</span></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]