#!/usr/bin/env zsh zmodload zsh/datetime zmodload zsh/mathfunc setopt typeset_silent local TIMES=(forever 1m 5m 10m 15m 30m 1h 2h 4h 1d) local -a running_locks () { local IFS=$'\n ' running_locks=(${="$("${HOME}/scripts/cl/bin/list-manual-sleep-locks")"}) } let base_time=${EPOCHSECONDS} for ((i = 2; i <= ${#running_locks}; i+=2)); do local nsecs="${running_locks[i]}" if [[ "${nsecs}" == infinity ]]; then running_locks[i]="next reboot" else running_locks[i]=$(strftime -n '%H:%M:%S %b %-e' \ $(( base_time + nsecs ))) fi done function is_valid_sleep_time() { [[ "${1}" = forever ]] \ || [[ "${1}" = infinity ]] \ || [[ "${1}" =~ ' *([0-9]+[smhd]? *)+' ]] } if (( ${#running_locks} )); then # We have existing locks local prompt plural_s if (( ${#running_locks} > 2 )); then let count_locks=$(( int(${#running_locks} / 2) )) prompt="Locked by ${count_locks} locks until ${running_locks[2]}> " plural_s='s' else prompt="Locked until ${running_locks[2]}> " fi local choice choice="$(printf "Cancel lock${plural_s}\n" \ | fuzzel --dmenu --only-match --index -p "${prompt}")" if (( ${?} == 0 )) && (( ${choice} == 0 )); then systemctl --user stop 'manual-inhibit-sleep@*.service' fi else # No locks local choice choice="$(printf '%s\n' ${TIMES} | fuzzel -d -p "Inhibit sleep for> ")" if (( ${?} )); then exit elif is_valid_sleep_time "${choice}"; then [[ "${choice}" == forever ]] && choice=infinity local unit="$(systemd-escape --template=manual-inhibit-sleep@.service \ "${choice}")" systemctl --user start "${unit}" else printf 'Invalid sleep time: %s\n' "${choice}" 1>&2 fi fi