From 19d00b4b6f762930d2f77e43b67cf19059164b6f Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 15 Nov 2019 16:28:46 +0100 Subject: Würg around reset idle time through ungrab hook --- driver/dpms.c | 23 +++++++++++++++++++++++ driver/prefs.h | 2 ++ driver/windows.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) (limited to 'driver') 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. */ @@ -279,6 +296,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, 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 /* for XSetClassHint() */ #include #include /* for time() */ +#include #include /* for the signal names */ #include #include @@ -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); -- cgit v1.2.3-55-g7522