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/windows.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'driver/windows.c') 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