diff --git a/xfce4-session-handle-multiple-interactive-session-save.patch b/xfce4-session-handle-multiple-interactive-session-save.patch new file mode 100644 index 0000000..7d767e3 --- /dev/null +++ b/xfce4-session-handle-multiple-interactive-session-save.patch @@ -0,0 +1,147 @@ +From 9f3077be682355e1cd07e9a9463e76307292208c Mon Sep 17 00:00:00 2001 +From: Dimitar Zhekov +Date: Thu, 30 Aug 2012 20:52:14 +0000 +Subject: Handle multiple interactive session save (bug #5379). + +Additionnaly, we now use SmSaveGlobal on log out / shutdown without +session save which avoids data loss. Previously clients would not save +anything on log out without session save. + +Based on original work by Chris Bainbridge (chris.bainbridge@gmail.com). +--- +diff --git a/xfce4-session/xfsm-manager.c b/xfce4-session/xfsm-manager.c +index bf6a446..35811c5 100644 +--- a/xfce4-session/xfsm-manager.c ++++ b/xfce4-session/xfsm-manager.c +@@ -98,6 +98,7 @@ struct _XfsmManager + + XfsmShutdownType shutdown_type; + XfsmShutdown *shutdown_helper; ++ gboolean save_session; + + gboolean session_chooser; + gchar *session_name; +@@ -230,6 +231,7 @@ xfsm_manager_init (XfsmManager *manager) + manager->failsafe_mode = TRUE; + manager->shutdown_type = XFSM_SHUTDOWN_LOGOUT; + manager->shutdown_helper = xfsm_shutdown_get (); ++ manager->save_session = TRUE; + + manager->pending_properties = g_queue_new (); + manager->starting_properties = g_queue_new (); +@@ -989,7 +991,9 @@ xfsm_manager_interact (XfsmManager *manager, + XfsmClient *cl = lp->data; + if (xfsm_client_get_state (cl) == XFSM_CLIENT_INTERACTING) + { +- xfsm_client_set_state (cl, XFSM_CLIENT_WAITFORINTERACT); ++ /* a client is already interacting, so new client has to wait */ ++ xfsm_client_set_state (client, XFSM_CLIENT_WAITFORINTERACT); ++ xfsm_manager_cancel_client_save_timeout(manager, client); + return; + } + } +@@ -1138,44 +1142,47 @@ xfsm_manager_save_yourself_global (XfsmManager *manager, + } + } + +- if (!shutdown || shutdown_save) ++ /* don't save the session if shutting down without save */ ++ manager->save_session = !shutdown || shutdown_save; ++ ++ if (save_type == SmSaveBoth && !manager->save_session) + { +- xfsm_manager_set_state (manager, +- shutdown +- ? XFSM_MANAGER_SHUTDOWN +- : XFSM_MANAGER_CHECKPOINT); ++ /* saving the session, so clients should ++ * (prompt to) save the user data only */ ++ save_type = SmSaveGlobal; ++ } + +- /* handle legacy applications first! */ +- xfsm_legacy_perform_session_save (); ++ xfsm_manager_set_state (manager, ++ shutdown ++ ? XFSM_MANAGER_SHUTDOWN ++ : XFSM_MANAGER_CHECKPOINT); + +- for (lp = g_queue_peek_nth_link (manager->running_clients, 0); +- lp; +- lp = lp->next) +- { +- XfsmClient *client = lp->data; +- XfsmProperties *properties = xfsm_client_get_properties (client); +- const gchar *program; ++ /* handle legacy applications first! */ ++ if (manager->save_session) ++ xfsm_legacy_perform_session_save (); + +- /* xterm's session management is broken, so we won't +- * send a SAVE YOURSELF to xterms */ +- program = xfsm_properties_get_string (properties, SmProgram); +- if (program != NULL && strcasecmp (program, "xterm") == 0) +- continue; ++ for (lp = g_queue_peek_nth_link (manager->running_clients, 0); ++ lp; ++ lp = lp->next) ++ { ++ XfsmClient *client = lp->data; ++ XfsmProperties *properties = xfsm_client_get_properties (client); ++ const gchar *program; + +- if (xfsm_client_get_state (client) != XFSM_CLIENT_SAVINGLOCAL) +- { +- SmsSaveYourself (xfsm_client_get_sms_connection (client), save_type, shutdown, +- interact_style, fast); +- } ++ /* xterm's session management is broken, so we won't ++ * send a SAVE YOURSELF to xterms */ ++ program = xfsm_properties_get_string (properties, SmProgram); ++ if (program != NULL && strcasecmp (program, "xterm") == 0) ++ continue; + +- xfsm_client_set_state (client, XFSM_CLIENT_SAVING); +- xfsm_manager_start_client_save_timeout (manager, client); ++ if (xfsm_client_get_state (client) != XFSM_CLIENT_SAVINGLOCAL) ++ { ++ SmsSaveYourself (xfsm_client_get_sms_connection (client), save_type, shutdown, ++ interact_style, fast); + } +- } +- else +- { +- /* shutdown session without saving */ +- xfsm_manager_perform_shutdown (manager); ++ ++ xfsm_client_set_state (client, XFSM_CLIENT_SAVING); ++ xfsm_manager_start_client_save_timeout (manager, client); + } + } + +@@ -1249,7 +1256,12 @@ xfsm_manager_save_yourself_done (XfsmManager *manager, + XfsmClient *client, + gboolean success) + { +- if (xfsm_client_get_state (client) != XFSM_CLIENT_SAVING && xfsm_client_get_state (client) != XFSM_CLIENT_SAVINGLOCAL) ++ /* In xfsm_manager_interact_done we send SmsShutdownCancelled to clients in ++ XFSM_CLIENT_WAITFORINTERACT state. They respond with SmcSaveYourselfDone ++ (xsmp_shutdown_cancelled in libxfce4ui library) so we allow it here. */ ++ if (xfsm_client_get_state (client) != XFSM_CLIENT_SAVING && ++ xfsm_client_get_state (client) != XFSM_CLIENT_SAVINGLOCAL && ++ xfsm_client_get_state (client) != XFSM_CLIENT_WAITFORINTERACT) + { + xfsm_verbose ("Client Id = %s send SAVE YOURSELF DONE, while not being " + "in save mode. Prepare to be nuked!\n", +@@ -1521,7 +1533,8 @@ xfsm_manager_complete_saveyourself (XfsmManager *manager) + xfsm_verbose ("Manager finished SAVE YOURSELF, session data will be stored now.\n\n"); + + /* all clients done, store session data */ +- xfsm_manager_store_session (manager); ++ if (manager->save_session) ++ xfsm_manager_store_session (manager); + + if (manager->state == XFSM_MANAGER_CHECKPOINT) + { +-- +cgit v0.9.0.3 diff --git a/xfce4-session.changes b/xfce4-session.changes index 11e6e8d..b44f156 100644 --- a/xfce4-session.changes +++ b/xfce4-session.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Fri Aug 31 22:44:55 UTC 2012 - gber@opensuse.org + +- add xfce4-session-handle-multiple-interactive-session-save.patch + in order to handle multiple interactive session save correctly, + this should fix a lot of cases where xfwm4 was not saved and + thus missing in the next session (bxo#5379) + ------------------------------------------------------------------- Fri Aug 31 22:34:50 UTC 2012 - gber@opensuse.org diff --git a/xfce4-session.spec b/xfce4-session.spec index 360ef3c..2b8d7c2 100644 --- a/xfce4-session.spec +++ b/xfce4-session.spec @@ -30,6 +30,8 @@ Source0: http://archive.xfce.org/src/xfce/xfce4-session/4.10/%{name}-%{ve Patch0: xfce4-session-simple-splash-remove-shadows.patch # PATCH-FIX-OPENSUSE xfce4-session-adapt-session-scripts.patch gber@opensuse.org -- Adapt upstream sessions script to openSUSE Patch1: xfce4-session-adapt-session-scripts.patch +# PATCH-FIX-UPSTREAM xfce4-session-handle-multiple-interactive-session-save.patch bxo#5379 gber@opensuse.org -- Handle multiple interactive session save correctly (backported from upstream git) +Patch2: xfce4-session-handle-multiple-interactive-session-save.patch %if 0%{?suse_version} > 1210 BuildRequires: iceauth %endif @@ -108,6 +110,7 @@ This package provides the upstream look and feel for the Xfce Session Manager. %setup -q %patch0 -p1 %patch1 -p1 +%patch2 -p1 %build %configure \