diff -ruN a/config.def.h b/config.def.h --- a/config.def.h 2026-05-20 12:14:52.639963552 +0200 +++ b/config.def.h 2026-05-20 12:14:52.639963552 +0200 @@ -9,3 +9,8 @@ * Override per-run with --no-persist. */ static const int ALERT_PERSIST = 1; + +/* reverse-video flash during the alert loop. + * Override per-run with --flash on|off. + */ +static const int FLASH = 1; diff -ruN a/ttym.c b/ttym.c --- a/ttym.c 2026-05-20 12:14:52.639963552 +0200 +++ b/ttym.c 2026-05-20 12:17:37.203364538 +0200 @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -24,6 +25,7 @@ int quiet; /* -q: suppress completion bell */ int silent; /* -s: no bell, no extras */ int alert_persist; /* alert loop until keypress; --no-persist disables */ + int flash; /* reverse-video flash during alert loop */ } Config; static struct termios oldtios; @@ -81,6 +83,13 @@ interrupted = 1; } +static int +parse_bool_str(const char *v) +{ + return !strcasecmp(v, "true") || !strcasecmp(v, "yes") || + !strcmp(v, "1") || !strcasecmp(v, "on"); +} + static void restore_tty(void) { @@ -88,7 +97,7 @@ tcsetattr(ttyfd, TCSANOW, &oldtios); rawset = 0; if (out_tty) - fputs("\033[?7h\033[?25h", stdout); /* re-enable wrap, show cursor */ + fputs("\033[?5l\033[?7h\033[?25h", stdout); /* clear reverse, re-enable wrap, show cursor */ fputc('\n', stdout); fflush(stdout); } @@ -241,14 +250,17 @@ } static void -alert_loop(void) +alert_loop(int flash) { fputs("\033[?25h\033[?7h", stdout); int ticks = 0; while (!interrupted) { fputc('\a', stdout); + if (flash) fputs("\033[?5h", stdout); fflush(stdout); sleep_ms(150); + if (flash) fputs("\033[?5l", stdout); + fflush(stdout); int acked = 0; for (int i = 0; i < 15 && !interrupted; i++) { @@ -287,6 +299,7 @@ " -q no sound\n" " -s silent\n" " --no-persist skip alert-until-keypress loop\n" +" --flash on|off terminal flash during alert loop\n" " -- end of options\n" " -h help\n" "\n" @@ -421,7 +434,7 @@ } if (!cfg->silent && cfg->alert_persist && is_foreground()) { interrupted = 0; - alert_loop(); + alert_loop(cfg->flash); } } @@ -436,6 +449,7 @@ { Config cfg = {0}; cfg.alert_persist = ALERT_PERSIST; + cfg.flash = FLASH; /* Pre-strip long-form flags before getopt. Stop at "--". */ int new_argc = 0; @@ -452,6 +466,14 @@ cfg.alert_persist = 0; continue; } + if (!past_dd && !strncmp(argv[i], "--flash=", 8)) { + cfg.flash = parse_bool_str(argv[i] + 8); + continue; + } + if (!past_dd && !strcmp(argv[i], "--flash") && i + 1 < argc) { + cfg.flash = parse_bool_str(argv[++i]); + continue; + } new_argv[new_argc++] = argv[i]; } new_argv[new_argc] = NULL;