dotfiles/.local/bin/dclock

93 lines
2.3 KiB
Bash
Executable File

#!/bin/bash
ScriptName=${0##*/}
TimerPIDFile="/tmp/dclock.pids"
# MenuItems
AddTimer="1. Add timer"
RemTimer="2. Remove timer"
ListTimers="3. List timers"
StartStopWatch="4. Start Stopwatch"
StopStopWatch="5. Stop Stopwatch"
ListStopWatch="6. Show Stopwatch"
ResetStopWatch="7. Reset Stopwatch"
_pid_file_cleanup() {
# Get timer PIDs
readarray -t timer_PIDs < $TimerPIDFile
[ "${timer_PIDs[0]}" = "" ] && return 1
# Remove no longer present timers
for PID in "${timer_PIDs[@]}"
do
[ "$(ps -p "$picked_PID" -o comm=)" = "" ] \
&& timer_PIDs=("${timer_PIDs[@]/$PID}")
done
# Save new PIDs
touch $TimerPIDFile
echo ${timer_PIDs[@]} > $TimerPIDFile
}
_timer_add() {
sleep $1 &
# Save pid
PID=$!
echo $PID >> $TimerPIDFile
notify-send "$ScriptName" "Added timer with duration: $duration, with \
PID: $PID"
}
_timer_remove() {
# Get timer PIDs
readarray -t timer_PIDs < $TimerPIDFile
# Get timers as menuitem
declare -a timers_duration
declare -a timers_took
declare -a timers
for PID in "${timer_PIDs[@]}"
do
sleep_duration=$(ps -o cmd= -fp $PID | sed 's/^sleep //' -)
durations+=($sleep_duration)
sleeped_duration=$(ps -o lstart= -p $PID \
| sed 's/^sleep //' -)
timers+="$PID timer $sleep_duration out of $sleep_duration"
done
# Prompt user to pick
picked_PID=$(echo ${timers[@]} \
| dmenu -i -l 10 -p "Pick timer to delete:" \
| awk 'BEGIN {FS=" "} ; {print $1}')
# Kill sleep process
[ "$(ps -p "$picked_PID" -o comm=)" = "sleep" ] && kill -9 $(awk '{print $1}')
# Check and notify if timer still active
[ "$(ps -p "$picked_PID" -o comm=)" = "sleep" ] \
&& notify-send "$ScriptName" "Failed to stop timer with PID: $picked_PID" && exit
# Remove unset PIDs from $TimerPIDFile
_pid_file_cleanup
notify-send "$ScriptName" "Stopped timer with PID: $picked_PID"
}
_pid_file_cleanup
ChosenMenu=$(printf '**Timers\n%s\n%s\n%s\n**Stopwatch\n%s\n%s\n%s\n%s' \
"$AddTimer" "$RemTimer" "$ListTimers" \
"$StartStopWatch" "$StopStopWatch" "$ListStopWatch" "$ResetStopWatch" \
| dmenu -i -l 7 -p "$ScriptName")
if [ "$ChosenMenu" = "$AddTimer" ]; then
duration=$(printf "h = hours\nm = minutes\ns = seconds" \
| dmenu -i -l 3 -p \ "Timer Duration:")
_timer_add $duration
elif [ "$ChosenMenu" = "$RemTimer" ]; then
_timer_remove
fi