It avoids calling D-Bus methods when the bus name "org.gnome.SessionManager" does not exist. GSpice-WARNING **: Error calling 'org.gnome.SessionManager.Inhibit': GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.gnome.SessionManager was not provided by any .service files --- The warning appears in other than Gnome desktop environment --- gtk/desktop-integration.c | 63 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/gtk/desktop-integration.c b/gtk/desktop-integration.c index c366fd0..bf6a9e3 100644 --- a/gtk/desktop-integration.c +++ b/gtk/desktop-integration.c @@ -44,6 +44,7 @@ struct _SpiceDesktopIntegrationPrivate { GObject *gnome_session_proxy; /* dummy */ #endif guint gnome_automount_inhibit_cookie; + guint gdbus_watcher_id; }; G_DEFINE_TYPE(SpiceDesktopIntegration, spice_desktop_integration, G_TYPE_OBJECT); @@ -60,33 +61,57 @@ static void handle_dbus_call_error(const char *call, GError **_error) g_clear_error(_error); } -static gboolean gnome_integration_init(SpiceDesktopIntegration *self) +#if defined(USE_GDBUS) +static void name_appeared_cb(GDBusConnection *connection, + const gchar *name, + const gchar *name_owner G_GNUC_UNUSED, + gpointer data) { - G_GNUC_UNUSED SpiceDesktopIntegrationPrivate *priv = self->priv; + SpiceDesktopIntegration *self = SPICE_DESKTOP_INTEGRATION(data); + SpiceDesktopIntegrationPrivate *priv = self->priv; GError *error = NULL; - gboolean success = TRUE; - -#if defined(USE_GDBUS) - priv->gnome_session_proxy = - g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION, - G_DBUS_PROXY_FLAGS_NONE, - NULL, - "org.gnome.SessionManager", - "/org/gnome/SessionManager", - "org.gnome.SessionManager", - NULL, - &error); -#else - success = FALSE; -#endif + priv->gnome_session_proxy = g_dbus_proxy_new_sync(connection, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + name, + "/org/gnome/SessionManager", + "org.gnome.SessionManager", + NULL, + &error); if (error) { g_warning("Could not create org.gnome.SessionManager dbus proxy: %s", error->message); g_clear_error(&error); - return FALSE; } +} + +static void name_vanished_cb(GDBusConnection *connection G_GNUC_UNUSED, + const gchar *name G_GNUC_UNUSED, + gpointer data) +{ + SpiceDesktopIntegration *self = SPICE_DESKTOP_INTEGRATION(data); + SpiceDesktopIntegrationPrivate *priv = self->priv; + + g_clear_object(&priv->gnome_session_proxy); +} +#endif +static gboolean gnome_integration_init(SpiceDesktopIntegration *self) +{ + G_GNUC_UNUSED SpiceDesktopIntegrationPrivate *priv = self->priv; + gboolean success = FALSE; + +#if defined(USE_GDBUS) + priv->gdbus_watcher_id = g_bus_watch_name(G_BUS_TYPE_SESSION, + "org.gnome.SessionManager", + G_BUS_NAME_WATCHER_FLAGS_NONE, + name_appeared_cb, + name_vanished_cb, + self, + NULL); + success = TRUE; +#endif return success; } @@ -150,6 +175,8 @@ static void gnome_integration_dispose(SpiceDesktopIntegration *self) { SpiceDesktopIntegrationPrivate *priv = self->priv; + if (priv->gdbus_watcher_id) + g_bus_unwatch_name(priv->gdbus_watcher_id); g_clear_object(&priv->gnome_session_proxy); } -- 1.9.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel