From 9a5580bff18316ba4c5619ed8bafc37eeccd77d0 Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Sat, 5 Jul 2025 13:06:44 +0100 Subject: [PATCH] acctually fixed the post-minimize input, restoring scrollback, losing first bit of text issues: when initing the terminalview, restore scrollback but dont start the feedloop then when returning an existing view, start the readloop restorescrollback on appear of the view using didmovetowindow re add the fallback 2nd shellview made restorescrollback and startfeedloop non async --- .../Views/Terminal/SSHTerminalDelegate.swift | 34 ++++++++++--------- ShhShell/Views/Terminal/ShellTabView.swift | 11 ++++-- .../Views/Terminal/TerminalController.swift | 1 + 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/ShhShell/Views/Terminal/SSHTerminalDelegate.swift b/ShhShell/Views/Terminal/SSHTerminalDelegate.swift index 52383d7..aca9006 100644 --- a/ShhShell/Views/Terminal/SSHTerminalDelegate.swift +++ b/ShhShell/Views/Terminal/SSHTerminalDelegate.swift @@ -23,14 +23,17 @@ final class SSHTerminalDelegate: TerminalView, Sendable, @preconcurrency Termina print(getTerminal().foregroundColor.colorCodable) applySelectedTheme() + Task { + await restoreScrollback() +// await startFeedLoop() + } } - func restoreScrollback() async { + func restoreScrollback() { guard let scrollback = handler?.scrollback else { return } guard !scrollback.isEmpty else { return } - try? await Task.sleep(nanoseconds: 10_000_000) - await MainActor.run { + DispatchQueue.main.async { self.getTerminal().resetToInitialState() for line in scrollback { self.feed(text: line) @@ -40,18 +43,20 @@ final class SSHTerminalDelegate: TerminalView, Sendable, @preconcurrency Termina } } - func startFeedLoop() async { - guard let handler else { return } - while handler.connected { - if let read = handler.readFromChannel() { - await MainActor.run { - self.feed(text: read) + func startFeedLoop() { + Task { + guard let handler else { return } + while handler.connected { + if let read = handler.readFromChannel() { + await MainActor.run { + self.feed(text: read) + } + } else { + try? await Task.sleep(nanoseconds: 10_000_000) //10ms } - } else { - try? await Task.sleep(nanoseconds: 10_000_000) //10ms } + handler.disconnect() } - handler.disconnect() } func applySelectedTheme() { @@ -73,10 +78,7 @@ final class SSHTerminalDelegate: TerminalView, Sendable, @preconcurrency Termina override func didMoveToWindow() { super.didMoveToWindow() if window != nil { - Task { - await restoreScrollback() - await startFeedLoop() - } + restoreScrollback() } } diff --git a/ShhShell/Views/Terminal/ShellTabView.swift b/ShhShell/Views/Terminal/ShellTabView.swift index e35f6e1..06423d3 100644 --- a/ShhShell/Views/Terminal/ShellTabView.swift +++ b/ShhShell/Views/Terminal/ShellTabView.swift @@ -147,12 +147,19 @@ struct ShellTabView: View { .id(selectedID) .transition(.opacity) } else { - Text("No Session") + if let handler { + ShellView( + handler: handler, + hostsManager: hostsManager + ) .onAppear { if selectedID == nil { - selectedID = handler?.sessionID + selectedID = handler.sessionID } } + } else { + Text("No Session") + } } } } diff --git a/ShhShell/Views/Terminal/TerminalController.swift b/ShhShell/Views/Terminal/TerminalController.swift index f65f5ad..401ff3d 100644 --- a/ShhShell/Views/Terminal/TerminalController.swift +++ b/ShhShell/Views/Terminal/TerminalController.swift @@ -19,6 +19,7 @@ struct TerminalController: UIViewRepresentable { func makeUIView(context: Context) -> TerminalView { if let sessionID = handler.sessionID { if let existing = container.sessions[sessionID] { + existing.terminalView.startFeedLoop() return existing.terminalView } }