summaryrefslogtreecommitdiffstats
path: root/driver/timers.c
diff options
context:
space:
mode:
authorSimon Rettberg2023-01-19 15:01:27 +0100
committerSimon Rettberg2023-01-19 15:01:27 +0100
commitdecd7562f96c5cefa35a791e824013bb66d1bac5 (patch)
tree6510d52e8be7954eedae9bf62456a18b2d6184bd /driver/timers.c
parent5.45 (diff)
downloadxscreensaver-decd7562f96c5cefa35a791e824013bb66d1bac5.tar.gz
xscreensaver-decd7562f96c5cefa35a791e824013bb66d1bac5.tar.xz
xscreensaver-decd7562f96c5cefa35a791e824013bb66d1bac5.zip
timers.c: Query MIT_SAVER extension for current idle time
Saver turns on too quickly under certain conditions... Try to work around it by explicitly querying idle time before doing any maths.
Diffstat (limited to 'driver/timers.c')
-rw-r--r--driver/timers.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/driver/timers.c b/driver/timers.c
index 17781eb..7c2cef9 100644
--- a/driver/timers.c
+++ b/driver/timers.c
@@ -35,9 +35,7 @@
#include <X11/extensions/xidle.h>
#endif /* HAVE_XIDLE_EXTENSION */
-#ifdef HAVE_MIT_SAVER_EXTENSION
#include <X11/extensions/scrnsaver.h>
-#endif /* HAVE_MIT_SAVER_EXTENSION */
#ifdef HAVE_SGI_SAVER_EXTENSION
#include <X11/extensions/XScreenSaver.h>
@@ -709,6 +707,31 @@ flush_events (saver_info *si)
}
}
+static void
+slx_update_lat (saver_info *si)
+{
+ Display *dpy = si->dpy;
+ XScreenSaverInfo *ssi;
+ int event_basep, error_basep;
+
+ if (!XScreenSaverQueryExtension(dpy, &event_basep, &error_basep)) {
+ fprintf(stderr, "screen saver extension not supported\n");
+ return;
+ }
+ ssi = XScreenSaverAllocInfo();
+ if (ssi == NULL) {
+ fprintf(stderr, "couldn't allocate screen saver info\n");
+ return;
+ }
+ if (!XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), ssi)) {
+ XFree(ssi);
+ fprintf(stderr, "couldn't query screen saver info\n");
+ return;
+ }
+ si->last_activity_time = time (NULL) - ssi->idle / 1000;
+ XFree(ssi);
+}
+
/* methods of detecting idleness:
explicitly informed by SGI SCREEN_SAVER server event;
@@ -858,6 +881,7 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
the the mouse has moved (user activity) or when we have read
an event (again, user activity.)
*/
+ slx_update_lat (si);
idle = 1000 * (si->last_activity_time - time ((time_t *) 0));
}