Skip to content
Rust Nix
Branch: master
Clone or download
Latest commit f66e701 Aug 21, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src Switch from unsafe Xlib API to **safe** Xcb API :) Jul 22, 2019
.envrc Reap zombie processes Apr 28, 2019
.gitignore git: ignore target as a symlink Feb 2, 2018
Cargo.lock Switch from unsafe Xlib API to **safe** Xcb API :) Jul 22, 2019
Cargo.toml Switch from unsafe Xlib API to **safe** Xcb API :) Jul 22, 2019
LICENSE License Feb 2, 2018
README.md Update README Mar 26, 2019
shell.nix Fix shell.nix Aug 21, 2019

README.md

xidlehook

Because xautolock is annoying to work with.

xidlehook is a general-purpose replacement for xautolock. It executes a command when the computer has been idle for a specified amount of time.

Improvements over xautolock:

  • Allows "cancellers" which can undo a timer action when new user activity is detected.
  • Unlimited amount of timers (provided necessary resources).
  • Not specific to locking.
  • Multiple instances can run at the same time.
  • Optionally only run once.
  • Optionally prevent locking when an application is fullscreen.
  • Optionally prevent locking when any application plays audio.

Missing features:

  • Magic corners.
  • All the instance related stuff (you should use unix sockets with --socket).

Example

Here's a lock using i3lock, with screen dim support:

#!/usr/env/bin bash

# Only exported variables can be used within the timer's command.
export PRIMARY_DISPLAY="$(xrandr | awk '/ primary/{print $1}')"

# Run xidlehook
xidlehook \
  `# Don't lock when there's a fullscreen application` \
  --not-when-fullscreen \
  `# Don't lock when there's audio playing` \
  --not-when-audio \
  `# Dim the screen after 60 seconds, undim if user becomes active` \
  --timer normal 60 \
    'xrandr --output "$PRIMARY_DISPLAY" --brightness .1' \
    'xrandr --output "$PRIMARY_DISPLAY" --brightness 1' \
  `# Undim & lock after 10 more seconds` \
  --timer primary 10 \
    'xrandr --output "$PRIMARY_DISPLAY" --brightness 1; i3lock' \
    '' \
  `# Finally, suspend an hour after it locks` \
  --timer normal 3600 \
    'systemctl suspend' \
    ''

Note: Every command is passed through sh -c, so you should be able to mostly use normal syntax.

Installation

Installation using cargo:

cargo install xidlehook

Xidlehook with the default settings requires libXScrnSaver (or libxss) and libpulseaudio. On debian/ubuntu, don't forget to install the -dev versions, also.

It's also available on Nix and the AUR (not officially maintained).

Or if you want to clone it manually:

git clone https://gitlab.com/jD91mZM2/xidlehook
cd xidlehook
cargo build --release

Too bloaty?

Not using pulseaudio?
Disable that requirement completely with --no-default-features!
This, however, will get rid of the --not-when-audio option.

Socket API

The socket API is very simple. Each command is a single byte, sent over a unix socket. Bind a file using --socket /path/to/xidlehook.sock (where the path is whatever you want), and then you can send one of the following bytes:

Byte Command
0 Deactivate
1 Activate
2 Run the timer command immediately

For convenience, there is now an xidlehook-client (see #18), which will communicate with this API for you. See

xidlehook-client --help

for details.

A common use case of xidlehook is using it to run a lockscreen. To then manually lock the screen, you could bind this bash command to a shortcut:

xidlehook-client --trigger --socket /path/to/xidlehook.sock

Alternatively, you can use the API directly using, for example, socat:

echo -ne "\x0" | socat - UNIX-CONNECT:/path/to/xidlehook.sock

(You have no reason to run this for the most cases anymore)

You can’t perform that action at this time.