Index: xfce4-session-4.3.99.2/settings/session/session.c =================================================================== --- xfce4-session-4.3.99.2.orig/settings/session/session.c +++ xfce4-session-4.3.99.2/settings/session/session.c @@ -51,6 +51,8 @@ static GtkWidget *dialog = NULL; static GtkWidget *general_chooser; static GtkWidget *general_autosave; static GtkWidget *general_prompt; +static GtkWidget *general_hibernate_button; +static GtkWidget *general_suspend_button; static GtkWidget *advanced_kde; static GtkWidget *advanced_gnome; static GtkWidget *advanced_remote; @@ -88,6 +90,8 @@ config_store (void) { xfce_rc_write_bool_entry (rc, "AutoSave", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (general_autosave))); xfce_rc_write_bool_entry (rc, "PromptOnLogout", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (general_prompt))); + xfce_rc_write_bool_entry (rc, "HibernateButton", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (general_hibernate_button))); + xfce_rc_write_bool_entry (rc, "SuspendButton", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (general_suspend_button))); } if (G_LIKELY (kiosk_can_security)) { @@ -124,10 +128,15 @@ general_create (XfceRc *rc) gboolean autosave; gboolean prompt; gboolean chooser; + gboolean hibernate; + gboolean suspend; xfce_rc_set_group (rc, "General"); autosave = xfce_rc_read_bool_entry (rc, "AutoSave", FALSE); prompt = xfce_rc_read_bool_entry (rc, "PromptOnLogout", TRUE); + hibernate = xfce_rc_read_bool_entry (rc, "HibernateButton", TRUE); + suspend = xfce_rc_read_bool_entry (rc, "SuspendButton", TRUE); + xfce_rc_set_group (rc, "Chooser"); chooser = xfce_rc_read_bool_entry (rc, "AlwaysDisplay", FALSE); @@ -182,6 +191,29 @@ general_create (XfceRc *rc) "saving of sessions on logout or not."), NULL); + general_hibernate_button = gtk_check_button_new_with_label (_("Show hibernate button")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (general_hibernate_button), hibernate); + g_signal_connect (G_OBJECT (general_hibernate_button), "toggled", + G_CALLBACK (config_store), NULL); + gtk_box_pack_start (GTK_BOX (vbox), general_hibernate_button, FALSE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, general_hibernate_button, + _("This option adds a hibernate button to the logout dialog. " + "Only enable if you known your system suspends to" + "disk and resumes correctly."), + NULL); + + general_suspend_button = gtk_check_button_new_with_label (_("Show suspend button")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (general_suspend_button), suspend); + g_signal_connect (G_OBJECT (general_suspend_button), "toggled", + G_CALLBACK (config_store), NULL); + gtk_box_pack_start (GTK_BOX (vbox), general_suspend_button, FALSE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, general_suspend_button, + _("This option adds a suspend button to the logout dialog. " + "Only enable if you known your system suspends to" + "RAM and resumes correctly."), + NULL); + + return page; } Index: xfce4-session-4.3.99.2/xfce4-session/main.c =================================================================== --- xfce4-session-4.3.99.2.orig/xfce4-session/main.c +++ xfce4-session-4.3.99.2/xfce4-session/main.c @@ -61,6 +61,11 @@ #include #include +#include + + +#include +#include void setup_environment (void) @@ -225,8 +230,6 @@ initialize (int argc, char **argv) int main (int argc, char **argv) { - /* imported from xfsm-manager.c */ - extern gint shutdown_type; xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); @@ -248,5 +251,5 @@ main (int argc, char **argv) ice_cleanup (); - return xfsm_shutdown (shutdown_type); + return xfsm_shutdown (); } Index: xfce4-session-4.3.99.2/xfce4-session/shutdown.c =================================================================== --- xfce4-session-4.3.99.2.orig/xfce4-session/shutdown.c +++ xfce4-session-4.3.99.2/xfce4-session/shutdown.c @@ -110,34 +110,36 @@ entry_activate_cb (GtkWidget *entry, Gtk gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); } -static void -logout_button_clicked (GtkWidget *b, gint *shutdownType) -{ - *shutdownType = SHUTDOWN_LOGOUT; - - gtk_dialog_response (GTK_DIALOG (shutdown_dialog), GTK_RESPONSE_OK); -} +static gint shutdownType = XFSM_LOGOUT; static void -reboot_button_clicked (GtkWidget *b, gint *shutdownType) +logout_dialog_button_clicked (GtkWidget *b, gint *cmd) { - *shutdownType = SHUTDOWN_REBOOT; + shutdownType = *cmd; gtk_dialog_response (GTK_DIALOG (shutdown_dialog), GTK_RESPONSE_OK); } -static void -halt_button_clicked (GtkWidget *b, gint *shutdownType) +struct LogoutButton { - *shutdownType = SHUTDOWN_HALT; + gchar * label; + gchar * icon; + gint cmd; + gboolean present; + GtkWidget * button; +}; + +struct LogoutButton logout_buttons [] = { + { N_("Log out"), "xfsm-logout", XFSM_LOGOUT, TRUE }, + { N_("Restart"), "xfsm-reboot", XFSM_REBOOT, TRUE }, + { N_("Shut down"), "xfsm-shutdown", XFSM_SHUTDOWN, TRUE }, + { N_("Suspend"), "xfsm-suspend", XFSM_SUSPEND, FALSE}, + { N_("Hibernate"), "xfsm-hibernate", XFSM_HIBERNATE, FALSE}, +}; - gtk_dialog_response (GTK_DIALOG (shutdown_dialog), GTK_RESPONSE_OK); -} -/* - */ gboolean -shutdownDialog(gint *shutdownType, gboolean *saveSession) +shutdownDialog(gboolean *saveSession) { gboolean accessibility; XfsmFadeout *fadeout = NULL; @@ -154,8 +156,6 @@ shutdownDialog(gint *shutdownType, gbool GtkWidget *entry; GtkWidget *hidden; GtkWidget *logout_button; - GtkWidget *reboot_button; - GtkWidget *halt_button; GtkWidget *cancel_button; GtkWidget *ok_button; GtkWidget *header; @@ -163,6 +163,8 @@ shutdownDialog(gint *shutdownType, gbool gboolean saveonexit; gboolean autosave; gboolean prompt; + gboolean have_suspend; + gboolean have_hibernate; gint monitor; gint result; XfceKiosk *kiosk; @@ -174,9 +176,9 @@ shutdownDialog(gint *shutdownType, gbool GdkPixmap *screenshot_pm = NULL; GdkGC *screenshot_gc; #endif + gint i; g_return_val_if_fail(saveSession != NULL, FALSE); - g_return_val_if_fail(shutdownType != NULL, FALSE); /* destroy any previously running shutdown helper first */ if (shutdown_helper != NULL) @@ -196,13 +198,15 @@ shutdownDialog(gint *shutdownType, gbool saveonexit = xfce_rc_read_bool_entry (rc, "SaveOnExit", TRUE); autosave = xfce_rc_read_bool_entry (rc, "AutoSave", FALSE); prompt = xfce_rc_read_bool_entry (rc, "PromptOnLogout", TRUE); + have_suspend = xfce_rc_read_bool_entry (rc, "SuspendButton", TRUE); + have_hibernate = xfce_rc_read_bool_entry (rc, "HibernateButton", TRUE); /* if PromptOnLogout is off, saving depends on AutoSave */ if (!prompt) { xfce_rc_close (rc); - *shutdownType = SHUTDOWN_LOGOUT; + shutdownType = XFSM_LOGOUT; *saveSession = autosave; return TRUE; @@ -318,76 +322,39 @@ shutdownDialog(gint *shutdownType, gbool hbox = gtk_hbox_new (TRUE, BORDER); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + logout_buttons[3].present = have_suspend; + logout_buttons[4].present = have_hibernate; - /* logout */ - logout_button = gtk_button_new (); - gtk_widget_show (logout_button); - gtk_box_pack_start (GTK_BOX (hbox), logout_button, TRUE, TRUE, 0); - - g_signal_connect (logout_button, "clicked", - G_CALLBACK (logout_button_clicked), shutdownType); - - vbox2 = gtk_vbox_new (FALSE, BORDER); - gtk_container_set_border_width (GTK_CONTAINER (vbox2), BORDER); - gtk_widget_show (vbox2); - gtk_container_add (GTK_CONTAINER (logout_button), vbox2); - - icon = xfce_themed_icon_load ("xfsm-logout", 32); - image = gtk_image_new_from_pixbuf (icon); - gtk_widget_show (image); - gtk_box_pack_start (GTK_BOX (vbox2), image, FALSE, FALSE, 0); - g_object_unref (icon); - - label = gtk_label_new (_("Log Out")); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, FALSE, 0); - - /* reboot */ - reboot_button = gtk_button_new (); - gtk_widget_show (reboot_button); - gtk_box_pack_start (GTK_BOX (hbox), reboot_button, TRUE, TRUE, 0); - - g_signal_connect (reboot_button, "clicked", - G_CALLBACK (reboot_button_clicked), shutdownType); - - vbox2 = gtk_vbox_new (FALSE, BORDER); - gtk_container_set_border_width (GTK_CONTAINER (vbox2), BORDER); - gtk_widget_show (vbox2); - gtk_container_add (GTK_CONTAINER (reboot_button), vbox2); - - icon = xfce_themed_icon_load ("xfsm-reboot", 32); - image = gtk_image_new_from_pixbuf (icon); - gtk_widget_show (image); - gtk_box_pack_start (GTK_BOX (vbox2), image, FALSE, FALSE, 0); - g_object_unref (icon); - - label = gtk_label_new (_("Restart")); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, FALSE, 0); - - /* halt */ - halt_button = gtk_button_new (); - gtk_widget_show (halt_button); - gtk_box_pack_start (GTK_BOX (hbox), halt_button, TRUE, TRUE, 0); - - g_signal_connect (halt_button, "clicked", - G_CALLBACK (halt_button_clicked), shutdownType); - - vbox2 = gtk_vbox_new (FALSE, BORDER); - gtk_container_set_border_width (GTK_CONTAINER (vbox2), BORDER); - gtk_widget_show (vbox2); - gtk_container_add (GTK_CONTAINER (halt_button), vbox2); - - icon = xfce_themed_icon_load ("xfsm-shutdown", 32); - image = gtk_image_new_from_pixbuf (icon); - gtk_widget_show (image); - gtk_box_pack_start (GTK_BOX (vbox2), image, FALSE, FALSE, 0); - g_object_unref (icon); - - label = gtk_label_new (_("Shut Down")); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, FALSE, 0); - + for (i = 0; i < G_N_ELEMENTS (logout_buttons); i++) { + + if (logout_buttons[i].present == FALSE) + continue; + + logout_button = gtk_button_new (); + gtk_widget_show (logout_button); + gtk_box_pack_start (GTK_BOX (hbox), logout_button, TRUE, TRUE, 0); + + g_signal_connect (logout_button, "clicked", + G_CALLBACK (logout_dialog_button_clicked), &logout_buttons[i].cmd); + + vbox2 = gtk_vbox_new (FALSE, BORDER); + gtk_container_set_border_width (GTK_CONTAINER (vbox2), BORDER); + gtk_widget_show (vbox2); + gtk_container_add (GTK_CONTAINER (logout_button), vbox2); + + icon = xfce_themed_icon_load (logout_buttons[i].icon, 32); + image = gtk_image_new_from_pixbuf (icon); + gtk_widget_show (image); + gtk_box_pack_start (GTK_BOX (vbox2), image, FALSE, FALSE, 0); + g_object_unref (icon); + + label = gtk_label_new (logout_buttons[i].label); + gtk_widget_show (label); + gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, FALSE, 0); + + logout_buttons[i].button = logout_button; + } + /* save session */ if (!autosave) { @@ -413,8 +380,9 @@ shutdownDialog(gint *shutdownType, gbool if (!kiosk_can_shutdown || (shutdown_helper = xfsm_shutdown_helper_spawn ()) == NULL) { - gtk_widget_set_sensitive (reboot_button, FALSE); - gtk_widget_set_sensitive (halt_button, FALSE); + for (i = 1; i < G_N_ELEMENTS (logout_buttons); i++) { + gtk_widget_set_sensitive (logout_buttons[i].button, FALSE); + } } /* save portion of the root window covered by the dialog */ @@ -444,7 +412,7 @@ shutdownDialog(gint *shutdownType, gbool gtk_widget_hide (dialog); /* ask password */ - if (result == GTK_RESPONSE_OK && *shutdownType != SHUTDOWN_LOGOUT + if (result == GTK_RESPONSE_OK && shutdownType != XFSM_LOGOUT && xfsm_shutdown_helper_need_password (shutdown_helper)) { gtk_widget_show (ok_button); @@ -540,6 +508,16 @@ shutdownDialog(gint *shutdownType, gbool gdk_flush (); } + /* + * For suspend/hibernate perform the action but do not + * close the session so it is still there on resume + */ + if (result == GTK_RESPONSE_OK + && (shutdownType == XFSM_SUSPEND || shutdownType == XFSM_HIBERNATE)) { + xfsm_shutdown_helper_send_command (shutdown_helper, shutdownType); + return FALSE; + } + /* process all pending events first */ while (gtk_events_pending ()) g_main_context_iteration (NULL, FALSE); @@ -578,7 +556,7 @@ shutdownDialog(gint *shutdownType, gbool /* */ gint -xfsm_shutdown(gint type) +xfsm_shutdown(void) { gboolean result; @@ -596,7 +574,7 @@ xfsm_shutdown(gint type) sync (); #endif - if (type == SHUTDOWN_LOGOUT) + if (shutdownType == XFSM_LOGOUT) return EXIT_SUCCESS; if (shutdown_helper == NULL) @@ -605,16 +583,7 @@ xfsm_shutdown(gint type) return EXIT_FAILURE; } - if (type == SHUTDOWN_HALT) - { - result = xfsm_shutdown_helper_send_command (shutdown_helper, - XFSM_SHUTDOWN_POWEROFF); - } - else - { - result = xfsm_shutdown_helper_send_command (shutdown_helper, - XFSM_SHUTDOWN_REBOOT); - } + result = xfsm_shutdown_helper_send_command (shutdown_helper, shutdownType); xfsm_shutdown_helper_destroy (shutdown_helper); shutdown_helper = NULL; Index: xfce4-session-4.3.99.2/xfce4-session/shutdown.h =================================================================== --- xfce4-session-4.3.99.2.orig/xfce4-session/shutdown.h +++ xfce4-session-4.3.99.2/xfce4-session/shutdown.h @@ -24,13 +24,8 @@ #include -/* */ -#define SHUTDOWN_LOGOUT 0 -#define SHUTDOWN_REBOOT 1 -#define SHUTDOWN_HALT 2 - /* prototypes */ -extern gboolean shutdownDialog(gint *, gboolean *); -extern gint xfsm_shutdown(gint); +extern gboolean shutdownDialog(gboolean *); +extern gint xfsm_shutdown(void); #endif /* !__XFSM_SHUTDOWN_H__ */ Index: xfce4-session-4.3.99.2/xfce4-session/xfsm-global.c =================================================================== --- xfce4-session-4.3.99.2.orig/xfce4-session/xfsm-global.c +++ xfce4-session-4.3.99.2/xfce4-session/xfsm-global.c @@ -46,7 +46,6 @@ gchar *session_name = NULL; gchar *session_file = NULL; GList *failsafe_clients = NULL; gboolean failsafe_mode = TRUE; -gint shutdown_type = SHUTDOWN_LOGOUT; XfsmSplashScreen *splash_screen = NULL; void Index: xfce4-session-4.3.99.2/xfce4-session/xfsm-global.h =================================================================== --- xfce4-session-4.3.99.2.orig/xfce4-session/xfsm-global.h +++ xfce4-session-4.3.99.2/xfce4-session/xfsm-global.h @@ -47,7 +47,6 @@ extern gchar *session_name; extern gchar *session_file; extern GList *failsafe_clients; extern gboolean failsafe_mode; -extern gint shutdown_type; extern XfsmSplashScreen *splash_screen; Index: xfce4-session-4.3.99.2/xfce4-session/xfsm-manager.c =================================================================== --- xfce4-session-4.3.99.2.orig/xfce4-session/xfsm-manager.c +++ xfce4-session-4.3.99.2/xfce4-session/xfsm-manager.c @@ -799,7 +799,7 @@ xfsm_manager_save_yourself (XfsmClient * } else { - if (!fast && shutdown && !shutdownDialog (&shutdown_type, &shutdown_save)) + if (!fast && shutdown && !shutdownDialog (&shutdown_save)) return; if (!shutdown || shutdown_save) Index: xfce4-session-4.3.99.2/xfce4-session/xfsm-shutdown-helper.c =================================================================== --- xfce4-session-4.3.99.2.orig/xfce4-session/xfsm-shutdown-helper.c +++ xfce4-session-4.3.99.2/xfce4-session/xfsm-shutdown-helper.c @@ -138,7 +138,17 @@ xfsm_shutdown_helper_hal_check (XfsmShut return FALSE; } - +static struct +{ + XfsmShutdownCommand command; + gchar * name; +} xfsm2hal[] = +{ + { XFSM_REBOOT, "Reboot"}, + { XFSM_SHUTDOWN, "Shutdown"}, + { XFSM_SUSPEND, "Suspend"}, + { XFSM_HIBERNATE, "Hibernate"} +}; static gboolean xfsm_shutdown_helper_hal_send (XfsmShutdownHelper *helper, @@ -149,6 +159,8 @@ xfsm_shutdown_helper_hal_send (XfsmShutd DBusMessage *message; DBusMessage *result; DBusError error; + gchar *methodname; + int i; /* initialize the error */ dbus_error_init (&error); @@ -163,10 +175,41 @@ xfsm_shutdown_helper_hal_send (XfsmShutd } /* send the appropriate message to HAL, telling it to shutdown or reboot the system */ - message = dbus_message_new_method_call ("org.freedesktop.Hal", - "/org/freedesktop/Hal/devices/computer", - "org.freedesktop.Hal.Device.SystemPowerManagement", - (command == XFSM_SHUTDOWN_REBOOT) ? "Reboot" : "Shutdown"); + switch (command) + { + case XFSM_REBOOT: + message = dbus_message_new_method_call ("org.freedesktop.Hal", + "/org/freedesktop/Hal/devices/computer", + "org.freedesktop.Hal.Device.SystemPowerManagement", + "Reboot"); + break; + + case XFSM_SHUTDOWN: + message = dbus_message_new_method_call ("org.freedesktop.Hal", + "/org/freedesktop/Hal/devices/computer", + "org.freedesktop.Hal.Device.SystemPowerManagement", + "Shutdown"); + break; + + case XFSM_SUSPEND: + { + dbus_int32_t wakeup = 0; + message = dbus_message_new_method_call ("org.freedesktop.Hal", + "/org/freedesktop/Hal/devices/computer", + "org.freedesktop.Hal.Device.SystemPowerManagement", + "Suspend"); + dbus_message_append_args (message, DBUS_TYPE_INT32, &wakeup, DBUS_TYPE_INVALID); + break; + } + + case XFSM_HIBERNATE: + message = dbus_message_new_method_call ("org.freedesktop.Hal", + "/org/freedesktop/Hal/devices/computer", + "org.freedesktop.Hal.Device.SystemPowerManagement", + "Hibernate"); + break; + } + result = dbus_connection_send_with_reply_and_block (connection, message, 2000, &error); dbus_message_unref (message); Index: xfce4-session-4.3.99.2/xfce4-session/xfsm-shutdown-helper.h =================================================================== --- xfce4-session-4.3.99.2.orig/xfce4-session/xfsm-shutdown-helper.h +++ xfce4-session-4.3.99.2/xfce4-session/xfsm-shutdown-helper.h @@ -27,8 +27,11 @@ typedef enum { - XFSM_SHUTDOWN_POWEROFF = 0, - XFSM_SHUTDOWN_REBOOT = 1, + XFSM_LOGOUT =-1, + XFSM_SHUTDOWN = 0, + XFSM_REBOOT = 1, + XFSM_SUSPEND = 2, + XFSM_HIBERNATE = 3, } XfsmShutdownCommand;