From f68b08d45c920082aaaa1c459fd0dd72847be429 Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Fri, 4 Jul 2025 15:41:45 +0100 Subject: [PATCH] fixed race condition opening the terminal, as restoring scrollback would restore content already there :facepalm: --- .../Views/Terminal/SSHTerminalDelegate.swift | 39 ++++++++++--------- ShhShell/Views/Terminal/ShellView.swift | 5 --- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/ShhShell/Views/Terminal/SSHTerminalDelegate.swift b/ShhShell/Views/Terminal/SSHTerminalDelegate.swift index a18d5be..4bdee37 100644 --- a/ShhShell/Views/Terminal/SSHTerminalDelegate.swift +++ b/ShhShell/Views/Terminal/SSHTerminalDelegate.swift @@ -24,32 +24,20 @@ final class SSHTerminalDelegate: TerminalView, Sendable, @preconcurrency Termina applySelectedTheme() - DispatchQueue.main.async { - Task { - guard let handler = self.handler else { return } - while handler.connected { - if let read = handler.readFromChannel() { - await MainActor.run { - print(read) - self.feed(text: read) - } - } else { - try? await Task.sleep(nanoseconds: 10_000_000) //10ms - } - } - handler.disconnect() - } + Task { + await restoreScrollback() + await startFeedLoop() } } - func restoreScrollback() { + func restoreScrollback() async { guard let scrollback = handler?.scrollback else { return } guard !scrollback.isEmpty else { return } - DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { + await MainActor.run { self.getTerminal().resetToInitialState() for line in scrollback { - print(line) + print("scrollbak \(line)") self.feed(text: line) } self.setNeedsLayout() @@ -57,6 +45,21 @@ 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 { + print("live \(read)F") + self.feed(text: read) + } + } else { + try? await Task.sleep(nanoseconds: 10_000_000) //10ms + } + } + handler.disconnect() + } + func applySelectedTheme() { guard let hostsManager else { return } applyTheme(hostsManager.selectedTheme) diff --git a/ShhShell/Views/Terminal/ShellView.swift b/ShhShell/Views/Terminal/ShellView.swift index c360876..70c7cfc 100644 --- a/ShhShell/Views/Terminal/ShellView.swift +++ b/ShhShell/Views/Terminal/ShellView.swift @@ -21,11 +21,6 @@ struct ShellView: View { hostsManager.selectedTheme.background.suiColor .ignoresSafeArea(.all) TerminalController(handler: handler, hostsManager: hostsManager) - .onAppear { - if let sessionID = handler.sessionID { - container.sessions[sessionID]?.terminalView.restoreScrollback() - } - } Group { Color.gray.opacity(0.2)