From 86a394ae84f4c09c0bfc7b7136bcc7e88ca04bc5 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 11:33:51 -0600 Subject: Check the UID to see if it's me --- src/session-service.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 289bff8..a2760d1 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -496,6 +496,11 @@ rebuild_items (DbusmenuMenuitem *root, user->service = service; + if (user->uid == getuid()) { + /* Hide me from the list */ + continue; + } + mi = dbusmenu_menuitem_new (); dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, user->real_name); -- cgit v1.2.3 From 206f1003cad828ca2465088ea3fbf73b1a6a4c97 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 11:46:27 -0600 Subject: Making it so that users is not a global and just grabbed everytime and used. --- src/session-service.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index a2760d1..eeb88a9 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -69,7 +69,6 @@ static DbusmenuMenuitem *lock_menuitem = NULL; static DbusmenuMenuitem *switch_menuitem = NULL; static gint count; -static GList *users; static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; @@ -472,22 +471,11 @@ rebuild_items (DbusmenuMenuitem *root, } } + GList * users = NULL; + users = users_service_dbus_get_user_list (service); + if (count > MINIMUM_USERS && count < MAXIMUM_USERS) { - if (users != NULL) - { - GList *l = NULL; - - for (l = users; l != NULL; l = l->next) - { - users = g_list_delete_link (users, l); - } - - users = NULL; - } - - users = users_service_dbus_get_user_list (service); - users = g_list_sort (users, (GCompareFunc)compare_users_by_username); for (u = users; u != NULL; u = g_list_next (u)) @@ -509,6 +497,8 @@ rebuild_items (DbusmenuMenuitem *root, g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_user_session), user); } } + + g_list_free(users); } DbusmenuMenuitem * separator = dbusmenu_menuitem_new(); -- cgit v1.2.3 From 40ef68c195d63a7d19e1ad237fc7ebed00c9c0c2 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 11:48:18 -0600 Subject: Making it so that count is not a global and just calculated from the list. --- src/session-service.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index eeb88a9..30c14cf 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -68,8 +68,6 @@ static UsersServiceDbus *dbus_interface = NULL; static DbusmenuMenuitem *lock_menuitem = NULL; static DbusmenuMenuitem *switch_menuitem = NULL; -static gint count; - static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; static DBusGProxy * up_main_proxy = NULL; @@ -473,8 +471,9 @@ rebuild_items (DbusmenuMenuitem *root, GList * users = NULL; users = users_service_dbus_get_user_list (service); + guint user_count = g_list_length(users); - if (count > MINIMUM_USERS && count < MAXIMUM_USERS) + if (user_count > MINIMUM_USERS && user_count < MAXIMUM_USERS) { users = g_list_sort (users, (GCompareFunc)compare_users_by_username); @@ -563,8 +562,6 @@ user_added (UsersServiceDbus *service, { DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; - count++; - rebuild_items (root, service); } @@ -577,8 +574,6 @@ user_removed (UsersServiceDbus *service, { DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; - count--; - rebuild_items (root, service); } @@ -590,8 +585,6 @@ create_items (DbusmenuMenuitem *root, { g_return_if_fail (IS_USERS_SERVICE_DBUS (service)); - count = users_service_dbus_get_user_count (service); - rebuild_items (root, service); } -- cgit v1.2.3 From e5dd34b95bb29d4d1dc294c84bdbfe4c90f57b02 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 11:51:27 -0600 Subject: Restructuring callbacks to not need the count variable. --- src/session-service.c | 41 +++++++++-------------------------------- 1 file changed, 9 insertions(+), 32 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 30c14cf..42901a1 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -556,36 +556,13 @@ rebuild_items (DbusmenuMenuitem *root, /* Signal called when a user is added. It updates the count and rebuilds the menu */ static void -user_added (UsersServiceDbus *service, - UserData *user, - gpointer user_data) +user_change (UsersServiceDbus *service, + UserData *user, + gpointer user_data) { - DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; - - rebuild_items (root, service); -} - -/* Signal called when a user is deleted. It updates the count and - rebuilds the menu */ -static void -user_removed (UsersServiceDbus *service, - UserData *user, - gpointer user_data) -{ - DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; - - rebuild_items (root, service); -} - -/* Wrapper around rebuild_items that is used on the first call - so that we can initialize the count variable. */ -static void -create_items (DbusmenuMenuitem *root, - UsersServiceDbus *service) -{ - g_return_if_fail (IS_USERS_SERVICE_DBUS (service)); - - rebuild_items (root, service); + DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; + rebuild_items (root, service); + return; } /* When the service interface starts to shutdown, we @@ -626,15 +603,15 @@ main (int argc, char ** argv) dbus_interface = g_object_new (USERS_SERVICE_DBUS_TYPE, NULL); - create_items (root_menuitem, dbus_interface); + rebuild_items (root_menuitem, dbus_interface); g_signal_connect (G_OBJECT (dbus_interface), "user-added", - G_CALLBACK (user_added), + G_CALLBACK (user_change), root_menuitem); g_signal_connect (G_OBJECT (dbus_interface), "user-removed", - G_CALLBACK (user_removed), + G_CALLBACK (user_change), root_menuitem); setup_up(); -- cgit v1.2.3 From e9d4b412bce99aee1cc4b3188c04635f95f60559 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 12:05:06 -0600 Subject: Switching things around a little bit. Making sure we always go through the list to search for the guest account to see if it's logged in. But, still not making menu entries. --- src/session-service.c | 74 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 30 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 42901a1..9e06bb0 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -412,6 +412,7 @@ rebuild_items (DbusmenuMenuitem *root, UsersServiceDbus *service) { DbusmenuMenuitem *mi = NULL; + DbusmenuMenuitem * guest_mi = NULL; GList *u; UserData *user; gboolean can_activate; @@ -441,12 +442,12 @@ rebuild_items (DbusmenuMenuitem *root, if (check_guest_session ()) { - mi = dbusmenu_menuitem_new (); - dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); - dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, _("Guest Session")); - dbusmenu_menuitem_property_set_bool (mi, USER_ITEM_PROP_LOGGED_IN, FALSE); - dbusmenu_menuitem_child_append (root, mi); - g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_guest_session), NULL); + guest_mi = dbusmenu_menuitem_new (); + dbusmenu_menuitem_property_set (guest_mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); + dbusmenu_menuitem_property_set (guest_mi, USER_ITEM_PROP_NAME, _("Guest Session")); + dbusmenu_menuitem_property_set_bool (guest_mi, USER_ITEM_PROP_LOGGED_IN, FALSE); + dbusmenu_menuitem_child_append (root, guest_mi); + g_signal_connect (G_OBJECT (guest_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_guest_session), NULL); } if (check_new_session ()) @@ -473,32 +474,45 @@ rebuild_items (DbusmenuMenuitem *root, users = users_service_dbus_get_user_list (service); guint user_count = g_list_length(users); - if (user_count > MINIMUM_USERS && user_count < MAXIMUM_USERS) - { - users = g_list_sort (users, (GCompareFunc)compare_users_by_username); - - for (u = users; u != NULL; u = g_list_next (u)) - { - user = u->data; - - user->service = service; - - if (user->uid == getuid()) { - /* Hide me from the list */ - continue; - } - - mi = dbusmenu_menuitem_new (); - dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); - dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, user->real_name); - dbusmenu_menuitem_property_set_bool (mi, USER_ITEM_PROP_LOGGED_IN, user->sessions != NULL); - dbusmenu_menuitem_child_append (root, mi); - g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_user_session), user); - } - } + if (user_count > MINIMUM_USERS && user_count < MAXIMUM_USERS) { + users = g_list_sort (users, (GCompareFunc)compare_users_by_username); + } + + for (u = users; u != NULL; u = g_list_next (u)) { + user = u->data; + user->service = service; + + if (user->uid == getuid()) { + /* Hide me from the list */ + continue; + } + + if (g_strcmp0(user->user_name, "guest") == 0) { + /* Check to see if the guest has sessions and so therefore should + get a check mark. */ + if (user->sessions != NULL) { + dbusmenu_menuitem_property_set_bool (guest_mi, USER_ITEM_PROP_LOGGED_IN, TRUE); + } + /* If we're showing user accounts, keep going through the list */ + if (user_count > MINIMUM_USERS && user_count < MAXIMUM_USERS) { + continue; + } + /* If not, we can stop here */ + break; + } + + if (user_count > MINIMUM_USERS && user_count < MAXIMUM_USERS) { + mi = dbusmenu_menuitem_new (); + dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); + dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, user->real_name); + dbusmenu_menuitem_property_set_bool (mi, USER_ITEM_PROP_LOGGED_IN, user->sessions != NULL); + dbusmenu_menuitem_child_append (root, mi); + g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_user_session), user); + } + } g_list_free(users); - } + } DbusmenuMenuitem * separator = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR); -- cgit v1.2.3 From ad9dd9ec9a32d9380c12bce08d939d0f58d56555 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 16:08:23 -0600 Subject: Sort by real name --- src/session-service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 289bff8..5746f7d 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -406,7 +406,7 @@ compare_users_by_username (const gchar *a, UserData *user1 = (UserData *)a; UserData *user2 = (UserData *)b; - return g_strcmp0 (user1->user_name, user2->user_name); + return g_strcmp0 (user1->real_name, user2->real_name); } /* Builds up the menu for us */ -- cgit v1.2.3 From d723e8d4ed1e96c889d139a0f8c4cca117137c4a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 16:13:22 -0600 Subject: Creating a field for the user that has the real name in it, and a place for that to conflict. --- src/session-service.c | 10 +++++++++- src/users-service-dbus.c | 1 + src/users-service-dbus.h | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 5746f7d..21c5b8b 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -406,7 +406,15 @@ compare_users_by_username (const gchar *a, UserData *user1 = (UserData *)a; UserData *user2 = (UserData *)b; - return g_strcmp0 (user1->real_name, user2->real_name); + gint retval = g_strcmp0 (user1->real_name, user2->real_name); + + /* If they're the same, they're both in conflict. */ + if (retval == 0) { + user1->real_name_conflict = TRUE; + user2->real_name_conflict = TRUE; + } + + return retval; } /* Builds up the menu for us */ diff --git a/src/users-service-dbus.c b/src/users-service-dbus.c index 0e5c922..7d2112a 100644 --- a/src/users-service-dbus.c +++ b/src/users-service-dbus.c @@ -662,6 +662,7 @@ sync_users (UsersServiceDbus *self) user->shell = g_strdup (g_value_get_string (g_value_array_get_nth (values, 3))); user->login_count = g_value_get_int (g_value_array_get_nth (values, 4)); user->icon_url = g_strdup (g_value_get_string (g_value_array_get_nth (values, 5))); + user->real_name_conflict = FALSE; g_hash_table_insert (priv->users, g_strdup (user->user_name), diff --git a/src/users-service-dbus.h b/src/users-service-dbus.h index 41052f8..bba88a7 100644 --- a/src/users-service-dbus.h +++ b/src/users-service-dbus.h @@ -47,6 +47,8 @@ struct _UserData GList *sessions; + gboolean real_name_conflict; + UsersServiceDbus *service; }; -- cgit v1.2.3 From 03c045f5890162a53ed613fcf8f627f0dc3badc8 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 16:17:12 -0600 Subject: If we ARE a conflicted name then we need to fallback into displaying the user name. --- src/session-service.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 21c5b8b..85874b6 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -506,7 +506,13 @@ rebuild_items (DbusmenuMenuitem *root, mi = dbusmenu_menuitem_new (); dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); + if (user->real_name_conflict) { + gchar * conflictedname = g_strdup_printf("%s (%s)", user->real_name, user->user_name); + dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, conflictedname); + g_free(conflictedname); + } else { dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, user->real_name); + } dbusmenu_menuitem_property_set_bool (mi, USER_ITEM_PROP_LOGGED_IN, user->sessions != NULL); dbusmenu_menuitem_child_append (root, mi); g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_user_session), user); -- cgit v1.2.3 From fe25b2a8139d0c92a30440ba20862199a04f0f9c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 12:05:28 -0600 Subject: Changing shutdowns to switch offs --- src/gtk-dialog/gconf-helper.c | 4 ++-- src/gtk-dialog/gtk-logout-helper.c | 2 +- src/gtk-dialog/logout-dialog.c | 8 ++++---- src/session-service.c | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) (limited to 'src/session-service.c') diff --git a/src/gtk-dialog/gconf-helper.c b/src/gtk-dialog/gconf-helper.c index 213592e..9262b19 100644 --- a/src/gtk-dialog/gconf-helper.c +++ b/src/gtk-dialog/gconf-helper.c @@ -51,11 +51,11 @@ static void update_menu_entries_callback (GConfClient *client, guint cnxn_id, GC if (gconf_value_get_bool (value)) { dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out")); dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch Off")); } else { dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out...")); dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart...")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown...")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch Off...")); } } } diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c index d8aea6b..8a64c35 100644 --- a/src/gtk-dialog/gtk-logout-helper.c +++ b/src/gtk-dialog/gtk-logout-helper.c @@ -110,7 +110,7 @@ option_restart (const gchar * arg, const gchar * value, gpointer data, GError * static GOptionEntry options[] = { {"logout", 'l', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_logout, "Log out of the current session", NULL}, - {"shutdown", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_shutdown, "Shutdown the entire system", NULL}, + {"shutdown", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_shutdown, "Switch off the entire system", NULL}, {"restart", 'r', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_restart, "Restart the system", NULL}, {NULL} diff --git a/src/gtk-dialog/logout-dialog.c b/src/gtk-dialog/logout-dialog.c index 65df9fe..dc1b3fe 100644 --- a/src/gtk-dialog/logout-dialog.c +++ b/src/gtk-dialog/logout-dialog.c @@ -62,13 +62,13 @@ get_plural_string (LogoutDialog * dialog); static const gchar * title_strings[LOGOUT_DIALOG_ACTION_CNT] = { /* LOGOUT_DIALOG_LOGOUT, */ NC_("title", "Log Out"), /* LOGOUT_DIALOG_RESTART, */ NC_("title", "Restart"), - /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("title", "Shut Down") + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("title", "Switch Off") }; static const gchar * button_strings[LOGOUT_DIALOG_ACTION_CNT] = { /* LOGOUT_DIALOG_LOGOUT, */ NC_("button", "Log Out"), /* LOGOUT_DIALOG_RESTART, */ NC_("button", "Restart"), - /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button", "Shut Down") + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button", "Switch Off") }; static const gchar * restart_auth = N_("Restart..."); @@ -126,8 +126,8 @@ get_plural_string (LogoutDialog * dialog) dialog->timeout); break; case LOGOUT_DIALOG_SHUTDOWN: - plural_string = ngettext("The computer will be shut down in %d second.", - "The computer will be shut down in %d seconds.", + plural_string = ngettext("The computer will switch off in %d second.", + "The computer will switch off in %d seconds.", dialog->timeout); break; default: diff --git a/src/session-service.c b/src/session-service.c index 9fb9ee7..a2b1234 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -542,9 +542,9 @@ rebuild_items (DbusmenuMenuitem *root, shutdown_mi = dbusmenu_menuitem_new(); if (supress_confirmations()) { - dbusmenu_menuitem_property_set(shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shut Down")); + dbusmenu_menuitem_property_set(shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch Off")); } else { - dbusmenu_menuitem_property_set(shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shut Down...")); + dbusmenu_menuitem_property_set(shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch Off...")); } dbusmenu_menuitem_child_append(root, shutdown_mi); g_signal_connect(G_OBJECT(shutdown_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "shutdown"); -- cgit v1.2.3 From 41b935109421b4087536d88fef2da54d4dece306 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 12:07:30 -0600 Subject: Suspends to sleep --- src/session-service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index a2b1234..b7aa2b6 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -521,7 +521,7 @@ rebuild_items (DbusmenuMenuitem *root, suspend_mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set_bool(suspend_mi, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); - dbusmenu_menuitem_property_set(suspend_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Suspend")); + dbusmenu_menuitem_property_set(suspend_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Sleep")); dbusmenu_menuitem_child_append(root, suspend_mi); g_signal_connect(G_OBJECT(suspend_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(machine_sleep), "Suspend"); -- cgit v1.2.3