diff options
author | Matthias Clasen <mclasen@redhat.com> | 2009-04-27 11:23:15 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2009-04-27 11:23:15 -0400 |
commit | 758666242f97ff02c826ee37f2965ac5a828402d (patch) | |
tree | b731a10fd5b4fb5b46c82faf7515a2a979d4c50d /gui | |
parent | 5933847df963d2349b9bc7528d17a682bda7cf7f (diff) | |
download | gdm-758666242f97ff02c826ee37f2965ac5a828402d.tar.gz |
Make the greeter a well-behaved session client
Since the greeter registers with the session manager, it should also
handle QueryEndSession and EndSession. This prevents the inhibit dialog
from showing up when the user shuts down with the power button. Fixes
bug 580189.
Diffstat (limited to 'gui')
-rw-r--r-- | gui/simple-greeter/greeter-main.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/gui/simple-greeter/greeter-main.c b/gui/simple-greeter/greeter-main.c index 051888d7..7a800288 100644 --- a/gui/simple-greeter/greeter-main.c +++ b/gui/simple-greeter/greeter-main.c @@ -155,6 +155,46 @@ session_manager_connect (void) return (sm_proxy != NULL); } +static void +stop_cb (gpointer data) +{ + gtk_main_quit (); +} + +static gboolean +end_session_response (gboolean is_okay, const gchar *reason) +{ + gboolean ret; + GError *error = NULL; + + ret = dbus_g_proxy_call (client_proxy, "EndSessionResponse", + &error, + G_TYPE_BOOLEAN, is_okay, + G_TYPE_STRING, reason, + G_TYPE_INVALID, + G_TYPE_INVALID); + + if (!ret) { + g_warning ("Failed to send session response %s", error->message); + g_error_free (error); + } + + return ret; +} + +static void +query_end_session_cb (guint flags, gpointer data) +{ + end_session_response (TRUE, NULL); +} + +static void +end_session_cb (guint flags, gpointer data) +{ + end_session_response (TRUE, NULL); + gtk_main_quit (); +} + static gboolean register_client (void) { @@ -186,6 +226,19 @@ register_client (void) SM_DBUS_NAME, client_id, SM_CLIENT_DBUS_INTERFACE); + + dbus_g_proxy_add_signal (client_proxy, "Stop", G_TYPE_INVALID); + dbus_g_proxy_connect_signal (client_proxy, "Stop", + G_CALLBACK (stop_cb), NULL, NULL); + + dbus_g_proxy_add_signal (client_proxy, "QueryEndSession", G_TYPE_UINT, G_TYPE_INVALID); + dbus_g_proxy_connect_signal (client_proxy, "QueryEndSession", + G_CALLBACK (query_end_session_cb), NULL, NULL); + + dbus_g_proxy_add_signal (client_proxy, "EndSession", G_TYPE_UINT, G_TYPE_INVALID); + dbus_g_proxy_connect_signal (client_proxy, "EndSession", + G_CALLBACK (end_session_cb), NULL, NULL); + g_unsetenv ("DESKTOP_AUTOSTART_ID"); return TRUE; |