diff --git a/src/main.py b/src/main.py index f528dfb..99b2dac 100644 --- a/src/main.py +++ b/src/main.py @@ -312,7 +312,33 @@ def _display_live_stats( stats_mgr.reset() return + # Flush any pending input so an accidental newline doesn't exit immediately + try: # pragma: no cover - depends on platform + import termios + + termios.tcflush(sys.stdin, termios.TCIFLUSH) + except Exception: + try: # pragma: no cover - Windows fallback + import msvcrt + + while msvcrt.kbhit(): + msvcrt.getwch() + except Exception: + pass + while True: + # Break out immediately if the user has already pressed Enter + try: # pragma: no cover - non-interactive environments + import select + + ready, _, _ = select.select([sys.stdin], [], [], 0) + if ready: + line = sys.stdin.readline().strip() + if line == "" or line.lower() == "b": + break + except Exception: + pass + if callable(sync_fn): try: sync_fn() diff --git a/src/tests/test_stats_screen.py b/src/tests/test_stats_screen.py index f7f6d4e..feb63d6 100644 --- a/src/tests/test_stats_screen.py +++ b/src/tests/test_stats_screen.py @@ -88,3 +88,21 @@ def test_stats_display_resets_after_exit(monkeypatch, capsys): main._display_live_stats(pm) out = capsys.readouterr().out assert out.count("stats") == 2 + + +def test_stats_screen_breaks_on_enter(monkeypatch): + calls = {"display": 0} + + def display(): + calls["display"] += 1 + print("stats") + + pm = _make_pm() + pm.display_stats = display + + monkeypatch.setattr(main, "get_notification_text", lambda *_: "") + monkeypatch.setattr(main, "timed_input", lambda *_args, **_kwargs: "") + + main._display_live_stats(pm, interval=0.01) + + assert calls["display"] == 1