From 3150d38bbfee2f245267cddb87c77501e72b1b1d Mon Sep 17 00:00:00 2001 From: Olivier Duchateau Date: Wed, 2 Jan 2019 22:45:49 +0100 Subject: [PATCH] Add support of org.xfce.ScreenSaver service --- src/common/parole-screensaver.c | 125 ++++++++++++++++++++++++++------ src/common/parole-screensaver.h | 12 ++- 2 files changed, 110 insertions(+), 27 deletions(-) diff --git a/src/common/parole-screensaver.c b/src/common/parole-screensaver.c index 3ef9aa9..d19022c 100644 --- a/src/common/parole-screensaver.c +++ b/src/common/parole-screensaver.c @@ -36,19 +36,62 @@ #include "parole-screensaver.h" -#define RESET_SCREENSAVER_TIMEOUT 6 +typedef enum { + SCREENSAVER_TYPE_NATIVE, + SCREENSAVER_TYPE_FALLBACK +} ScreenSaverType; -#define PAROLE_SCREEN_SAVER_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE((o), PAROLE_TYPE_SCREENSAVER, ParoleScreenSaverPrivate)) +struct _ParoleScreenSaverPrivate { + GDBusProxy *proxy; + guint cookie; + ScreenSaverType screensaver_type; +}; -G_DEFINE_TYPE(ParoleScreenSaver, parole_screen_saver, G_TYPE_OBJECT) +G_DEFINE_TYPE_WITH_PRIVATE(ParoleScreenSaver, parole_screen_saver, G_TYPE_OBJECT) +static void parole_screen_saver_setup(ParoleScreenSaver *saver); static void parole_screen_saver_finalize(GObject *object) { + ParoleScreenSaver *saver = PAROLE_SCREEN_SAVER(object); + + if (saver->priv->proxy != NULL) { + g_object_unref(saver->priv->proxy); + saver->priv->proxy = NULL; + } + G_OBJECT_CLASS(parole_screen_saver_parent_class)->finalize(object); } +static void +parole_screen_saver_setup(ParoleScreenSaver *saver) { + GDBusProxy *proxy; + gchar *owner = NULL; + + proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.xfce.ScreenSaver", + "/org/xfce/ScreenSaver", + "org.xfce.ScreenSaver", + NULL, NULL); + if (proxy != NULL) { + owner = g_dbus_proxy_get_name_owner(proxy); + if (owner != NULL) { + saver->priv->proxy = proxy; + saver->priv->screensaver_type = SCREENSAVER_TYPE_NATIVE; + + g_free(owner); + } + else { + g_object_unref(proxy); + saver->priv->screensaver_type = SCREENSAVER_TYPE_FALLBACK; + } + } + else + saver->priv->screensaver_type = SCREENSAVER_TYPE_FALLBACK; +} + static void parole_screen_saver_class_init(ParoleScreenSaverClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS(klass); @@ -58,7 +101,9 @@ parole_screen_saver_class_init(ParoleScreenSaverClass *klass) { static void parole_screen_saver_init(ParoleScreenSaver *saver) { - return; + saver->priv = parole_screen_saver_get_instance_private(saver); + + parole_screen_saver_setup(saver); } ParoleScreenSaver * @@ -69,29 +114,63 @@ parole_screen_saver_new(void) { } void parole_screen_saver_inhibit(ParoleScreenSaver *saver, GtkWindow *window) { - gchar *cmd; - gint returncode; - g_return_if_fail(PAROLE_IS_SCREENSAVER(saver)); - cmd = g_strdup_printf("xdg-screensaver suspend %i", (int)GDK_WINDOW_XID(gtk_widget_get_window(GTK_WIDGET(window)))); - returncode = system(cmd); - - TRACE("\'xdg-screensaver suspend\' returned %i", returncode); - - g_free(cmd); + if (saver->priv->screensaver_type == SCREENSAVER_TYPE_FALLBACK) { + gchar *cmd; + gint returncode; + + cmd = g_strdup_printf("xdg-screensaver suspend %i", + (int)GDK_WINDOW_XID(gtk_widget_get_window(GTK_WIDGET(window)))); + returncode = system(cmd); + + TRACE("\'xdg-screensaver suspend\' returned %i", returncode); + + g_free(cmd); + } + else if (saver->priv->screensaver_type == SCREENSAVER_TYPE_NATIVE) { + GVariant *res = NULL; + + res = g_dbus_proxy_call_sync(saver->priv->proxy, + "Inhibit", + g_variant_new("(ss)", + PACKAGE_NAME, + "Inhibit requested"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, NULL); + if (res != NULL) { + g_variant_get(res, "(u)", &saver->priv->cookie); + g_variant_unref(res); + } + } } void parole_screen_saver_uninhibit(ParoleScreenSaver *saver, GtkWindow *window) { - gchar *cmd; - gint returncode; - g_return_if_fail(PAROLE_IS_SCREENSAVER(saver)); - cmd = g_strdup_printf("xdg-screensaver resume %i", (int)GDK_WINDOW_XID(gtk_widget_get_window(GTK_WIDGET(window)))); - returncode = system(cmd); - - TRACE("\'xdg-screensaver resume\' returned %i", returncode); - - g_free(cmd); + if (saver->priv->screensaver_type == SCREENSAVER_TYPE_FALLBACK) { + gchar *cmd; + gint returncode; + + cmd = g_strdup_printf("xdg-screensaver suspend %i", + (int)GDK_WINDOW_XID(gtk_widget_get_window(GTK_WIDGET(window)))); + returncode = system(cmd); + + TRACE("\'xdg-screensaver resume\' returned %i", returncode); + + g_free(cmd); + } + else if (saver->priv->screensaver_type == SCREENSAVER_TYPE_NATIVE) { + GVariant *res = NULL; + + res = g_dbus_proxy_call_sync(saver->priv->proxy, + "UnInhibit", + g_variant_new("(u)", + saver->priv->cookie), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, NULL); + saver->priv->cookie = 0; + if (res != NULL) + g_variant_unref(res); + } } diff --git a/src/common/parole-screensaver.h b/src/common/parole-screensaver.h index 4ada611..7ce4815 100644 --- a/src/common/parole-screensaver.h +++ b/src/common/parole-screensaver.h @@ -24,20 +24,24 @@ #define SRC_COMMON_PAROLE_SCREENSAVER_H_ #include +#include #include G_BEGIN_DECLS -#define PAROLE_TYPE_SCREENSAVER (parole_screen_saver_get_type () ) +#define PAROLE_TYPE_SCREENSAVER (parole_screen_saver_get_type ()) #define PAROLE_SCREEN_SAVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_SCREENSAVER, ParoleScreenSaver)) #define PAROLE_IS_SCREENSAVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_SCREENSAVER)) +typedef struct _ParoleScreenSaverPrivate ParoleScreenSaverPrivate; + typedef struct { - GObject parent; + GObject parent; + ParoleScreenSaverPrivate *priv; } ParoleScreenSaver; -typedef struct { - GObjectClass parent_class; +typedef struct ParoleScreenSaverClass { + GObjectClass parent_class; } ParoleScreenSaverClass; GType parole_screen_saver_get_type (void) G_GNUC_CONST; -- 2.20.1