diff options
-rw-r--r-- | mate-session/gsm-manager.c | 73 |
1 files changed, 42 insertions, 31 deletions
diff --git a/mate-session/gsm-manager.c b/mate-session/gsm-manager.c index 2af0902..66ae3a6 100644 --- a/mate-session/gsm-manager.c +++ b/mate-session/gsm-manager.c @@ -124,7 +124,7 @@ struct GsmManagerPrivate GsmManagerPhase phase; guint phase_timeout_id; GSList *pending_apps; - gboolean forceful_logout; + GsmManagerLogoutMode logout_mode; GSList *query_clients; guint query_timeout_id; /* This is used for GSM_MANAGER_PHASE_END_SESSION only at the moment, @@ -783,7 +783,7 @@ do_phase_end_session (GsmManager *manager) data.manager = manager; data.flags = 0; - if (manager->priv->forceful_logout) { + if (manager->priv->logout_mode == GSM_MANAGER_LOGOUT_MODE_FORCE) { data.flags |= GSM_CLIENT_END_SESSION_FLAG_FORCEFUL; } if (auto_save_is_enabled (manager)) { @@ -816,7 +816,7 @@ do_phase_end_session_part_2 (GsmManager *manager) data.manager = manager; data.flags = 0; - if (manager->priv->forceful_logout) { + if (manager->priv->logout_mode == GSM_MANAGER_LOGOUT_MODE_FORCE) { data.flags |= GSM_CLIENT_END_SESSION_FLAG_FORCEFUL; } if (auto_save_is_enabled (manager)) { @@ -1011,7 +1011,7 @@ cancel_end_session (GsmManager *manager) NULL); gsm_manager_set_phase (manager, GSM_MANAGER_PHASE_RUNNING); - manager->priv->forceful_logout = FALSE; + manager->priv->logout_mode = GSM_MANAGER_LOGOUT_MODE_NORMAL; manager->priv->logout_type = GSM_MANAGER_LOGOUT_NONE; mdm_set_logout_action (MDM_LOGOUT_ACTION_NONE); @@ -1244,7 +1244,7 @@ do_inhibit_dialog_action (GsmManager *manager, case GSM_LOGOUT_ACTION_SHUTDOWN: case GSM_LOGOUT_ACTION_REBOOT: case GSM_LOGOUT_ACTION_LOGOUT: - manager->priv->forceful_logout = TRUE; + manager->priv->logout_mode = GSM_MANAGER_LOGOUT_MODE_FORCE; end_phase (manager); break; default: @@ -1396,7 +1396,7 @@ _on_query_end_session_timeout (GsmManager *manager) /* Don't add "not responding" inhibitors if logout is forced */ - if (manager->priv->forceful_logout) { + if (manager->priv->logout_mode == GSM_MANAGER_LOGOUT_MODE_FORCE) { continue; } @@ -1442,7 +1442,7 @@ do_phase_query_end_session (GsmManager *manager) data.manager = manager; data.flags = 0; - if (manager->priv->forceful_logout) { + if (manager->priv->logout_mode == GSM_MANAGER_LOGOUT_MODE_FORCE) { data.flags |= GSM_CLIENT_END_SESSION_FLAG_FORCEFUL; } /* We only query if an app is ready to log out, so we don't use @@ -1450,7 +1450,10 @@ do_phase_query_end_session (GsmManager *manager) */ debug_clients (manager); - g_debug ("GsmManager: sending query-end-session to clients forceful:%d", manager->priv->forceful_logout); + g_debug ("GsmManager: sending query-end-session to clients (logout mode: %s)", + manager->priv->logout_mode == GSM_MANAGER_LOGOUT_MODE_NORMAL? "normal" : + manager->priv->logout_mode == GSM_MANAGER_LOGOUT_MODE_FORCE? "forceful": + "no confirmation"); gsm_store_foreach (manager->priv->clients, (GsmStoreFunc)_client_query_end_session, &data); @@ -2108,7 +2111,7 @@ _handle_client_end_session_response (GsmManager *manager, manager->priv->query_clients = g_slist_remove (manager->priv->query_clients, client); - if (! is_ok && !manager->priv->forceful_logout) { + if (! is_ok && !manager->priv->logout_mode != GSM_MANAGER_LOGOUT_MODE_FORCE) { guint cookie; GsmInhibitor *inhibitor; char *app_id; @@ -3081,12 +3084,12 @@ request_hibernate (GsmManager *manager) static void -request_logout (GsmManager *manager, - gboolean forceful_logout) +request_logout (GsmManager *manager, + GsmManagerLogoutMode mode) { g_debug ("GsmManager: requesting logout"); - manager->priv->forceful_logout = forceful_logout; + manager->priv->logout_mode = mode; manager->priv->logout_type = GSM_MANAGER_LOGOUT_LOGOUT; end_phase (manager); @@ -3124,6 +3127,11 @@ logout_dialog_response (GsmLogoutDialog *logout_dialog, guint response_id, GsmManager *manager) { + /* We should only be here if mode has already have been set from + * show_fallback_shutdown/logout_dialog + */ + g_assert (manager->priv->logout_mode == GSM_MANAGER_LOGOUT_MODE_NORMAL); + g_debug ("GsmManager: Logout dialog response: %d", response_id); gtk_widget_destroy (GTK_WIDGET (logout_dialog)); @@ -3152,7 +3160,14 @@ logout_dialog_response (GsmLogoutDialog *logout_dialog, request_reboot (manager); break; case GSM_LOGOUT_RESPONSE_LOGOUT: - request_logout (manager, FALSE); + /* We've already gotten confirmation from the user so + * initiate the logout in NO_CONFIRMATION mode. + * + * (it shouldn't matter whether we use NO_CONFIRMATION or stay + * with NORMAL, unless the shell happens to start after the + * user confirmed) + */ + request_logout (manager, GSM_MANAGER_LOGOUT_MODE_NO_CONFIRMATION); break; default: g_assert_not_reached (); @@ -3170,6 +3185,8 @@ show_shutdown_dialog (GsmManager *manager) return; } + manager->priv->logout_mode = GSM_MANAGER_LOGOUT_MODE_NORMAL; + dialog = gsm_get_shutdown_dialog (gdk_screen_get_default (), gtk_get_current_event_time ()); @@ -3190,6 +3207,8 @@ show_logout_dialog (GsmManager *manager) return; } + manager->priv->logout_mode = GSM_MANAGER_LOGOUT_MODE_NORMAL; + dialog = gsm_get_logout_dialog (gdk_screen_get_default (), gtk_get_current_event_time ()); @@ -3201,9 +3220,8 @@ show_logout_dialog (GsmManager *manager) } static void -user_logout (GsmManager *manager, - gboolean show_confirmation, - gboolean forceful_logout) +user_logout (GsmManager *manager, + GsmManagerLogoutMode mode) { gboolean logout_prompt; @@ -3216,15 +3234,14 @@ user_logout (GsmManager *manager, g_settings_get_boolean (manager->priv->settings_session, "logout-prompt"); - /* Global settings overides input parameter in order to disable confirmation - * dialog accordingly. If we're shutting down, we always show the confirmation - * dialog */ - logout_prompt = (logout_prompt && show_confirmation); - - if (logout_prompt) { + /* If the shell isn't running, and this isn't a non-interative logout request, + * and the user has their settings configured to show a confirmation dialog for + * logout, then go ahead and show the confirmation dialog now. + */ + if (mode == GSM_MANAGER_LOGOUT_MODE_NORMAL && logout_prompt) { show_logout_dialog (manager); } else { - request_logout (manager, forceful_logout); + request_logout (manager, mode); } } @@ -3371,15 +3388,9 @@ gsm_manager_logout (GsmManager *manager, switch (logout_mode) { case GSM_MANAGER_LOGOUT_MODE_NORMAL: - user_logout (manager, TRUE, FALSE); - break; - case GSM_MANAGER_LOGOUT_MODE_NO_CONFIRMATION: - user_logout (manager, FALSE, FALSE); - break; - case GSM_MANAGER_LOGOUT_MODE_FORCE: - user_logout (manager, FALSE, TRUE); + user_logout (manager, logout_mode); break; default: @@ -3552,7 +3563,7 @@ gsm_manager_inhibit (GsmManager *manager, reason, flags); - if (manager->priv->forceful_logout) { + if (manager->priv->logout_mode == GSM_MANAGER_LOGOUT_MODE_FORCE) { GError *new_error; new_error = g_error_new (GSM_MANAGER_ERROR, |