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!