diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-25 19:02:35 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-25 19:02:35 +0200 |
| commit | 8f99f1650e4a7363af1d83190b4082fb72a9f73f (patch) | |
| tree | 86ed3b714c376e95f98d33d7572e76d6b43f06d3 /patches/ttym-persist-alert-2.0.diff | |
| parent | 2f6b29abd0d766ef477eb29c5a7bf6c1e88e9630 (diff) | |
| download | ttym-8f99f1650e4a7363af1d83190b4082fb72a9f73f.tar.gz ttym-8f99f1650e4a7363af1d83190b4082fb72a9f73f.zip | |
ttym 3.0: fix terminal and config bugs, fold terminal-only patches into base
Correctness fixes:
- restore the terminal on SIGQUIT and SIGHUP. atexit never runs on an
uncaught fatal signal, so Ctrl+\ left the cursor hidden and autowrap
disabled.
- drop the unconditional newline in restore_tty. Every run emitted a
stray blank line, including piped output.
- treat EINTR as an interruption rather than a poll() failure, which
delayed Ctrl+C by up to one 100ms frame.
config-file patch:
- make comment stripping quote-aware so a value may contain '#', and
strip one matched pair of quotes. bar_fill = "#" was silently dropped,
despite '#' being the glyph of the hash style this build ships.
- resolve bar_fill/bar_empty inside resolve_bar and clear them on --bar,
so command-line flags beat the config file as documented. Previously
config glyphs silently overrode --bar.
- report unknown keys, unparseable booleans and malformed lines on
stderr. flash = enabled silently meant off.
- never write to disk. --dump-config prints a commented template on
stdout instead of the binary creating ~/.config/ttym/config on first
run.
Patch set:
- fold persist-alert, flash and bar-styles into the base. The base is
now terminal-only: it opens /dev/tty, draws and exits, with no file
writes and no subprocesses. Everything still in patches/ changes what
the program touches.
- seven patches become four; config-file's prerequisites drop from six
patches to one (notify), so it is regenerable mechanically.
- regenerate every patch. All apply with zero fuzz and compile.
Source:
- rewrite argv in place rather than into a malloc'd copy (C99
5.1.2.2.1), removing die(), four free() calls and <stdarg.h>.
- fold the duplicated elapsed-time expression into elapsed().
- drop dead code: have_any, (void)cfg, and an unreachable branch in
parse_duration.
- replace hand-counted padding with \033[K.
Docs and build:
- timer.1: -c is the third hook argument, not the fourth. Add EXIT
STATUS (a stopwatch always exits 130 -- it has no natural end) and
ENVIRONMENT. Document config precedence and quoting.
- wire VERSION into a dist target; it was defined and never used.
- track .gitignore, which previously ignored itself, so a fresh clone
had no ignore rules.
Claude-Session: https://claude.ai/code/session_01APLBs8RB1FcUaC4viVkzbP
Diffstat (limited to 'patches/ttym-persist-alert-2.0.diff')
| -rw-r--r-- | patches/ttym-persist-alert-2.0.diff | 111 |
1 files changed, 0 insertions, 111 deletions
diff --git a/patches/ttym-persist-alert-2.0.diff b/patches/ttym-persist-alert-2.0.diff deleted file mode 100644 index 7e9d64b..0000000 --- a/patches/ttym-persist-alert-2.0.diff +++ /dev/null @@ -1,111 +0,0 @@ -diff -ruN a/config.def.h b/config.def.h ---- a/config.def.h 2026-05-20 11:57:26.574344832 +0200 -+++ b/config.def.h 2026-05-20 11:57:26.578344915 +0200 -@@ -3,3 +3,9 @@ - /* progress bar glyphs (ASCII default) */ - static const char *const BAR_FILL = ">"; - static const char *const BAR_EMPTY = "-"; -+ -+/* persistent alert: keep ringing the bell until any key is pressed. -+ * Foreground-only; backgrounded runs always fall through. -+ * Override per-run with --no-persist. -+ */ -+static const int ALERT_PERSIST = 1; -diff -ruN a/ttym.c b/ttym.c ---- a/ttym.c 2026-05-20 11:57:26.574344832 +0200 -+++ b/ttym.c 2026-05-20 11:57:26.578344915 +0200 -@@ -23,6 +23,7 @@ - typedef struct { - int quiet; /* -q: suppress completion bell */ - int silent; /* -s: no bell, no extras */ -+ int alert_persist; /* alert loop until keypress; --no-persist disables */ - } Config; - - static struct termios oldtios; -@@ -226,6 +227,48 @@ - fflush(stdout); - } - -+/* ===== alert loop ===== -+ * Bell + poll for keypress, ~1.5s per beat; 4-min safety cap. -+ */ -+ -+static int -+is_foreground(void) -+{ -+ if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO)) return 0; -+ pid_t pgrp = tcgetpgrp(STDIN_FILENO); -+ if (pgrp < 0) return 0; -+ return pgrp == getpgrp(); -+} -+ -+static void -+alert_loop(void) -+{ -+ fputs("\033[?25h\033[?7h", stdout); -+ int ticks = 0; -+ while (!interrupted) { -+ fputc('\a', stdout); -+ fflush(stdout); -+ sleep_ms(150); -+ -+ int acked = 0; -+ for (int i = 0; i < 15 && !interrupted; i++) { -+ if (ttyfd < 0) { sleep_ms(100); continue; } -+ struct pollfd pfd = { .fd = ttyfd, .events = POLLIN }; -+ int pr = poll(&pfd, 1, 100); -+ if (pr > 0 && (pfd.revents & POLLIN)) { -+ char ch; -+ ssize_t rd = read(ttyfd, &ch, 1); -+ if (rd >= 0) { acked = 1; break; } -+ } else if (pr < 0) { -+ sleep_ms(100); -+ } -+ } -+ if (acked) break; -+ if (++ticks > 160) break; -+ } -+ fflush(stdout); -+} -+ - /* ===== usage ===== - * Patches MUST update this in lockstep with new flags so -h always - * reflects the build. -@@ -243,6 +286,7 @@ - "FLAGS:\n" - " -q no sound\n" - " -s silent\n" -+" --no-persist skip alert-until-keypress loop\n" - " -- end of options\n" - " -h help\n" - "\n" -@@ -375,6 +419,10 @@ - fflush(stdout); - sleep_ms(50); - } -+ if (!cfg->silent && cfg->alert_persist && is_foreground()) { -+ interrupted = 0; -+ alert_loop(); -+ } - } - - (void)cfg; -@@ -387,6 +435,7 @@ - main(int argc, char **argv) - { - Config cfg = {0}; -+ cfg.alert_persist = ALERT_PERSIST; - - /* Pre-strip long-form flags before getopt. Stop at "--". */ - int new_argc = 0; -@@ -399,6 +448,10 @@ - new_argv[new_argc++] = argv[i]; - continue; - } -+ if (!past_dd && !strcmp(argv[i], "--no-persist")) { -+ cfg.alert_persist = 0; -+ continue; -+ } - new_argv[new_argc++] = argv[i]; - } - new_argv[new_argc] = NULL; |
