unsaver

deactivate screensaver on joystick activity

Manual section:1
Manual group:Urchlay
Date: 2020-05-20
Version: 0.3.0

SYNOPSIS

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

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 devices it's monitoring. If so, it sends a fake mouse movement, keystroke, or mouse button click, which the screen saver will see as activity.

Multiple joystick devices can be monitored. By default, unsaver monitors up to 16 devices, named /dev/input/js0 through js15. 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

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 joydevs 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 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.

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

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 device names (or just numbers) if the default doesn't do the right thing for you.

If you do use them, the joydev arguments can be one of 3 things:

  • The first argument can optionally be a directory, which must exist. The default is "/dev/input". unsaver will look for joystick devices here. If there are no more joydev arguments, unsaver will monitor devices and detect hotplug events on devices js0 through js15 in this directory.
  • One or more numbers. unsaver will prepend the directory and "js" to each number, and monitor that device. Hotplug events will be detected only for the specified devices. You could use this e.g. to not monitor your 2nd joystick, because it sometimes drifts and reports false events.
  • One or more device nodes (e.g. js0). Use relative paths here (relative to the directory argument or "/dev/input"). This option only exists for future-proofing (in case the js name changes someday). Hotplug events will be detected only for the specified devices.

None of the joystick devices (whether autodetected, named, or numbered) 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.

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 name and a device name 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 names (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?).

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

I really need to use the XKB extension rather than the old & deprecated Xlib keyboard API. This mainly affects the default "find an unused keycode" mode.

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)