use erase() instead of clear() in per-keystroke TUI redraw loops

clear() forces a full physical screen repaint on the next refresh();
erase() just blanks the buffer content and lets curses diff against
what's already on the terminal, sending only the changed cells. The
main cert list and the cert-entry form both redraw on every keystroke,
so clear() there meant retransmitting the whole screen on every arrow
key / typed character — slow and flickery over a low-bandwidth link
like a serial console.

One-shot dialogs (show_confirm, _msg, _error) draw once and don't
loop-redraw, so they keep clear() as-is — no benefit to changing them
and it's one less thing to get wrong.

Also handle curses.KEY_RESIZE explicitly in the main list loop: force
one real clear() right after a detected resize, since erase()'s diff
against the pre-resize screen model isn't reliable across a genuine
dimension change. Screen-size changes were already picked up on the
next redraw before this (draw() runs unconditionally every loop
iteration), this just guarantees a clean repaint at the moment of the
actual resize instead of trusting the diff engine through it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Vlad Doloman
2026-07-08 17:45:13 +03:00
parent 92d512f0d2
commit 2640dbf81d
3 changed files with 48 additions and 2 deletions

View File

@@ -102,6 +102,18 @@ def test_show_cert_form_cancel():
assert result.confirmed is False
def test_show_cert_form_uses_erase_not_clear():
# clear() forces a full-screen repaint on every refresh(); the form
# redraws on every keystroke, so it must use erase() instead.
stdscr = _make_stdscr()
win = _make_win(rows=20, cols=70)
win.getch.side_effect = [9, 27] # Tab, then Escape
with patch("curses.newwin", return_value=win):
show_cert_form(stdscr, cn="alice", email="alice@example.com")
assert win.erase.called
assert not win.clear.called
def test_show_cert_form_confirm():
"""Enter advances through the 3 fields to the Continue button; Enter on
Continue confirms. That's 4 Enter keypresses total."""