mirror of
https://github.com/neon443/ShhShell.git
synced 2026-03-11 13:26:16 +00:00
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
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user