[gnome-settings-daemon] common: Make daemons register with gnome-session
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon] common: Make daemons register with gnome-session
- Date: Tue, 11 Oct 2016 09:13:10 +0000 (UTC)
commit 71f5c5db836b142063a77ff0ff456afd54601a25
Author: Bastien Nocera <hadess hadess net>
Date: Tue Oct 4 21:50:22 2016 +0200
common: Make daemons register with gnome-session
https://bugzilla.gnome.org/show_bug.cgi?id=772370
plugins/common/daemon-skeleton-gtk.h | 99 +++++++++++++++++++++++++++++++++
plugins/common/daemon-skeleton.h | 100 ++++++++++++++++++++++++++++++++++
2 files changed, 199 insertions(+), 0 deletions(-)
---
diff --git a/plugins/common/daemon-skeleton-gtk.h b/plugins/common/daemon-skeleton-gtk.h
index fc658a4..3601d1e 100644
--- a/plugins/common/daemon-skeleton-gtk.h
+++ b/plugins/common/daemon-skeleton-gtk.h
@@ -17,10 +17,15 @@
#include <glib/gi18n.h>
#include <gtk/gtk.h>
+#include "gnome-settings-bus.h"
+
#ifndef PLUGIN_NAME
#error Include PLUGIN_CFLAGS in the daemon s CFLAGS
#endif /* !PLUGIN_NAME */
+#define GNOME_SESSION_DBUS_NAME "org.gnome.SessionManager"
+#define GNOME_SESSION_CLIENT_PRIVATE_DBUS_INTERFACE "org.gnome.SessionManager.ClientPrivate"
+
static MANAGER *manager = NULL;
static int timeout = -1;
static gboolean verbose = FALSE;
@@ -31,6 +36,99 @@ static GOptionEntry entries[] = {
{NULL}
};
+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
+do_stop (void)
+{
+ gtk_main_quit ();
+}
+
+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");
+ do_stop ();
+ }
+}
+
+static void
+on_client_registered (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GVariant *variant;
+ GDBusProxy *client_proxy;
+ GError *error = NULL;
+ gchar *object_path = NULL;
+
+ variant = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), res, &error);
+ if (!variant) {
+ g_warning ("Unable to register client: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ g_variant_get (variant, "(o)", &object_path);
+
+ g_debug ("Registered client at path %s", object_path);
+
+ client_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, 0, NULL,
+ GNOME_SESSION_DBUS_NAME,
+ object_path,
+ GNOME_SESSION_CLIENT_PRIVATE_DBUS_INTERFACE,
+ NULL,
+ &error);
+ if (!client_proxy) {
+ g_warning ("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), NULL);
+
+ g_free (object_path);
+ g_variant_unref (variant);
+}
+
+static void
+register_with_gnome_session (void)
+{
+ GDBusProxy *proxy;
+ const char *startup_id;
+
+ proxy = G_DBUS_PROXY (gnome_settings_bus_get_session_proxy ());
+ startup_id = g_getenv ("DESKTOP_AUTOSTART_ID");
+ g_dbus_proxy_call (proxy,
+ "RegisterClient",
+ g_variant_new ("(ss)", PLUGIN_NAME, startup_id ? startup_id : ""),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ (GAsyncReadyCallback) on_client_registered,
+ NULL);
+}
+
int
main (int argc, char **argv)
{
@@ -59,6 +157,7 @@ main (int argc, char **argv)
}
manager = NEW ();
+ register_with_gnome_session ();
error = NULL;
if (!START (manager, &error)) {
diff --git a/plugins/common/daemon-skeleton.h b/plugins/common/daemon-skeleton.h
index d065c48..fdb1c85 100644
--- a/plugins/common/daemon-skeleton.h
+++ b/plugins/common/daemon-skeleton.h
@@ -16,10 +16,15 @@
#include <glib/gi18n.h>
+#include "gnome-settings-bus.h"
+
#ifndef PLUGIN_NAME
#error Include PLUGIN_CFLAGS in the daemon s CFLAGS
#endif /* !PLUGIN_NAME */
+#define GNOME_SESSION_DBUS_NAME "org.gnome.SessionManager"
+#define GNOME_SESSION_CLIENT_PRIVATE_DBUS_INTERFACE "org.gnome.SessionManager.ClientPrivate"
+
static MANAGER *manager = NULL;
static int timeout = -1;
static gboolean verbose = FALSE;
@@ -30,6 +35,100 @@ static GOptionEntry entries[] = {
{NULL}
};
+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
+do_stop (GMainLoop *loop)
+{
+ g_main_loop_quit (loop);
+}
+
+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");
+ do_stop (user_data);
+ }
+}
+
+static void
+on_client_registered (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GVariant *variant;
+ GMainLoop *loop = user_data;
+ GDBusProxy *client_proxy;
+ GError *error = NULL;
+ gchar *object_path = NULL;
+
+ variant = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), res, &error);
+ if (!variant) {
+ g_warning ("Unable to register client: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ g_variant_get (variant, "(o)", &object_path);
+
+ g_debug ("Registered client at path %s", object_path);
+
+ client_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, 0, NULL,
+ GNOME_SESSION_DBUS_NAME,
+ object_path,
+ GNOME_SESSION_CLIENT_PRIVATE_DBUS_INTERFACE,
+ NULL,
+ &error);
+ if (!client_proxy) {
+ g_warning ("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), loop);
+
+ g_free (object_path);
+ g_variant_unref (variant);
+}
+
+static void
+register_with_gnome_session (GMainLoop *loop)
+{
+ GDBusProxy *proxy;
+ const char *startup_id;
+
+ proxy = G_DBUS_PROXY (gnome_settings_bus_get_session_proxy ());
+ startup_id = g_getenv ("DESKTOP_AUTOSTART_ID");
+ g_dbus_proxy_call (proxy,
+ "RegisterClient",
+ g_variant_new ("(ss)", PLUGIN_NAME, startup_id ? startup_id : ""),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ (GAsyncReadyCallback) on_client_registered,
+ loop);
+}
+
int
main (int argc, char **argv)
{
@@ -62,6 +161,7 @@ main (int argc, char **argv)
}
manager = NEW ();
+ register_with_gnome_session (loop);
error = NULL;
if (!START (manager, &error)) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]