summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEric Koegel <eric.koegel@gmail.com>2015-06-11 18:34:27 +0300
committerEric Koegel <eric.koegel@gmail.com>2015-06-11 18:34:58 +0300
commita805071464ecf0fee27d59de15620b035d855eb0 (patch)
tree05cec4ffed4d800c93fedf012ace4dd0f915fe60 /src
parent1830b5a51aa0b6d86e982bd07156a3804d85167c (diff)
downloadixfce4-power-manager-a805071464ecf0fee27d59de15620b035d855eb0.tar.gz
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/
Diffstat (limited to 'src')
-rw-r--r--src/xfpm-power.c151
1 files changed, 144 insertions, 7 deletions
diff --git a/src/xfpm-power.c b/src/xfpm-power.c
index 1bd088d7..0fb4a42c 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);
}