fixed race condition opening the terminal, as restoring scrollback would restore content already there 🤦

This commit is contained in:
neon443
2025-07-04 15:41:45 +01:00
parent b5f8c4e716
commit f68b08d45c
2 changed files with 21 additions and 23 deletions

View File

@@ -24,13 +24,33 @@ final class SSHTerminalDelegate: TerminalView, Sendable, @preconcurrency Termina
applySelectedTheme() applySelectedTheme()
DispatchQueue.main.async {
Task { Task {
guard let handler = self.handler else { return } await restoreScrollback()
await startFeedLoop()
}
}
func restoreScrollback() async {
guard let scrollback = handler?.scrollback else { return }
guard !scrollback.isEmpty else { return }
await MainActor.run {
self.getTerminal().resetToInitialState()
for line in scrollback {
print("scrollbak \(line)")
self.feed(text: line)
}
self.setNeedsLayout()
self.setNeedsDisplay()
}
}
func startFeedLoop() async {
guard let handler else { return }
while handler.connected { while handler.connected {
if let read = handler.readFromChannel() { if let read = handler.readFromChannel() {
await MainActor.run { await MainActor.run {
print(read) print("live \(read)F")
self.feed(text: read) self.feed(text: read)
} }
} else { } else {
@@ -39,23 +59,6 @@ final class SSHTerminalDelegate: TerminalView, Sendable, @preconcurrency Termina
} }
handler.disconnect() handler.disconnect()
} }
}
}
func restoreScrollback() {
guard let scrollback = handler?.scrollback else { return }
guard !scrollback.isEmpty else { return }
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
self.getTerminal().resetToInitialState()
for line in scrollback {
print(line)
self.feed(text: line)
}
self.setNeedsLayout()
self.setNeedsDisplay()
}
}
func applySelectedTheme() { func applySelectedTheme() {
guard let hostsManager else { return } guard let hostsManager else { return }

View File

@@ -21,11 +21,6 @@ struct ShellView: View {
hostsManager.selectedTheme.background.suiColor hostsManager.selectedTheme.background.suiColor
.ignoresSafeArea(.all) .ignoresSafeArea(.all)
TerminalController(handler: handler, hostsManager: hostsManager) TerminalController(handler: handler, hostsManager: hostsManager)
.onAppear {
if let sessionID = handler.sessionID {
container.sessions[sessionID]?.terminalView.restoreScrollback()
}
}
Group { Group {
Color.gray.opacity(0.2) Color.gray.opacity(0.2)