diff options
author | Simon Rettberg | 2019-11-15 16:28:46 +0100 |
---|---|---|
committer | Simon Rettberg | 2019-11-15 16:28:46 +0100 |
commit | 19d00b4b6f762930d2f77e43b67cf19059164b6f (patch) | |
tree | 6416c5b3de88e4931a9b3871ff3e758a177ed5b5 /driver/windows.c | |
parent | Merge branch 'master' into openslx (5.43) (diff) | |
download | xscreensaver-19d00b4b6f762930d2f77e43b67cf19059164b6f.tar.gz xscreensaver-19d00b4b6f762930d2f77e43b67cf19059164b6f.tar.xz xscreensaver-19d00b4b6f762930d2f77e43b67cf19059164b6f.zip |
Würg around reset idle time through ungrab hook
Diffstat (limited to 'driver/windows.c')
-rw-r--r-- | driver/windows.c | 47 |
1 files changed, 47 insertions, 0 deletions
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); |