185 lines
7.8 KiB
Diff
185 lines
7.8 KiB
Diff
|
From bf1b6e8843b5e72d4f5a62a34eb322b82e33c2df Mon Sep 17 00:00:00 2001
|
||
|
From: Ray Strode <rstrode@redhat.com>
|
||
|
Date: Sun, 7 Nov 2010 11:49:33 -0500
|
||
|
Subject: [PATCH 1/2] manager: don't ever show inhibitor dialog if logout is forced
|
||
|
|
||
|
If logout is forced, we don't want to show the inhibitor dialog.
|
||
|
A forced logout is one that shouldn't be "cancelable".
|
||
|
|
||
|
This commit prevents inhibitors from getting added if logout is
|
||
|
forced.
|
||
|
---
|
||
|
gnome-session/gsm-manager.c | 24 +++++++++++++++++++++---
|
||
|
1 files changed, 21 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c
|
||
|
index c85cea6..d15402f 100644
|
||
|
--- a/gnome-session/gsm-manager.c
|
||
|
+++ b/gnome-session/gsm-manager.c
|
||
|
@@ -1193,6 +1193,12 @@ _on_query_end_session_timeout (GsmManager *manager)
|
||
|
g_warning ("Client '%s' failed to reply before timeout",
|
||
|
gsm_client_peek_id (l->data));
|
||
|
|
||
|
+ /* Don't add "not responding" inhibitors if logout is forced
|
||
|
+ */
|
||
|
+ if (manager->priv->forceful_logout) {
|
||
|
+ continue;
|
||
|
+ }
|
||
|
+
|
||
|
/* Add JIT inhibit for unresponsive client */
|
||
|
if (GSM_IS_DBUS_CLIENT (l->data)) {
|
||
|
bus_name = gsm_dbus_client_get_bus_name (l->data);
|
||
|
@@ -1248,8 +1254,8 @@ do_phase_query_end_session (GsmManager *manager)
|
||
|
(GsmStoreFunc)_client_query_end_session,
|
||
|
&data);
|
||
|
|
||
|
- /* This phase doesn't time out. This separate timer is only used to
|
||
|
- * show UI. */
|
||
|
+ /* This phase doesn't time out unless logout is forced. Typically, this
|
||
|
+ * separate timer is only used to show UI. */
|
||
|
manager->priv->query_timeout_id = g_timeout_add_seconds (1, (GSourceFunc)_on_query_end_session_timeout, manager);
|
||
|
}
|
||
|
|
||
|
@@ -1877,7 +1883,7 @@ on_client_end_session_response (GsmClient *client,
|
||
|
|
||
|
manager->priv->query_clients = g_slist_remove (manager->priv->query_clients, client);
|
||
|
|
||
|
- if (! is_ok) {
|
||
|
+ if (! is_ok && !manager->priv->forceful_logout) {
|
||
|
guint cookie;
|
||
|
GsmInhibitor *inhibitor;
|
||
|
char *app_id;
|
||
|
@@ -3172,6 +3178,18 @@ gsm_manager_inhibit (GsmManager *manager,
|
||
|
reason,
|
||
|
flags);
|
||
|
|
||
|
+ if (manager->priv->forceful_logout) {
|
||
|
+ GError *new_error;
|
||
|
+
|
||
|
+ new_error = g_error_new (GSM_MANAGER_ERROR,
|
||
|
+ GSM_MANAGER_ERROR_GENERAL,
|
||
|
+ "Forced logout cannot be inhibited");
|
||
|
+ g_debug ("GsmManager: Unable to inhibit: %s", new_error->message);
|
||
|
+ dbus_g_method_return_error (context, new_error);
|
||
|
+ g_error_free (new_error);
|
||
|
+ return FALSE;
|
||
|
+ }
|
||
|
+
|
||
|
if (IS_STRING_EMPTY (app_id)) {
|
||
|
GError *new_error;
|
||
|
|
||
|
--
|
||
|
1.7.3.1
|
||
|
|
||
|
|
||
|
From 8e6afcf1789c02692cf3b1ff3ee0a792d57e17a3 Mon Sep 17 00:00:00 2001
|
||
|
From: Ray Strode <rstrode@redhat.com>
|
||
|
Date: Sun, 7 Nov 2010 12:32:17 -0500
|
||
|
Subject: [PATCH 2/2] manager: remove client from query clients list on disconnect
|
||
|
|
||
|
When the session manager enters the query end session phase,
|
||
|
it temporarily adds all clients to the "query clients" list.
|
||
|
|
||
|
This list is used to track the progression of clients quitting.
|
||
|
|
||
|
If a client quits during the query end session phase instead of
|
||
|
waiting until the end session phase, then it will get destroyed
|
||
|
but not get removed from the query clients list.
|
||
|
|
||
|
This commit removes it from the query clients list in
|
||
|
this case. It does this by explicitly invoking the end session
|
||
|
response handler (in effect, the client responded to the end
|
||
|
session query by exiting).
|
||
|
---
|
||
|
gnome-session/gsm-manager.c | 53 ++++++++++++++++++++++++++++++++++++++-----
|
||
|
1 files changed, 47 insertions(+), 6 deletions(-)
|
||
|
|
||
|
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c
|
||
|
index d15402f..d1fecb9 100644
|
||
|
--- a/gnome-session/gsm-manager.c
|
||
|
+++ b/gnome-session/gsm-manager.c
|
||
|
@@ -164,6 +164,13 @@ static void gsm_manager_finalize (GObject *object);
|
||
|
static gboolean auto_save_is_enabled (GsmManager *manager);
|
||
|
static void maybe_save_session (GsmManager *manager);
|
||
|
|
||
|
+static void _handle_client_end_session_response (GsmManager *manager,
|
||
|
+ GsmClient *client,
|
||
|
+ gboolean is_ok,
|
||
|
+ gboolean do_last,
|
||
|
+ gboolean cancel,
|
||
|
+ const char *reason);
|
||
|
+
|
||
|
static gpointer manager_object = NULL;
|
||
|
|
||
|
G_DEFINE_TYPE (GsmManager, gsm_manager, G_TYPE_OBJECT)
|
||
|
@@ -1516,6 +1523,24 @@ _disconnect_client (GsmManager *manager,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+ if (manager->priv->phase == GSM_MANAGER_PHASE_QUERY_END_SESSION) {
|
||
|
+ /* Instead of answering our end session query, the client just exited.
|
||
|
+ * Treat that as an "okay, end the session" answer.
|
||
|
+ *
|
||
|
+ * This call implicitly removes any inhibitors for the client, along
|
||
|
+ * with removing the client from the pending query list.
|
||
|
+ */
|
||
|
+ _handle_client_end_session_response (manager,
|
||
|
+ client,
|
||
|
+ TRUE,
|
||
|
+ FALSE,
|
||
|
+ FALSE,
|
||
|
+ "Client exited in "
|
||
|
+ "query end session phase "
|
||
|
+ "instead of end session "
|
||
|
+ "phase");
|
||
|
+ }
|
||
|
+
|
||
|
if (app == NULL) {
|
||
|
g_debug ("GsmManager: unable to find application for client - not restarting");
|
||
|
goto out;
|
||
|
@@ -1862,12 +1887,12 @@ out:
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
-on_client_end_session_response (GsmClient *client,
|
||
|
- gboolean is_ok,
|
||
|
- gboolean do_last,
|
||
|
- gboolean cancel,
|
||
|
- const char *reason,
|
||
|
- GsmManager *manager)
|
||
|
+_handle_client_end_session_response (GsmManager *manager,
|
||
|
+ GsmClient *client,
|
||
|
+ gboolean is_ok,
|
||
|
+ gboolean do_last,
|
||
|
+ gboolean cancel,
|
||
|
+ const char *reason)
|
||
|
{
|
||
|
/* just ignore if received outside of shutdown */
|
||
|
if (manager->priv->phase < GSM_MANAGER_PHASE_QUERY_END_SESSION) {
|
||
|
@@ -1952,6 +1977,22 @@ on_client_end_session_response (GsmClient *client,
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
+on_client_end_session_response (GsmClient *client,
|
||
|
+ gboolean is_ok,
|
||
|
+ gboolean do_last,
|
||
|
+ gboolean cancel,
|
||
|
+ const char *reason,
|
||
|
+ GsmManager *manager)
|
||
|
+{
|
||
|
+ _handle_client_end_session_response (manager,
|
||
|
+ client,
|
||
|
+ is_ok,
|
||
|
+ do_last,
|
||
|
+ cancel,
|
||
|
+ reason);
|
||
|
+}
|
||
|
+
|
||
|
+static void
|
||
|
on_xsmp_client_logout_request (GsmXSMPClient *client,
|
||
|
gboolean show_dialog,
|
||
|
GsmManager *manager)
|
||
|
--
|
||
|
1.7.3.1
|
||
|
|