mirror of https://gitlab.com/dabruh/dotfiles.git
Trigger i3lock by udev rules.
This commit is contained in:
parent
85e0390f72
commit
039fbb1700
|
@ -0,0 +1,109 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# i3hwlock
|
||||||
|
#
|
||||||
|
# Allows locking i3 by the presence of a file. This file is intended to be
|
||||||
|
# created using udev rules so that you can trigger the lock when you remove
|
||||||
|
# a device such as a YubiKey. Example rule below.
|
||||||
|
#
|
||||||
|
# /etc/udev/rules.d/99-i3hwlock-yubikey.rules:
|
||||||
|
# ACTION=="add", SUBSYSTEM=="input", ENV{ID_VENDOR_ID}=="1050", RUN+="/usr/bin/rm /tmp/i3hwlock.trigger"
|
||||||
|
# ACTION=="remove", SUBSYSTEM=="input", ENV{ID_VENDOR_ID}=="1050", RUN+="/usr/bin/touch /tmp/i3hwlock.trigger"
|
||||||
|
|
||||||
|
LOCK_TIMEOUT=3 # How many seconds to wait before locking.
|
||||||
|
DMENU_FILE="/tmp/i3hwlock"
|
||||||
|
TRIGGER_FILE="$DMENU_FILE.trigger"
|
||||||
|
ABORT_FILE="$DMENU_FILE.abort"
|
||||||
|
CONTINUE_FILE="$DMENU_FILE.continue"
|
||||||
|
LOCKING_FILE="$DMENU_FILE.locking"
|
||||||
|
|
||||||
|
function check_prerequisites() {
|
||||||
|
[ -e "$ABORT_FILE" ] && rm "$ABORT_FILE"
|
||||||
|
|
||||||
|
if ! which inotifywait >/dev/null; then
|
||||||
|
echo "ERROR: inotifywait not found." 1>&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function dmenu_selection() {
|
||||||
|
selection="$(xargs -n 1 <<<"Continue Abort" | dmenu -i -p "The screen is about to lock")"
|
||||||
|
[ -z "$selection" ] && return
|
||||||
|
file="$DMENU_FILE.${selection,,}"
|
||||||
|
echo "INFO: Touching $file"
|
||||||
|
touch "$file"
|
||||||
|
}
|
||||||
|
|
||||||
|
function abort_lock() {
|
||||||
|
[ -e "$ABORT_FILE" ] && rm "$ABORT_FILE"
|
||||||
|
|
||||||
|
if ! [ -f "$LOCKING_FILE" ]; then
|
||||||
|
echo "WARN: Abort initiated without file '$LOCKING_FILE'." 1>&2
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "INFO: Aborting lock."
|
||||||
|
killall dmenu
|
||||||
|
notify-send "Lock aborted." &
|
||||||
|
[ -e $LOCKING_FILE ] && rm "$LOCKING_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
function lock() {
|
||||||
|
[ -e "$CONTINUE_FILE" ] && rm "$CONTINUE_FILE"
|
||||||
|
|
||||||
|
if ! [ -f "$LOCKING_FILE" ]; then
|
||||||
|
echo "WARN: Won't lock as file '$LOCKING_FILE' is missing." 1>&2
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "INFO: Locking now."
|
||||||
|
killall dmenu
|
||||||
|
i3exit lock 2>/dev/null || i3lock --color=29414f --nofork
|
||||||
|
[ -e $LOCKING_FILE ] && rm "$LOCKING_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
function delayed_lock() {
|
||||||
|
echo "INFO: Delayed lock initiated."
|
||||||
|
touch "$DMENU_FILE.locking"
|
||||||
|
|
||||||
|
for i in $(seq $LOCK_TIMEOUT); do
|
||||||
|
notify-send "Locking in $((LOCK_TIMEOUT - i + 1))" -t 1000 &
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
if [ -e "$ABORT_FILE" ]; then
|
||||||
|
abort_lock
|
||||||
|
return 0
|
||||||
|
elif [ -e "$CONTINUE_FILE" ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
! [ -e $LOCKING_FILE ] && return 0
|
||||||
|
lock
|
||||||
|
}
|
||||||
|
|
||||||
|
function listen() {
|
||||||
|
while read -r directory action file; do
|
||||||
|
if [[ "$file" == "${TRIGGER_FILE##*/}" ]]; then
|
||||||
|
if [[ "$action" == "CLOSE_WRITE,CLOSE" ]] && ! [ -e "$LOCKING_FILE" ]; then
|
||||||
|
$0 dmenu-selection &
|
||||||
|
$0 delayed-lock &
|
||||||
|
elif [[ "$action" == "DELETE" ]]; then
|
||||||
|
abort_lock
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done < <(inotifywait -m "${TRIGGER_FILE%/*}")
|
||||||
|
}
|
||||||
|
|
||||||
|
check_prerequisites || exit 1
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
listen || exit 2
|
||||||
|
elif [[ "$1" == delayed-lock ]]; then
|
||||||
|
delayed_lock || exit 3
|
||||||
|
elif [[ "$1" == dmenu-selection ]]; then
|
||||||
|
dmenu_selection || exit 4
|
||||||
|
else
|
||||||
|
echo "ERROR: Unrecognized action: '$1'." 1>&2
|
||||||
|
exit 127
|
||||||
|
fi
|
Loading…
Reference in New Issue