[gtk+] GtkApplication: Add support for the Xfce session manager
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] GtkApplication: Add support for the Xfce session manager
- Date: Sun, 3 Jul 2016 21:23:05 +0000 (UTC)
commit 3c7cd7ac23408195dc99642f4c0ef41f466541f9
Author: Eric Koegel <eric koegel gmail com>
Date: Tue Jun 28 11:56:35 2016 +0300
GtkApplication: Add support for the Xfce session manager
Xfce4-session-manager added support for managing dbus based clients.
This patch adds support for checking if Xfce session manager is
around after trying the gnome one.
https://bugzilla.gnome.org/show_bug.cgi?id=693203
gtk/gtkapplication-dbus.c | 126 ++++++++++++++++++++++++++++++++++++--------
1 files changed, 103 insertions(+), 23 deletions(-)
---
diff --git a/gtk/gtkapplication-dbus.c b/gtk/gtkapplication-dbus.c
index 1119093..c7a7345 100644
--- a/gtk/gtkapplication-dbus.c
+++ b/gtk/gtkapplication-dbus.c
@@ -27,6 +27,14 @@
G_DEFINE_TYPE (GtkApplicationImplDBus, gtk_application_impl_dbus, GTK_TYPE_APPLICATION_IMPL)
+#define GNOME_DBUS_NAME "org.gnome.SessionManager"
+#define GNOME_DBUS_OBJECT_PATH "/org/gnome/SessionManager"
+#define GNOME_DBUS_INTERFACE "org.gnome.SessionManager"
+#define GNOME_DBUS_CLIENT_INTERFACE "org.gnome.SessionManager.ClientPrivate"
+#define XFCE_DBUS_NAME "org.xfce.SessionManager"
+#define XFCE_DBUS_OBJECT_PATH "/org/xfce/SessionManager"
+#define XFCE_DBUS_INTERFACE "org.xfce.Session.Manager"
+#define XFCE_DBUS_CLIENT_INTERFACE "org.xfce.Session.Client"
static void
unregister_client (GtkApplicationImplDBus *dbus)
@@ -103,6 +111,45 @@ client_proxy_signal (GDBusProxy *proxy,
}
}
+static GDBusProxy*
+gtk_application_get_proxy_if_service_present (GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *bus_name,
+ const gchar *object_path,
+ const gchar *interface,
+ GError **error)
+{
+ GDBusProxy *proxy;
+ gchar *owner;
+
+ g_return_val_if_fail (connection != NULL, NULL);
+ g_return_val_if_fail (bus_name != NULL, NULL);
+ g_return_val_if_fail (object_path != NULL, NULL);
+ g_return_val_if_fail (interface != NULL, NULL);
+
+ proxy = g_dbus_proxy_new_sync (connection,
+ flags,
+ NULL,
+ bus_name,
+ object_path,
+ interface,
+ NULL,
+ &error);
+
+ /* is there anyone actually providing the service? */
+ owner = g_dbus_proxy_get_name_owner (proxy);
+ if (owner == NULL)
+ {
+ g_clear_object (&proxy);
+ }
+ else
+ {
+ g_free (owner);
+ }
+
+ return proxy;
+}
+
static void
gtk_application_impl_dbus_startup (GtkApplicationImpl *impl,
gboolean register_session)
@@ -136,23 +183,42 @@ gtk_application_impl_dbus_startup (GtkApplicationImpl *impl,
g_debug ("Connecting to session manager");
- dbus->sm_proxy = g_dbus_proxy_new_sync (dbus->session,
- G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
- G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
- NULL,
- "org.gnome.SessionManager",
- "/org/gnome/SessionManager",
- "org.gnome.SessionManager",
- NULL,
- &error);
+ /* Try the GNOME session manager first */
+ dbus->sm_proxy = gtk_application_get_proxy_if_service_present (dbus->session,
+ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
+ G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
+ GNOME_DBUS_NAME,
+ GNOME_DBUS_OBJECT_PATH,
+ GNOME_DBUS_INTERFACE,
+ &error);
if (error)
{
- g_warning ("Failed to get a session proxy: %s", error->message);
- g_error_free (error);
+ g_warning ("Failed to get the GNOME session proxy: %s", error->message);
+ g_clear_error (&error);
+ g_clear_object (&dbus->sm_proxy);
goto out;
}
+ if(!dbus->sm_proxy)
+ {
+ /* Fallback to trying the Xfce session manager */
+ dbus->sm_proxy = gtk_application_get_proxy_if_service_present (dbus->session,
+
G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
+
G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
+ XFCE_DBUS_NAME,
+ XFCE_DBUS_OBJECT_PATH,
+ XFCE_DBUS_INTERFACE,
+ &error);
+
+ if (error)
+ {
+ g_warning ("Failed to get the Xfce session proxy: %s", error->message);
+ g_clear_error (&error);
+ goto out;
+ }
+ }
+
if (!register_session)
goto out;
@@ -179,23 +245,37 @@ gtk_application_impl_dbus_startup (GtkApplicationImpl *impl,
g_debug ("Registered client at '%s'", dbus->client_path);
- dbus->client_proxy = g_dbus_proxy_new_sync (dbus->session, 0,
- NULL,
- "org.gnome.SessionManager",
- dbus->client_path,
- "org.gnome.SessionManager.ClientPrivate",
- NULL,
- &error);
+ /* Try the GNOME client interface */
+ dbus->client_proxy = gtk_application_get_proxy_if_service_present (dbus->session, 0,
+ GNOME_DBUS_NAME,
+ dbus->client_path,
+ GNOME_DBUS_CLIENT_INTERFACE,
+ &error);
if (error)
{
- g_warning ("Failed to get client proxy: %s", error->message);
- g_error_free (error);
- g_clear_object (&dbus->sm_proxy);
- g_free (dbus->client_path);
- dbus->client_path = NULL;
+ g_warning ("Failed to connect to the GNOME client proxy: %s", error->message);
+ g_clear_error (&error);
goto out;
}
+ if(!dbus->client_proxy)
+ {
+ /* Fallback to trying the Xfce client interface */
+ dbus->client_proxy = gtk_application_get_proxy_if_service_present (dbus->session, 0,
+ XFCE_DBUS_NAME,
+ dbus->client_path,
+ XFCE_DBUS_CLIENT_INTERFACE,
+ &error);
+ if (error)
+ {
+ g_warning ("Failed to connect to the Xfce client proxy: %s", error->message);
+ g_clear_error (&error);
+ g_free (dbus->client_path);
+ dbus->client_path = NULL;
+ goto out;
+ }
+ }
+
g_signal_connect (dbus->client_proxy, "g-signal", G_CALLBACK (client_proxy_signal), dbus);
out:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]