Fix TUI apps (mc, htop, vim) freezing in SSH terminal

- Remove LNM mode that corrupted cursor positioning for TUI programs
- Add render debouncing (~60fps) to prevent UI thread blocking
- Add data batching in terminal tab to reduce render calls
- Increase SSH recv buffer from 4KB to 64KB

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
chrome-storm-c442
2026-02-23 14:32:19 -05:00
parent e1b3c1c427
commit 641f5a41d0
3 changed files with 28 additions and 4 deletions

View File

@@ -73,12 +73,15 @@ class TerminalWidget(tk.Frame):
# pyte screen + stream
self._screen = pyte.Screen(cols, rows)
self._screen.set_mode(pyte.modes.LNM)
self._stream = pyte.Stream(self._screen)
# Previous buffer for diff rendering
self._prev_buffer: dict[int, list] = {}
# Render debouncing (~60fps)
self._render_pending = False
self._render_after_id = None
# Font
self._font = tkfont.Font(family="Consolas", size=11)
self._bold_font = tkfont.Font(family="Consolas", size=11, weight="bold")
@@ -147,12 +150,20 @@ class TerminalWidget(tk.Frame):
self._status_label.configure(text=text, fg=color)
def feed(self, data: bytes):
"""Feed raw bytes from SSH into pyte and re-render."""
"""Feed raw bytes from SSH into pyte, schedule debounced render."""
try:
text = data.decode("utf-8", errors="replace")
except Exception:
text = data.decode("latin-1", errors="replace")
self._stream.feed(text)
if not self._render_pending:
self._render_pending = True
self._render_after_id = self.after(16, self._debounced_render)
def _debounced_render(self):
"""Execute pending render."""
self._render_pending = False
self._render_after_id = None
self._render()
def reset(self):