[gnome-settings-daemon] daemon: properly handle gnome-session EndSession signals
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon] daemon: properly handle gnome-session EndSession signals
- Date: Mon, 29 Nov 2010 14:04:31 +0000 (UTC)
commit 20e79e25b0e5e584aa185677e91d3ef33499f165
Author: Cosimo Cecchi <cosimoc gnome org>
Date: Mon Nov 29 15:00:25 2010 +0100
daemon: properly handle gnome-session EndSession signals
So that the daemon doesn't block at logout.
gnome-settings-daemon/main.c | 76 ++++++++++++++++++++++++++++++++++++++++--
1 files changed, 73 insertions(+), 3 deletions(-)
---
diff --git a/gnome-settings-daemon/main.c b/gnome-settings-daemon/main.c
index 780f5ca..9acd939 100644
--- a/gnome-settings-daemon/main.c
+++ b/gnome-settings-daemon/main.c
@@ -42,6 +42,7 @@
#define GNOME_SESSION_DBUS_NAME "org.gnome.SessionManager"
#define GNOME_SESSION_DBUS_OBJECT "/org/gnome/SessionManager"
#define GNOME_SESSION_DBUS_INTERFACE "org.gnome.SessionManager"
+#define GNOME_SESSION_CLIENT_PRIVATE_DBUS_INTERFACE "org.gnome.SessionManager.ClientPrivate"
static gboolean debug = FALSE;
static gboolean do_timed_exit = FALSE;
@@ -64,6 +65,13 @@ timed_exit_cb (void)
}
static void
+stop_manager (GnomeSettingsManager *manager)
+{
+ gnome_settings_manager_stop (manager);
+ gtk_main_quit ();
+}
+
+static void
on_session_over (GDBusProxy *proxy,
gchar *sender_name,
gchar *signal_name,
@@ -72,25 +80,87 @@ on_session_over (GDBusProxy *proxy,
{
if (g_strcmp0 (signal_name, "SessionOver") == 0) {
g_debug ("Got a SessionOver signal - stopping");
- gnome_settings_manager_stop (manager);
- gtk_main_quit ();
+ stop_manager (manager);
}
}
static void
+respond_to_end_session (GDBusProxy *proxy)
+{
+ /* we must answer with "EndSessionResponse" */
+ g_dbus_proxy_call (proxy, "EndSessionResponse",
+ g_variant_new ("(bs)",
+ TRUE, ""),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL, NULL, NULL);
+}
+
+static void
+client_proxy_signal_cb (GDBusProxy *proxy,
+ gchar *sender_name,
+ gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ if (g_strcmp0 (signal_name, "QueryEndSession") == 0) {
+ g_debug ("Got QueryEndSession signal");
+ respond_to_end_session (proxy);
+ } else if (g_strcmp0 (signal_name, "EndSession") == 0) {
+ g_debug ("Got EndSession signal");
+ respond_to_end_session (proxy);
+ } else if (g_strcmp0 (signal_name, "Stop") == 0) {
+ g_debug ("Got Stop signal");
+ stop_manager (manager);
+ }
+}
+
+static void
+got_client_proxy (GObject *object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GDBusProxy *client_proxy;
+ GError *error = NULL;
+
+ client_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
+
+ if (error != NULL) {
+ g_debug ("Unable to get the session client proxy: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ g_signal_connect (client_proxy, "g-signal",
+ G_CALLBACK (client_proxy_signal_cb), manager);
+}
+
+static void
on_client_registered (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
GVariant *variant;
GError *error = NULL;
+ gchar *object_path = NULL;
variant = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), res, &error);
if (error != NULL) {
g_warning ("Unable to register client: %s", error->message);
g_error_free (error);
} else {
- g_variant_unref (variant);
+ g_variant_get (variant, "(o)", &object_path);
+
+ g_debug ("Registered client at path %s", object_path);
+
+ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, 0, NULL,
+ GNOME_SESSION_DBUS_NAME,
+ object_path,
+ GNOME_SESSION_CLIENT_PRIVATE_DBUS_INTERFACE,
+ NULL,
+ got_client_proxy,
+ manager);
+
+ g_free (object_path);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]