#!/bin/bash # Sample breaktimer's state into a cache file, for widgets/breaktimer.lua. # # Conky's Lua cannot run a process, so it cannot call `kill -0` to learn whether # the daemon is alive, and shelling out every two seconds to ask breaktimer.sh # `status` would parse prose rather than read the four small files the daemon # already writes under $XDG_RUNTIME_DIR. Those files are the whole interface; # this script is the one place that interprets them. set -u CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/udt" CACHE="$CACHE_DIR/breaktimer.txt" umask 077 mkdir -p "$CACHE_DIR" TMP="$CACHE.tmp.$$" trap 'rm -f "$TMP"' EXIT RUNTIME="${XDG_RUNTIME_DIR:-/tmp}" PID_FILE="$RUNTIME/breaktimer.pid" STATE_FILE="$RUNTIME/breaktimer.state" PHASE_FILE="$RUNTIME/breaktimer.phase" REMAIN_FILE="$RUNTIME/breaktimer.remain" # The daemon's own tick. Used only to decide how stale the remain file may be # before the clock counts as frozen. TICK=5 running=no if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE" 2>/dev/null)" 2>/dev/null; then running=yes fi state=stopped phase=stopped remain=0 if [ "$running" = yes ]; then state=$(cat "$STATE_FILE" 2>/dev/null) phase=$(cat "$PHASE_FILE" 2>/dev/null) remain=$(cat "$REMAIN_FILE" 2>/dev/null) fi [ -z "$state" ] && state=stopped [ -z "$phase" ] && phase=stopped case "$remain" in ''|*[!0-9]*) remain=0 ;; esac # Outside the work-hours window the daemon leaves the phase at 'working' without # decrementing, so the remain file stops being rewritten; its age is the honest # signal that the clock is frozen. Three ticks of slack, so a sample landing a # moment before the next tick never reads as frozen. A paused daemon freezes the # file too but reports 'paused' and is handled on its own, and a hung daemon # freezes it as well, which is a state worth showing rather than hiding. frozen=no if [ "$running" = yes ] && [ "$state" = running ] && [ "$phase" = working ] \ && [ -f "$REMAIN_FILE" ]; then mt=$(stat -c %Y "$REMAIN_FILE" 2>/dev/null || echo 0) [ $(( $(date +%s) - mt )) -gt $((TICK * 3)) ] && frozen=yes fi { echo "generated $(date +%s)" echo "running $running" echo "state $state" echo "phase $phase" echo "remain $remain" echo "frozen $frozen" } > "$TMP" mv -f "$TMP" "$CACHE"