On Fri, Jun 13, 2025 at 01:42:24PM +0100, Laurence Tratt wrote: > As of some time early this week, I noticed that my xidle screensaver > command is not running. [It may have happened before that, but if so I > didn't notice.]
I don't normally use xidle, but it works here with: xidle -no -program /usr/X11R6/bin/xclock -timeout 5 with both cwm and fvwm > > If I hack xidle to turn on `DEBUG` it doesn't notice that the timeout > has been met, sitting there forever without running `program`: > > ``` > $ make && ./xidle -no -program "/usr/bin/touch /tmp/t" -timeout 5 > cc -O2 -pipe -Wall -MD -MP -I/usr/X11R6/include -c xidle.c > cc -o xidle xidle.o -L/usr/X11R6/lib -lXss -lXext -lX11 -lxcb -lXau -lXdmcp > Area: 2 > Delay: 2 > Position: 16 > Timeout: 5 > Program: "/usr/bin/touch" > ``` > > However, if I send it `SIGUSR1` it wakes up: > > ``` > got event 33 > ``` > > and runs the command. > > So either xidle isn't tell X it wants to be woken up (and that part of > xidle's code hasn't changed in years), or X isn't sending it the wake up > event. > > Running this C program in a loop confirms that the idle time is being > incremented/reset correctly: > > ``` > #include <stdio.h> > #include <X11/Xlib.h> > #include <X11/extensions/scrnsaver.h> > void main() { > Display *d = XOpenDisplay(""); > XScreenSaverInfo inf; > if (XScreenSaverQueryInfo(d, DefaultRootWindow(display), &inf)) > printf("%f\n", inf.idle / 1000.0); > XCloseDisplay(display); > } > ``` > > so it seems that XScreenSaver does have the right information. > > FWIW, I had to make a patch against `xidle` for its DEBUG output to work > correctly (without this, the DEBUG output always goes to /dev/pull). > diff at the end of this email. > > > Laurie > > > diff --git app/xidle/xidle.c app/xidle/xidle.c > index 623ca784a..c302d710a 100644 > --- app/xidle/xidle.c > +++ app/xidle/xidle.c > @@ -327,7 +331,9 @@ main(int argc, char **argv) > char *args[10]; > int area = 2, delay = 2, timeout = 0; > int position = north|west; > +#ifndef DEBUG > int fd; > +#endif > u_long last_serial = 0; > > parse_opts(argc, argv, &x.dpy, &area, &delay, &timeout, > @@ -345,6 +351,7 @@ main(int argc, char **argv) > signal(SIGTERM, handler); > signal(SIGUSR1, handler); > > +#ifndef DEBUG > fd = open(_PATH_DEVNULL, O_RDWR); > if (fd < 0) > err(1, _PATH_DEVNULL); > @@ -353,6 +360,7 @@ main(int argc, char **argv) > dup2(fd, STDERR_FILENO); > if (fd > 2) > close(fd); > +#endif > > if (pledge("stdio proc exec", NULL) == -1) > err(1, "pledge"); > >