summaryrefslogtreecommitdiff
path: root/bin/i3-startup-i3lock-inner
blob: 02c59c90006f27b33a672cf9b7f2160a2c7161f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/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