#!/bin/bash # From /usr/share/doc/xss-lock/transfer-sleep-lock-i3lock.sh on Debian stretch ## CONFIGURATION ############################################################## # Options to pass to i3lock # i3-rotate-wallpaper only ever generates a wallpaper.png suitable for # a single monitor, so just ignore wallpaper.png if more than one # monitor is plugged in monitors="$(xrandr -q | grep ' connected' | wc -l)" if [ -e "$HOME/local/wallpaper.png" ] \ && ! [ $monitors -gt 1 ]; then i3lock_options="-i $HOME/local/wallpaper.png" else i3lock_options="-c 3f3f3f" fi # Run before starting the locker pre_lock() { mpc pause return } # Run after the locker exits post_lock() { return } ############################################################################### pre_lock # We set a trap to kill the locker if we get killed, then start the locker and # wait for it to exit. The waiting is not that straightforward when the locker # forks, so we use this polling only if we have a sleep lock to deal with. if [[ -e /dev/fd/${XSS_SLEEP_LOCK_FD:--1} ]]; then kill_i3lock() { pkill -xu $EUID "$@" i3lock } trap kill_i3lock TERM INT # we have to make sure the locker does not inherit a copy of the lock fd i3lock $i3lock_options {XSS_SLEEP_LOCK_FD}<&- # now close our fd (only remaining copy) to indicate we're ready to sleep exec {XSS_SLEEP_LOCK_FD}<&- while kill_i3lock -0; do sleep 0.5 done else trap 'kill %%' TERM INT i3lock -n $i3lock_options & wait fi post_lock