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 } }