From 9338b46760e25e381d19faf39b98fd962c1335b6 Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Sun, 22 Jun 2025 18:43:10 +0100 Subject: [PATCH] improved how the terminal is updated, now just async reads aytomatically and will js not do anything if nothing recieved terminal also starts at the top and doesnt have th wierd scroll artifacting --- ShhShell/SSH/SSHHandler.swift | 12 ++++++------ ShhShell/Views/Terminal/SSHTerminalView.swift | 10 ++++++++++ ShhShell/Views/Terminal/TerminalController.swift | 2 -- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/ShhShell/SSH/SSHHandler.swift b/ShhShell/SSH/SSHHandler.swift index 7652439..168acf6 100644 --- a/ShhShell/SSH/SSHHandler.swift +++ b/ShhShell/SSH/SSHHandler.swift @@ -311,21 +311,21 @@ class SSHHandler: ObservableObject { // RunLoop.main.add(self.readTimer!, forMode: .common) } - func readFromChannel() -> String { - guard ssh_channel_is_open(channel) != 0 else { return "" } - guard ssh_channel_is_eof(channel) == 0 else { return "" } + func readFromChannel() -> String? { + guard ssh_channel_is_open(channel) != 0 else { return nil } + guard ssh_channel_is_eof(channel) == 0 else { return nil } - var buffer: [CChar] = Array(repeating: 0, count: 256) + var buffer: [CChar] = Array(repeating: 0, count: 16) let nbytes = ssh_channel_read_nonblocking(channel, &buffer, UInt32(buffer.count), 0) - guard nbytes > 0 else { return "" } + guard nbytes > 0 else { return nil } write(1, buffer, Int(nbytes)) let data = Data(bytes: buffer, count: buffer.count) if let string = String(data: data, encoding: .utf8) { return string } - return "" + return nil } private func logSshGetError() { diff --git a/ShhShell/Views/Terminal/SSHTerminalView.swift b/ShhShell/Views/Terminal/SSHTerminalView.swift index 3060b8e..dde1323 100644 --- a/ShhShell/Views/Terminal/SSHTerminalView.swift +++ b/ShhShell/Views/Terminal/SSHTerminalView.swift @@ -22,6 +22,16 @@ class SSHTerminalView: TerminalView, TerminalViewDelegate { super.init(frame: frame) terminalDelegate = self + sshQueue.async { + guard let handler = self.handler else { return } + while handler.connected { + guard let handler = self.handler else { break } + guard let read = handler.readFromChannel() else { return } + DispatchQueue.main.async { + self.feed(text: read) + } + } + } } required init?(coder: NSCoder) { diff --git a/ShhShell/Views/Terminal/TerminalController.swift b/ShhShell/Views/Terminal/TerminalController.swift index d5f5e30..9b00f0a 100644 --- a/ShhShell/Views/Terminal/TerminalController.swift +++ b/ShhShell/Views/Terminal/TerminalController.swift @@ -23,11 +23,9 @@ struct TerminalController: UIViewRepresentable { ) // tv.terminalDelegate = terminalDelegate - tv.getTerminal().feed(text: handler.readFromChannel()) return tv } func updateUIView(_ tv: TerminalView, context: Context) { - tv.getTerminal().feed(text: handler.readFromChannel()) } }