Add terminal resize handling
- Detect KEY_RESIZE event in input thread - Recreate windows with new dimensions on resize - Redraw all content after resize - Add minimum terminal size check (20x80) - Handle both expansion and shrinking gracefully
This commit is contained in:
62
ui.py
62
ui.py
@ -230,6 +230,10 @@ class UIManager:
|
|||||||
"""Create all UI windows"""
|
"""Create all UI windows"""
|
||||||
maxy, maxx = self.screen.getmaxyx()
|
maxy, maxx = self.screen.getmaxyx()
|
||||||
|
|
||||||
|
# Minimum terminal size check
|
||||||
|
if maxy < 20 or maxx < 80:
|
||||||
|
return False
|
||||||
|
|
||||||
# Server info window (top)
|
# Server info window (top)
|
||||||
self.info_window = curses.newwin(
|
self.info_window = curses.newwin(
|
||||||
INFO_WINDOW_HEIGHT,
|
INFO_WINDOW_HEIGHT,
|
||||||
@ -285,6 +289,53 @@ class UIManager:
|
|||||||
|
|
||||||
self.screen.noutrefresh()
|
self.screen.noutrefresh()
|
||||||
curses.doupdate()
|
curses.doupdate()
|
||||||
|
return True
|
||||||
|
|
||||||
|
def handle_resize(self):
|
||||||
|
"""Handle terminal resize event"""
|
||||||
|
try:
|
||||||
|
# Get new terminal dimensions
|
||||||
|
maxy, maxx = self.screen.getmaxyx()
|
||||||
|
|
||||||
|
# Minimum size check
|
||||||
|
if maxy < 20 or maxx < 80:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Update screen
|
||||||
|
curses.update_lines_cols()
|
||||||
|
self.screen.clear()
|
||||||
|
self.screen.addstr(0, 0, f"Quake Live PyCon: {self.host}")
|
||||||
|
self.screen.noutrefresh()
|
||||||
|
|
||||||
|
# Recreate windows with new dimensions
|
||||||
|
self.info_window.resize(INFO_WINDOW_HEIGHT, maxx - 4)
|
||||||
|
self.info_window.mvwin(INFO_WINDOW_Y, 2)
|
||||||
|
|
||||||
|
self.output_window.resize(maxy - 17, maxx - 4)
|
||||||
|
self.output_window.mvwin(OUTPUT_WINDOW_Y, 2)
|
||||||
|
|
||||||
|
self.divider_window.resize(1, maxx - 4)
|
||||||
|
self.divider_window.mvwin(maxy - 3, 2)
|
||||||
|
self.divider_window.clear()
|
||||||
|
self.divider_window.hline(curses.ACS_HLINE, maxx - 4)
|
||||||
|
|
||||||
|
self.input_window.resize(INPUT_WINDOW_HEIGHT, maxx - 6)
|
||||||
|
self.input_window.mvwin(maxy - 2, 4)
|
||||||
|
|
||||||
|
self.screen.addstr(maxy - 2, 2, '$ ')
|
||||||
|
|
||||||
|
# Refresh all windows
|
||||||
|
self.info_window.noutrefresh()
|
||||||
|
self.output_window.noutrefresh()
|
||||||
|
self.divider_window.noutrefresh()
|
||||||
|
self.input_window.noutrefresh()
|
||||||
|
self.screen.noutrefresh()
|
||||||
|
curses.doupdate()
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
except curses.error:
|
||||||
|
return False
|
||||||
|
|
||||||
def setup_input_queue(self):
|
def setup_input_queue(self):
|
||||||
"""Setup threaded input queue with command history and autocomplete"""
|
"""Setup threaded input queue with command history and autocomplete"""
|
||||||
@ -308,6 +359,17 @@ class UIManager:
|
|||||||
if key == -1: # No input
|
if key == -1: # No input
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# Handle terminal resize
|
||||||
|
if key == curses.KEY_RESIZE:
|
||||||
|
manager.handle_resize()
|
||||||
|
# Redraw input
|
||||||
|
window.erase()
|
||||||
|
window.addstr(0, 0, current_input)
|
||||||
|
window.move(0, cursor_pos)
|
||||||
|
window.noutrefresh()
|
||||||
|
curses.doupdate()
|
||||||
|
continue
|
||||||
|
|
||||||
# Tab key - cycle through suggestions
|
# Tab key - cycle through suggestions
|
||||||
if key == ord('\t') or key == 9:
|
if key == ord('\t') or key == 9:
|
||||||
if suggestions:
|
if suggestions:
|
||||||
|
|||||||
Reference in New Issue
Block a user