summaryrefslogtreecommitdiffstats
path: root/driver
diff options
context:
space:
mode:
authorSimon Rettberg2019-11-15 16:28:46 +0100
committerSimon Rettberg2019-11-15 16:28:46 +0100
commit19d00b4b6f762930d2f77e43b67cf19059164b6f (patch)
tree6416c5b3de88e4931a9b3871ff3e758a177ed5b5 /driver
parentMerge branch 'master' into openslx (5.43) (diff)
downloadxscreensaver-19d00b4b6f762930d2f77e43b67cf19059164b6f.tar.gz
xscreensaver-19d00b4b6f762930d2f77e43b67cf19059164b6f.tar.xz
xscreensaver-19d00b4b6f762930d2f77e43b67cf19059164b6f.zip
Würg around reset idle time through ungrab hook
Diffstat (limited to 'driver')
-rw-r--r--driver/dpms.c23
-rw-r--r--driver/prefs.h2
-rw-r--r--driver/windows.c47
3 files changed, 72 insertions, 0 deletions
diff --git a/driver/dpms.c b/driver/dpms.c
index a0dd7b8..3a8803c 100644
--- a/driver/dpms.c
+++ b/driver/dpms.c
@@ -86,8 +86,12 @@
#ifdef HAVE_DPMS_EXTENSION
+#define CLAMP_DOWN(var,val,mi) do { int old = (var); (var) -= (val); if ((var) < (mi) || (var) > old) (var) = (mi); } while (0)
+
static Bool error_handler_hit_p = False;
+static int idle_offset = 0;
+
static int
ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
{
@@ -95,6 +99,12 @@ ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
return 0;
}
+void
+store_dpms_offset(int offset)
+{
+ idle_offset = offset < 15 ? 0 : offset;
+}
+
void
sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p,
@@ -125,6 +135,13 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p,
if (bogus_p) enabled_p = False;
+ if (idle_offset != 0)
+ {
+ CLAMP_DOWN (standby_secs, idle_offset, 10);
+ CLAMP_DOWN (suspend_secs, idle_offset, 10);
+ CLAMP_DOWN (off_secs, idle_offset, 10);
+ }
+
/* X protocol sends these values in a CARD16, so truncate them to 16 bits.
This means that the maximum timeout is 18:12:15.
*/
@@ -280,6 +297,12 @@ monitor_power_on (saver_info *si, Bool on_p)
#else /* !HAVE_DPMS_EXTENSION */
void
+store_dpms_offset(Display *dpy, Bool reset_p)
+{
+}
+
+
+void
sync_server_dpms_settings (Display *dpy, Bool enabled_p,
Bool dpms_quickoff_p,
int standby_secs, int suspend_secs, int off_secs,
diff --git a/driver/prefs.h b/driver/prefs.h
index cd1016d..c494eaf 100644
--- a/driver/prefs.h
+++ b/driver/prefs.h
@@ -34,4 +34,6 @@ extern void sync_server_dpms_settings (Display *, Bool enabled_p,
int off_secs,
Bool verbose_p);
+extern void store_dpms_offset(int offset);
+
#endif /* __XSCREENSAVER_PREFS_H__ */
diff --git a/driver/windows.c b/driver/windows.c
index 38a611b..633593b 100644
--- a/driver/windows.c
+++ b/driver/windows.c
@@ -35,6 +35,7 @@
#include <X11/Xutil.h> /* for XSetClassHint() */
#include <X11/Xatom.h>
#include <X11/Xos.h> /* for time() */
+#include <X11/extensions/scrnsaver.h>
#include <signal.h> /* for the signal names */
#include <time.h>
#include <sys/time.h>
@@ -1663,6 +1664,17 @@ mouse_screen (saver_info *si)
return 0;
}
+static int
+get_idle_time (saver_info *si)
+{
+ int ret = 0;
+ XScreenSaverInfo *info;
+ info = XScreenSaverAllocInfo ();
+ if (info != NULL && XScreenSaverQueryInfo (si->dpy, DefaultRootWindow (si->dpy), info))
+ ret = info->idle / 1000;
+ XFree (info);
+ return ret;
+}
Bool
blank_screen (saver_info *si)
@@ -1671,7 +1683,16 @@ blank_screen (saver_info *si)
Bool ok;
Window w;
int mscreen;
+ int idle_s = 0;
+ Bool screen_on = True;
+ const char *euc = si->prefs.external_ungrab_command;
+ if (euc && *euc)
+ {
+ screen_on = monitor_powered_on_p (si);
+ if (screen_on)
+ idle_s = get_idle_time(si);
+ }
/* Note: we do our grabs on the root window, not on the screensaver window.
If we grabbed on the saver window, then the demo mode and lock dialog
boxes wouldn't get any events.
@@ -1703,6 +1724,31 @@ blank_screen (saver_info *si)
if (!ok)
return False;
+ if (euc && *euc)
+ {
+ /* ungrab hooks might have messed up idle time -- account for that.
+ this might look like the math is backwards, but this handles both
+ cases -- ungrab hook did mess up idle time, and ungrab hook
+ did *not* mess up idle time. In the latter case the value will be
+ zero or negative, so it gets clamped to zero.
+ */
+ if (screen_on)
+ {
+ saver_preferences *p = &si->prefs;
+ store_dpms_offset (idle_s - get_idle_time(si));
+ sync_server_dpms_settings (si->dpy,
+ (p->dpms_enabled_p &&
+ p->mode != DONT_BLANK),
+ p->dpms_quickoff_p,
+ p->dpms_standby / 1000,
+ p->dpms_suspend / 1000,
+ p->dpms_off / 1000,
+ False);
+ }
+ else /* screen was off before, might have been turned on by fake events */
+ monitor_power_on (si, False);
+ }
+
for (i = 0; i < si->nscreens; i++)
{
saver_screen_info *ssi = &si->screens[i];
@@ -1743,6 +1789,7 @@ unblank_screen (saver_info *si)
Bool unfade_p = (si->fading_possible_p && p->unfade_p);
int i;
+ store_dpms_offset (0);
monitor_power_on (si, True);
reset_watchdog_timer (si, False);