Skip to content

Commit 82a22f5

Browse files
committed
TextFrame(fix[display]): Handle terminal resize events
why: Display did not update when terminal was resized what: - Handle curses.KEY_RESIZE event in input loop - Call curses.resize_term() to update internal dimensions - Add test for resize handling
1 parent e0a047e commit 82a22f5

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

src/libtmux/textframe/core.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,3 +311,7 @@ def _curses_display(self, stdscr: curses.window) -> None:
311311
scroll_y = 0
312312
elif key == curses.KEY_END:
313313
scroll_y = max_scroll_y
314+
315+
# Terminal resize
316+
elif key == curses.KEY_RESIZE:
317+
curses.resize_term(*stdscr.getmaxyx())

tests/textframe/test_display.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,20 @@ def test_status_line_displayed(self, mock_curses: None) -> None:
137137
if len(call[0]) >= 3 and "q:quit" in str(call[0][2])
138138
]
139139
assert len(status_calls) > 0, "Status line should be displayed"
140+
141+
def test_terminal_resize_handling(self, mock_curses: None) -> None:
142+
"""Verify terminal resize events are handled via KEY_RESIZE."""
143+
import curses as curses_module
144+
145+
frame = TextFrame(content_width=10, content_height=2)
146+
frame.set_content(["hello", "world"])
147+
148+
mock_stdscr = MagicMock()
149+
# Start with 24x80, resize to 40x120, then quit
150+
mock_stdscr.getmaxyx.side_effect = [(24, 80), (40, 120), (40, 120)]
151+
mock_stdscr.getch.side_effect = [curses_module.KEY_RESIZE, ord("q")]
152+
153+
with patch("curses.resize_term") as mock_resize:
154+
frame._curses_display(mock_stdscr)
155+
# Verify resize_term was called with new dimensions
156+
mock_resize.assert_called_once_with(40, 120)

0 commit comments

Comments
 (0)