[Xfce4-commits] [xfce/xfce4-power-manager] 01/01: Use XScreenSaverSuspend and XTestFakeKeyEvent (Bug 11083)

noreply at xfce.org noreply at xfce.org
Thu Jun 11 17:45:03 CEST 2015


This is an automated email from the git hooks/post-receive script.

eric pushed a commit to branch master
in repository xfce/xfce4-power-manager.

commit a805071464ecf0fee27d59de15620b035d855eb0
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Thu Jun 11 18:34:27 2015 +0300

    Use XScreenSaverSuspend and XTestFakeKeyEvent (Bug 11083)
    
    Use the XScreenSaverSuspend and XTestFakeKeyEvent calls to suspend
    the screensaver when we're in presentation mode or something has
    requested an inhibit lock. This tries several different ways of
    getting the screensaver to stop running since there's no standard
    way listed on: http://www.freedesktop.org/wiki/Specifications/
---
 configure.ac.in  |   13 ++++-
 src/xfpm-power.c |  151 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 156 insertions(+), 8 deletions(-)

diff --git a/configure.ac.in b/configure.ac.in
index e2f65fc..96b0f0d 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -41,7 +41,8 @@ AC_HEADER_STDC()
 AC_CHECK_HEADERS([errno.h signal.h stddef.h sys/types.h memory.h stdlib.h   \
                   string.h sys/stat.h sys/user.h sys/wait.h time.h math.h   \
                   unistd.h sys/resource.h sys/socket.h sys/sysctl.h fcntl.h \
-                  sys/param.h procfs.h])
+                  sys/param.h procfs.h X11/extensions/scrnsaver.h \
+                  X11/extensions/XTest.h])
 
 AC_CHECK_FUNCS([getpwuid setsid sigaction])
 
@@ -51,6 +52,16 @@ AC_CHECK_FUNCS([getpwuid setsid sigaction])
 AC_CHECK_LIB([m], [round])
 
 # ===================================================== #
+# 		Check for XScreenSaverSuspend		#
+# ===================================================== #
+AC_CHECK_LIB([Xss], [XScreenSaverSuspend])
+
+# ===================================================== #
+# 		Check for XTestFakeKeyEvent		#
+# ===================================================== #
+AC_CHECK_LIB([Xtst], [XTestFakeKeyEvent])
+
+# ===================================================== #
 # 		Check for i18n support 			#
 # ===================================================== #
 
diff --git a/src/xfpm-power.c b/src/xfpm-power.c
index 1bd088d..0fb4a42 100644
--- a/src/xfpm-power.c
+++ b/src/xfpm-power.c
@@ -61,6 +61,14 @@
 #include "xfpm-suspend.h"
 #include "xfpm-brightness.h"
 
+#ifdef HAVE_LIBXTST
+#include "X11/extensions/XTest.h"
+#endif
+
+#ifdef HAVE_LIBXSS
+#include <X11/extensions/scrnsaver.h>
+#endif  /* HAVE_LIBXSS */
+
 static void xfpm_power_finalize     (GObject *object);
 
 static void xfpm_power_get_property (GObject *object,
@@ -109,6 +117,8 @@ struct XfpmPowerPrivate
     EggIdletime     *idletime;
 
     gboolean	     inhibited;
+    gboolean	     screensaver_inhibited;
+    gulong	     screensaver_id;
 
     XfpmNotify	    *notify;
 #ifdef ENABLE_POLKIT
@@ -946,10 +956,106 @@ xfpm_power_remove_device (XfpmPower *power, const gchar *object_path)
     g_hash_table_remove (power->priv->hash, object_path);
 }
 
+static gboolean
+idle_reset_screen_saver (XfpmPower *power)
+{
+    Display *dpy = gdk_x11_get_default_xdisplay ();
+
+    TRACE("entering");
+
+    XResetScreenSaver (dpy);
+
+#ifdef HAVE_LIBXTST
+    /* keycode of 255 does not map to any actual key,
+     * this works for xscreensaver */
+    XTestFakeKeyEvent (dpy, 255, TRUE, 0);
+    XTestFakeKeyEvent (dpy, 255, FALSE, 0);
+#endif /* HAVE_LIBXTST */
+
+    XFlush (dpy);
+
+    /* continue until we're removed */
+    return TRUE;
+}
+
+static void
+screen_saver_suspend(XfpmPower *power, gboolean suspend)
+{
+#ifndef HAVE_LIBXSS
+    TRACE("!HAVE_XSS");
+#else
+    int event, dummy, major, minor;
+    Display *dpy = gdk_x11_get_default_xdisplay();
+
+    TRACE("entering");
+
+    if (XScreenSaverQueryExtension(dpy, &event, &dummy) != TRUE ||
+        XScreenSaverQueryVersion(dpy, &major, &minor) != TRUE)
+    {
+        XFPM_DEBUG ("XScreenSaverQueryExtension or XScreenSaverQueryVersion call failed");
+    }
+
+    /* XScreenSaverSuspend was introduced in MIT-SCREEN-SAVER 1.1 */
+    if (major < 1 || (major == 1 && minor < 1))
+    {
+        XFPM_DEBUG ("version %d.%d not supported", major, minor);
+    }
+
+    XFPM_DEBUG ("XScreenSaverSuspend: %s", suspend ? "TRUE" : "FALSE");
+    XScreenSaverSuspend(dpy, suspend);
+#endif /* HAVE_LIBXSS */
+
+    if (power->priv->screensaver_id != 0)
+    {
+        g_source_remove (power->priv->screensaver_id);
+        power->priv->screensaver_id = 0;
+    }
+
+    if (suspend)
+    {
+        /* Reset the screensaver timers every so often so they don't activate */
+        power->priv->screensaver_id = g_timeout_add_seconds (20,
+                                                             (GSourceFunc)idle_reset_screen_saver,
+                                                             power);
+    }
+}
+
 static void
 xfpm_power_inhibit_changed_cb (XfpmInhibit *inhibit, gboolean is_inhibit, XfpmPower *power)
 {
-    power->priv->inhibited = is_inhibit;
+    if (power->priv->inhibited != is_inhibit)
+    {
+        power->priv->inhibited = is_inhibit;
+
+        XFPM_DEBUG ("is_inhibit %s, screensaver_inhibited %s, presentation_mode %s",
+	            power->priv->inhibited ? "TRUE" : "FALSE",
+	            power->priv->screensaver_inhibited ? "TRUE" : "FALSE",
+	            power->priv->presentation_mode ? "TRUE" : "FALSE");
+
+        /* If we are inhibited make sure we inhibit the screensaver too */
+        if (is_inhibit)
+        {
+            if (!power->priv->screensaver_inhibited)
+            {
+                screen_saver_suspend (power, TRUE);
+                power->priv->screensaver_inhibited = TRUE;
+            }
+        }
+        else
+        {
+            /* Or make sure we remove the screensaver inhibit */
+            if (power->priv->screensaver_inhibited && !power->priv->presentation_mode)
+            {
+                screen_saver_suspend (power, FALSE);
+                power->priv->screensaver_inhibited = FALSE;
+            }
+        }
+    }
+
+    XFPM_DEBUG ("is_inhibit %s, screensaver_inhibited %s, presentation_mode %s",
+		power->priv->inhibited ? "TRUE" : "FALSE",
+		power->priv->screensaver_inhibited ? "TRUE" : "FALSE",
+		power->priv->presentation_mode ? "TRUE" : "FALSE");
 }
 
 static void
@@ -1316,6 +1422,12 @@ xfpm_power_finalize (GObject *object)
 
     g_object_unref(power->priv->dpms);
 
+    if (power->priv->screensaver_id != 0)
+    {
+	g_source_remove (power->priv->screensaver_id);
+	power->priv->screensaver_id = 0;
+    }
+
     G_OBJECT_CLASS (xfpm_power_parent_class)->finalize (object);
 }
 
@@ -1421,24 +1533,49 @@ xfpm_power_change_presentation_mode (XfpmPower *power, gboolean presentation_mod
     if (power->priv->presentation_mode == presentation_mode)
         return;
 
-    XFPM_DEBUG ("presentation mode %s, changing to %s",
-                power->priv->presentation_mode ? "TRUE" : "FALSE",
-                presentation_mode ? "TRUE" : "FALSE");
-
     power->priv->presentation_mode = presentation_mode;
 
     /* presentation mode inhibits dpms */
     xfpm_dpms_inhibit (power->priv->dpms, presentation_mode);
 
-    if (presentation_mode == FALSE)
+    XFPM_DEBUG ("is_inhibit %s, screensaver_inhibited %s, presentation_mode %s",
+		power->priv->inhibited ? "TRUE" : "FALSE",
+		power->priv->screensaver_inhibited ? "TRUE" : "FALSE",
+		power->priv->presentation_mode ? "TRUE" : "FALSE");
+
+    if (presentation_mode)
+    {
+	/* presentation mode inhibits the screensaver */
+	if (!power->priv->screensaver_inhibited)
+	{
+	    screen_saver_suspend (power, TRUE);
+	    power->priv->screensaver_inhibited = TRUE;
+	}
+    }
+    else
     {
-        EggIdletime *idletime;
+	EggIdletime *idletime;
+
+	/* make sure we remove the screensaver inhibit */
+	if (power->priv->screensaver_inhibited && !power->priv->inhibited)
+	{
+	    DBG("here");
+	    screen_saver_suspend (power, FALSE);
+	    power->priv->screensaver_inhibited = FALSE;
+	}
+
+	/* reset the timers */
         idletime = egg_idletime_new ();
         egg_idletime_alarm_reset_all (idletime);
 
         g_object_unref (idletime);
     }
 
+    XFPM_DEBUG ("is_inhibit %s, screensaver_inhibited %s, presentation_mode %s",
+		power->priv->inhibited ? "TRUE" : "FALSE",
+		power->priv->screensaver_inhibited ? "TRUE" : "FALSE",
+		power->priv->presentation_mode ? "TRUE" : "FALSE");
+
     xfpm_update_blank_time (power);
 }
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list