You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
3.7 KiB

From 63b985a5aae04b89f6a4357cb10dfeba9f482cd7 Mon Sep 17 00:00:00 2001
From: Mamoru TASAKA <mtasaka@fedoraproject.org>
Date: Tue, 6 Jul 2021 22:27:21 +0900
Subject: [PATCH 1/2] main_loop: consistently check init file after some
activitity occurred.
Current main_loop logic is:
* Block until some activity happens or timeout happens,
timeout is until last activity + blank_timeout
* When block is released, if 60sec has already passed since the last
time init file is checked, init file is checked again.
So:
* When a user has been editing init file for some long time,
activity has been occuring.
In this case, init file is checked every 60sec.
* However when:
- on "a" time init file is checked
- user edits init file, shortly
- then user stops activity
then the edited init file won't checked until last activity + blank_timeout
(because block won't be released until that time)
This behavior is inconsistent.
With this patch,
* When block is released, if 45sec (instead of 60sec) has already passed since the last
time init file is checked, init file is checked again.
* When some activity happens, main_loop is next blocked until some activity
happens or timeout, timeout is until last activity + 50sec, which
is shorter than activity + blank_timeout, because blank_timeout is more than 60sec.
Then when user stops activity, init file is checked again after 50sec (block is released),
so it is guaranteed that init file change is checked before 1min, when user may expect
blanking happens (when user changes init file so that blank should happen after 1 min).
So this behavior is consistent.
---
driver/xscreensaver.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c
index bfce5f7..24ea27c 100644
--- a/driver/xscreensaver.c
+++ b/driver/xscreensaver.c
@@ -1388,6 +1388,7 @@ main_loop (Display *dpy)
time_t last_checked_init_file = now;
Bool authenticated_p = False;
Bool ignore_motion_p = False;
+ Bool maybe_init_file_changed_p = False;
enum { UNBLANKED, BLANKED, LOCKED, AUTH } current_state = UNBLANKED;
@@ -1471,7 +1472,12 @@ main_loop (Display *dpy)
struct timeval tv;
time_t until;
switch (current_state) {
- case UNBLANKED: until = active_at + blank_timeout; break;
+ case UNBLANKED:
+ {
+ until = active_at + blank_timeout;
+ if (maybe_init_file_changed_p) until = active_at + 50;
+ break;
+ }
case BLANKED: until = blanked_at + lock_timeout; break;
default: until = 0;
}
@@ -1502,6 +1508,7 @@ main_loop (Display *dpy)
}
now = time ((time_t *) 0);
+ maybe_init_file_changed_p = False;
/********************************************************************
@@ -1566,6 +1573,7 @@ main_loop (Display *dpy)
XEvent xev;
XNextEvent (dpy, &xev);
now = time ((time_t *) 0);
+ maybe_init_file_changed_p = True;
/****************************************************************
Client Messages
@@ -1905,12 +1913,13 @@ main_loop (Display *dpy)
/* If it's time, see if the .xscreensaver file has changed, since that
might change the blank and lock timeouts.
*/
- if (now >= last_checked_init_file + 60)
+ if (now >= last_checked_init_file + 45)
{
last_checked_init_file = now;
if (verbose_p)
fprintf(stderr,"%s: checking init file\n", blurb());
read_init_files (False);
+ maybe_init_file_changed_p = False;
}
/* Now that events have been processed, see if the state should change,
--
2.31.1