unsaver

deactivate screensaver on joystick activity

Manual section:1
Manual group:Urchlay
Date: 2021-12-23
Version: 0.4.1

SYNOPSIS

unsaver [-i interval[s|ms]] [-m | -k keycode | -b button | -c command | -x ] [-j | -f] [-d] [joystick [joystick ...]]

DESCRIPTION

unsaver lets you play games with your joysticks/gamepads without the screen saver activating due to lack of keyboard/mouse input. It also prevents the screensaver from activating when a fullscreen window is in use (e.g. while watching a movie).

unsaver should be started from your .xinitrc or whatever X startup script your window manager or desktop environment uses. By default, it will exit when the X server does. There's no PID file: use "pkill unsaver" if you need to kill the daemon.

Every interval milliseconds (250, or whatever -i is set to), unsaver checks to see if there's been any activity on any of the josticks, or if a fullscreen window exists. If so, it deactivates the screensaver by sending a keystroke, clicking a mouse button, moving the mouse, or executing a command (see "Monitoring Options", below).

Multiple joystick devices can be monitored. By default, unsaver monitors up to 16 joysticks. These devices don't have to actually exist: they can come and go as joysticks are plugged in and unplugged. See JOYSTICK DEVICES if the defaults don't work for you.

OPTIONS

With no options, the default interval is 250ms, the deactivation mode is to send an otherwise-unused keycode, and both joystick and fullscreen monitoring is enabled.

A space is required between an option and its argument, as shown above. Use e.g. -i 300, not -i300.

General options

--help Print usage summary and exit.
-d Debug mode: run in foreground and print verbose messages.

Monitoring options

-i <interval> Interval to check for activity. Can be given in seconds with s suffix (e.g. 1s), or milliseconds with m (e.g. 200m). If just a number is given, it's assumed to be in seconds if it's under 100, otherwise it's treated as milliseconds. Default: 250m.
-j Only monitor joysticks; don't try to detect fullscreen windows. -j and -f are mutually exclusive.
-f Only detect fullscreen windows; don't monitor joysticks. -j and -f are mutually exclusive. Note that joysticks are ignored with -f.

Deactivation mode options

Only one of -k/-b/-m/-c/-x is accepted.

-k <keycode> Send this keycode when activity is detected. Default (with no -k/-b/-m/-c/-x options) is to search the keymap for an unused code. If you set this manually, it should be a keycode that doesn't map to a keysym in your usual keymapping (use "xmodmap -pk" to find one).
-b <button> Send a click of this button when activity is detected, rather than a keystroke. Should be a button that applications don't normally respond to (6 or higher), but in some environments, the window manager responds to all the 'extra' buttons as though they were button 1.
-m Send mouse movements rather than a keystroke. This will move the pointer 10 pixels to the right and down, then 10 pixels to the left and up, then warp the pointer back to its starting point.
-c <command> Run a command when activity is detected, rather than sending a fake keystroke/click/motion. It's recommended to set interval to at least 1 second when using this option, to avoid excess process-spawning overhead.
-x Same as -c "xscreensaver-command -deactivate" -i 1s.

NOTES

unsaver was tested with xlock(1), xscreensaver(1), and the built-in Xorg screensaver (see xset(1)). All 4 modes (keycode, mouse click, mouse motion, command execution) work with xscreensaver. xlock doesn't have a disable command nor respond to mouse motion, so use the keycode or click modes with it. The "xset s" screen-blanker works with keycodes, mouse clicks, and mouse motion. I didn't test with gnome-screensaver, sorry.

unsaver can monitor up to MAX_STICKS joysticks. This is a compile time constant, normally set to 16. See the --help output to find out the compiled-in default.

If the screensaver is configured to lock the screen, and it has already done so, unsaver can't magically type your password for you.

unsaver depends on the XTest extension being present in the X server. If you get a "X server doesn't support XTest extension" error, see your X server documentation to find out how to enable XTest.

The fullscreen window monitoring has only been tested on a system with a single monitor, and may not work properly in multi-head environments.

JOYSTICK DEVICES

It's recommended to let unsaver find the joysticks itself. However, you can pass one or more joystick numbers if the default doesn't do the right thing for you. Remember that the first joystick is numbered 0, not 1.

One reason to manually set the joystick list might be that your 2nd joystick is rarely used, and your cat likes to play with it. To monitor only one device, you can say unsaver 0.

When you manually set the list of devices, unsaver will only detect hotplug events on the devices you gave it. If you plug in more joysticks, they won't be monitored.

None of the joystick devices (whether autodetected or not) has to actually exist when unsaver starts up, although their directory does have to exist. This means unsaver can detect hotplug events, but you have to be careful not to typo the device names.

If your system doesn't keep its joystick device nodes in /dev/input, and/or if they're not named "js<num>", see ENVIRONMENT for a way to override the default names.

ENVIRONMENT

UNSAVER_JS_DIR
Path to joystick device nodes. If your OS keeps them somewhere besides "/dev/input", set this variable.
UNSAVER_JS_NODE
Base name for joystick device nodes. "js" by default. Don't set this to "event", unsaver doesn't speak the full Linux event protocol.

EXIT STATUS

Without the -d option, the exit status is 0 (success) if unsaver successfully forked into the background.

A non-zero exit status means an error in the command line arguments, or else fork() failed. No daemon will be running in this case.

With the -d option, unsaver never exits until it's killed.

BUGS

There's no way to distinguish between an invalid device number and a device number that doesn't happen to exist yet because its device hasn't been plugged in yet. Try to avoid typos, if you really have to use device numbers (it's better to autodetect).

Normally once daemonized, unsaver is very robust. However, if something does go wrong, there's no way to find out what. Probably there should be a log file, or use syslog (or is that overkill?). The best you can do for now is run it with -d and maybe redirect stderr to a log file.

It should be (but currently isn't) possible to at least work in mouse-motion mode even without the XTest extension, via XWarpPointer().

unsaver isn't portable. It only works on Linux, at least for now, for three reasons:

  • It uses the Linux joystick API.
  • It uses inotify(7) to detect joystick hotplug events.
  • I haven't even looked at other OSes to see if it would be possible to port the code.

LICENSE

unsaver is released under the WTFPL: Do WTF you want with this.

AUTHOR

unsaver was written by B. Watson <yalhcru@gmail.com>.

SEE ALSO

jstest(1), jscal(1), sdl-jstest(1), sdl2-jstest(2), xscreensaver(1), xautolock(1), xlock(1), xset(1)