summaryrefslogtreecommitdiffstats
path: root/sysutils/xfce4-power-manager/files/patch-src_xfpm-power.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysutils/xfce4-power-manager/files/patch-src_xfpm-power.c')
-rw-r--r--sysutils/xfce4-power-manager/files/patch-src_xfpm-power.c206
1 files changed, 206 insertions, 0 deletions
diff --git a/sysutils/xfce4-power-manager/files/patch-src_xfpm-power.c b/sysutils/xfce4-power-manager/files/patch-src_xfpm-power.c
new file mode 100644
index 0000000..122c2b8
--- /dev/null
+++ b/sysutils/xfce4-power-manager/files/patch-src_xfpm-power.c
@@ -0,0 +1,206 @@
+From: Eric Koegel <eric.koegel@gmail.com>
+Date: Mon, 1 Sep 2014 20:19:15 +0300
+Subject: [PATCH] Use XScreenSaverSuspend and XTestFakeKeyEvent (Bug 11083)
+
+--- src/xfpm-power.c.orig 2014-12-01 11:33:52 UTC
++++ src/xfpm-power.c
+@@ -63,6 +63,13 @@
+ #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);
+
+@@ -112,6 +119,8 @@ struct XfpmPowerPrivate
+ EggIdletime *idletime;
+
+ gboolean inhibited;
++ gboolean screensaver_inhibited;
++ gulong screensaver_id;
+
+ XfpmNotify *notify;
+ #ifdef ENABLE_POLKIT
+@@ -886,10 +895,106 @@ xfpm_power_remove_device (XfpmPower *pow
+ 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;
++
++ DBG ("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;
++ }
++ }
++ }
++
++ DBG ("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
+@@ -1270,6 +1375,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);
+ }
+
+@@ -1375,24 +1486,49 @@ xfpm_power_change_presentation_mode (Xfp
+ 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)
++ DBG ("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)
+ {
+- EggIdletime *idletime;
++ /* presentation mode inhibits the screensaver */
++ if (!power->priv->screensaver_inhibited)
++ {
++ screen_saver_suspend (power, TRUE);
++ power->priv->screensaver_inhibited = TRUE;
++ }
++ }
++ else
++ {
++ 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);
+ }
+
++ DBG ("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);
+ }
+
OpenPOWER on IntegriCloud