To learn more about Debian and Linux in general I'm selecting utilities at random from my PATH using the command below, learning what they do and writing a blog post about it. Previously: Part 1, Part 2, Part 3
$ (for folder in `echo $PATH | sed "s/:/\\n/g"`; do ls -1 $folder; done; ) | shuf -n 1 | xargs man
Today's utility is xssstate, which lets your check the status of X window system's screensaver. It's written by the suckless guys, who've created a number of very good tools, such as surf (a minimalist web browser) and dmenu (autocompleting program launcher), both of which I use regularly.
The utility itself is pretty simple, there are only four command line switches including -v, so this will be pretty short post. First we can check if the screensaver is currently enabled using -t switch:
$ xssstate -s
off
Obviously the screensaver is off, since I am actively using this computer - however if the screensaver was active it'd print "on" and if it was disabled altogether you'd see "disabled".
To check the time idle in milliseconds, use the -i switch:
$ xssstate -i
2
$ sleep 5 && xssstate -i
4947
And to get time in milliseconds until the screensaver activates, invoke it with -t:
$ xssstate -t
599998
$ sleep 10 && xssstate -t
590052
The way the utility does this is by using some functionality provided by a X11 library, wrapped in a handful of switch statements (they have their own neat little github-style source browser if you want to check out xssstate.c in its entirety):
// ...
info = XScreenSaverAllocInfo();
XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info);
if (showstate) {
switch(info->state) {
case ScreenSaverOn:
printf("on\n");
break;
case ScreenSaverOff:
printf("off\n");
break;
case ScreenSaverDisabled:
printf("disabled\n");
break;
}
} else if (showtill) {
switch(info->state) {
case ScreenSaverOn:
printf("0\n");
break;
case ScreenSaverOff:
printf("%lu\n", info->til_or_since);
break;
case ScreenSaverDisabled:
printf("-1\n");
break;
}
} else if (showidle) {
printf("%lu\n", info->idle);
}
// ...
When I do these articles I like to show some practical real-life usage of the utility - in this case I decided to add a little timer to my xmobar showing how long my computer had been idle. To this I added a Run Com entry to my xmobarrc:
-- also stick %xssstate% into the template
Run Com "xssstate" [ "-t" ] "xssstate" 10,
This ends up showing with something like the below - apologies for shaky-cam!