synix/modules/home/waybar/modules/timer/timer.sh
sid ecf5132cbb
Some checks failed
Build tests / build-hosts (pull_request) Failing after 3s
Flake check / flake-check (pull_request) Failing after 13s
enforce new flake schema. formatting.
2026-05-31 18:50:41 +02:00

79 lines
1.7 KiB
Bash

#!/usr/bin/env bash
TIMER_FILE="/tmp/timer" # file to store the current time
SIGNAL=11 # signal number to send to status bar
STATUS_BAR="waybar" # Support for more status bars?
help() {
echo "Usage: $0 {start -h H -m M -s S|stop|print}"
}
start_timer() {
local hours=$1
local minutes=$2
local seconds=$3
local total_seconds=$((hours * 3600 + minutes * 60 + seconds))
(
notify-send "Timer Started" "Your countdown timer has been started."
trap "exit" INT TERM
trap 'rm -f -- "$TIMER_FILE"' EXIT
while [ $total_seconds -gt 0 ]; do
hours=$(( total_seconds / 3600 ))
minutes=$(( (total_seconds % 3600) / 60 ))
seconds=$(( total_seconds % 60 ))
printf "%02d:%02d:%02d\n" $hours $minutes $seconds > $TIMER_FILE
pkill -RTMIN+$SIGNAL $STATUS_BAR
sleep 1
total_seconds=$(( total_seconds - 1 ))
done
notify-send "Timer Finished" "Your countdown timer has ended."
stop_timer
) &
}
stop_timer() {
rm -f $TIMER_FILE
pkill -RTMIN+$SIGNAL $STATUS_BAR
exit 0
}
print_time() {
if [[ -f $TIMER_FILE ]]; then
printf " %s" "$(cat $TIMER_FILE)"
else
echo "" # waybar widget will be hidden if stdout is empty
fi
}
if [ "$1" = "start" ]; then
shift
while getopts "h:m:s:" opt; do
case $opt in
h) HOURS=$OPTARG ;;
m) MINUTES=$OPTARG ;;
s) SECONDS=$OPTARG ;;
*) echo "Invalid option"; exit 1 ;;
esac
done
HOURS=${HOURS:-0}
MINUTES=${MINUTES:-0}
SECONDS=${SECONDS:-0}
start_timer "$HOURS" "$MINUTES" "$SECONDS"
elif [ "$1" = "stop" ]; then
notify-send "Timer Stopped" "Your countdown timer has been stopped."
stop_timer
elif [ "$1" = "print" ]; then
print_time
else
echo "Invalid command $1"
help
exit 1
fi