ttym patches ============ Each patch is a unified diff against the pristine base. Apply with: cd ttym patch -p1 < patches/ttym--3.0.diff Then rebuild: rm -f config.h ; make To get every feature at once, skip the individual patches entirely and apply ttym-full-3.0.diff -- one combined diff, no conflicts to resolve. See "The full build" below. What is in the base ------------------- The base build is terminal-only: it opens /dev/tty, draws, and exits. It does not write files, spawn processes or depend on anything outside libc. That includes the progress-bar styles, the alert loop and the terminal flash, which were separate patches through 2.0: - countdown and stopwatch, pause/resume, quit - progress bar with eight built-in styles (--bar, BAR_STYLE) - alert-until-keypress on completion (--no-persist, ALERT_PERSIST) - reverse-video flash during that alert (--flash, FLASH) Every remaining patch changes what the program *touches* -- the filesystem, subprocesses, or external binaries. That is the line the split is drawn on. The full build -------------- ttym-full-3.0.diff Every feature in a single patch: notify, logging, hooks and config-file, with all inter-patch conflicts already resolved. Apply it to the pristine base and rebuild: patch -p1 < patches/ttym-full-3.0.diff rm -f config.h ; make This is the recommended route to the full-featured build. It is equivalent to stacking the four feature patches below and hand- resolving every collision, but deterministic and conflict-free. Use the individual patches only when you want a specific subset. Available patches ----------------- ttym-notify-3.0.diff One-shot desktop notification and sound on countdown completion, plus a MESSAGE positional argument piped through {title}/{msg} placeholders. Spawns notify-send and a sound player. Adds: TITLE, NOTIFY_CMD, SOUND_CMD knobs. ttym-logging-3.0.diff TSV log at ~/.config/ttym/ttym.log, +tag extraction, the -r reader (-n, --raw), and --stats (today|week|month|all). Adds one-shot directory migration from ~/.config/timer/. Adds: -c TEXT flag. ttym-hooks-3.0.diff Optional executables at ~/.config/ttym/hooks/{on_start,on_done, on_quit} invoked with: mode duration_seconds comment. Adds: -c TEXT flag (passed as 3rd hook arg). ttym-config-file-3.0.diff [requires notify] Runtime config read from /etc/ttym.conf, then ~/.config/ttym/config (key = value). Exposes eight keys: bar_fill, bar_empty, bar_style, flash, alert_persist, title, notify_cmd, sound_cmd. Unknown keys and unparseable values are reported on stderr. Nothing is written to disk: --dump-config prints a commented template on stdout, so a user does timer --dump-config > ~/.config/ttym/config It needs notify only for the title / notify_cmd / sound_cmd keys; the bar and alert keys it exposes now live in the base. Dependencies ------------ config-file requires notify. Everything else is independent of the base and of each other. Stacking -------- The simplest route to the full build is ttym-full-3.0.diff (see "The full build" above). The notes here apply only when stacking the feature patches by hand to assemble a subset. Every patch in this directory applies and compiles cleanly against the pristine base -- except config-file, which builds on notify. Combining multiple optional patches will produce conflicts at shared regions: the Config struct, usage(), the getopt() option string, and in some cases #include lines. This is normal suckless territory -- resolve by hand, or apply ttym-full-3.0.diff instead. Two known collisions when stacking logging with hooks: both own the -c flag, so keep one Config member and one usage() line for it. Recommended order when stacking: notify -> logging -> hooks -> config-file config-file must come last -- it overrides the resolved bar glyphs and extends usage() with lines the other patches also touch. Apply, resolve any .rej files, rebuild. Authoring new patches --------------------- Match the discipline used here: - Add compile-time knobs to config.def.h, never inline in ttym.c. - Update usage() in the same hunk as the option parser change, so `timer -h` never drifts from what the build actually supports. - Verify with `patch -p1` against a fresh copy of the base -- or, for a patch with prerequisites, the base plus those -- and confirm the result compiles before publishing. - When the patch set changes, regenerate ttym-full-3.0.diff so the one-shot full build stays in sync.