fix: terminal rendering — resize sync, TERM via sidecar, remove double-dot status
This commit is contained in:
parent
3a4a6af942
commit
044a4920bb
|
|
@ -93,11 +93,14 @@ public enum ClientToServer: Sendable {
|
||||||
case paste(data: String)
|
case paste(data: String)
|
||||||
/// Request a full ANSI snapshot of the current pane.
|
/// Request a full ANSI snapshot of the current pane.
|
||||||
case snapshotRequest
|
case snapshotRequest
|
||||||
|
/// Notify the sidecar of the client's terminal dimensions so tmux can
|
||||||
|
/// resize the window to match. Send on connect and on every layout change.
|
||||||
|
case resize(cols: Int, rows: Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
extension ClientToServer: Encodable {
|
extension ClientToServer: Encodable {
|
||||||
private enum CodingKeys: String, CodingKey {
|
private enum CodingKeys: String, CodingKey {
|
||||||
case type, lastSeq, name, data
|
case type, lastSeq, name, data, cols, rows
|
||||||
}
|
}
|
||||||
|
|
||||||
public func encode(to encoder: any Encoder) throws {
|
public func encode(to encoder: any Encoder) throws {
|
||||||
|
|
@ -123,6 +126,11 @@ extension ClientToServer: Encodable {
|
||||||
|
|
||||||
case .snapshotRequest:
|
case .snapshotRequest:
|
||||||
try c.encode("snapshot-request", forKey: .type)
|
try c.encode("snapshot-request", forKey: .type)
|
||||||
|
|
||||||
|
case .resize(let cols, let rows):
|
||||||
|
try c.encode("resize", forKey: .type)
|
||||||
|
try c.encode(cols, forKey: .cols)
|
||||||
|
try c.encode(rows, forKey: .rows)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,6 @@ struct MainTerminalView: View {
|
||||||
VStack(spacing: 0) {
|
VStack(spacing: 0) {
|
||||||
// ── Status bar ──────────────────────────────────────────
|
// ── Status bar ──────────────────────────────────────────
|
||||||
HStack {
|
HStack {
|
||||||
Circle()
|
|
||||||
.fill(connection != nil ? Color.green : Color.orange)
|
|
||||||
.frame(width: 8, height: 8)
|
|
||||||
Text(statusText)
|
Text(statusText)
|
||||||
.font(.caption.monospaced())
|
.font(.caption.monospaced())
|
||||||
.foregroundStyle(.secondary)
|
.foregroundStyle(.secondary)
|
||||||
|
|
@ -85,10 +82,23 @@ struct MainTerminalView: View {
|
||||||
}
|
}
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
|
|
||||||
|
// Wire resize callback — fires on layout + font changes.
|
||||||
|
terminalVC.onResize = { [weak conn] cols, rows in
|
||||||
|
guard let conn else { return }
|
||||||
|
Task { try? await conn.send(.resize(cols: cols, rows: rows)) }
|
||||||
|
}
|
||||||
|
|
||||||
connection = conn
|
connection = conn
|
||||||
await conn.resume(from: conn.scrollback.sizeBytes > 0
|
await conn.resume(from: conn.scrollback.sizeBytes > 0
|
||||||
? ResumeCursor().lastSeq(for: sessionId)
|
? ResumeCursor().lastSeq(for: sessionId)
|
||||||
: nil)
|
: nil)
|
||||||
|
|
||||||
|
// Send the current terminal size immediately after connecting
|
||||||
|
// so tmux resizes before the first output frame arrives.
|
||||||
|
let (cols, rows) = terminalVC.terminalSize
|
||||||
|
if cols > 0 && rows > 0 {
|
||||||
|
try? await conn.send(.resize(cols: cols, rows: rows))
|
||||||
|
}
|
||||||
} catch {
|
} catch {
|
||||||
statusText = "Error: \(error.localizedDescription)"
|
statusText = "Error: \(error.localizedDescription)"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,10 @@ public final class TerminalViewController: UIViewController {
|
||||||
/// forwarded to the remote PTY (wired by T-2.5).
|
/// forwarded to the remote PTY (wired by T-2.5).
|
||||||
public var onInput: ((Data) -> Void)?
|
public var onInput: ((Data) -> Void)?
|
||||||
|
|
||||||
|
/// Called when SwiftTerm recalculates its column/row count (layout,
|
||||||
|
/// font change, rotation). Forward this to the sidecar so tmux resizes.
|
||||||
|
public var onResize: ((Int, Int) -> Void)?
|
||||||
|
|
||||||
// MARK: View lifecycle
|
// MARK: View lifecycle
|
||||||
|
|
||||||
public override func viewDidLoad() {
|
public override func viewDidLoad() {
|
||||||
|
|
@ -139,8 +143,11 @@ extension TerminalViewController: TerminalViewDelegate {
|
||||||
// MARK: Required — size change notification
|
// MARK: Required — size change notification
|
||||||
|
|
||||||
public nonisolated func sizeChanged(source: TerminalView, newCols: Int, newRows: Int) {
|
public nonisolated func sizeChanged(source: TerminalView, newCols: Int, newRows: Int) {
|
||||||
// No-op in T-2.3; the stream layer (T-2.5) will negotiate PTY size
|
// Propagate to whoever manages the sidecar connection so they can
|
||||||
// with the sidecar when it subscribes to this controller.
|
// call `tmux resize-window` and keep line-wrapping in sync.
|
||||||
|
MainActor.assumeIsolated {
|
||||||
|
onResize?(newCols, newRows)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: Required — title change
|
// MARK: Required — title change
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue