From 6ea2257a0c392a5217696cb21f0eacec10ff7ef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=91=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=80=D0=B5=D0=B2?= Date: Thu, 21 May 2026 00:01:01 +0300 Subject: [PATCH] fix: handle backspace/DEL in terminal display Co-Authored-By: Claude Opus 4.6 --- ssh_manager.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/ssh_manager.py b/ssh_manager.py index e7e0236..07a14b4 100644 --- a/ssh_manager.py +++ b/ssh_manager.py @@ -820,8 +820,35 @@ class TerminalWidget(tk.Frame): self.text.configure(state=tk.NORMAL) if tag: self.text.insert(tk.END, text, tag) - else: + elif "\x08" not in text and "\x7f" not in text and "\r" not in text: + # Fast path: no control chars self.text.insert(tk.END, text) + else: + # Slow path: handle backspace/DEL/CR char by char + buf = [] + for ch in text: + if ch == "\x08" or ch == "\x7f": + # Flush buffer first + if buf: + self.text.insert(tk.END, "".join(buf)) + buf.clear() + # Delete char before cursor + pos = self.text.index(tk.END + "-2c") + if self.text.compare(pos, ">", "1.0"): + self.text.delete(pos) + elif ch == "\r": + if buf: + self.text.insert(tk.END, "".join(buf)) + buf.clear() + # CR: delete current line content for overwrite + line_start = self.text.index(tk.END + "-1c linestart") + line_end = self.text.index(tk.END + "-1c") + if self.text.compare(line_start, "<", line_end): + self.text.delete(line_start, line_end) + else: + buf.append(ch) + if buf: + self.text.insert(tk.END, "".join(buf)) self.text.see(tk.END) self.after(0, _do)