macOS client panes and transcript

This commit is contained in:
Ian Gulliver
2026-10-16 23:30:57 -07:00
parent 14d7ad4631
commit 00cd1ed958
23 changed files with 5059 additions and 739 deletions
+35 -20
View File
@@ -1,24 +1,55 @@
import AppKit
import SwiftTerm
import SwiftUI
typealias ViewState = State
@MainActor
final class AppDelegate: NSObject, NSApplicationDelegate {
var connection: Connection?
private var quitting = false
func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
guard let store = connection?.store, !quitting else {
return .terminateNow
}
quitting = true
var replied = false
let reply = {
if !replied {
replied = true
sender.reply(toApplicationShouldTerminate: true)
}
}
Task {
await store.stop()
reply()
}
Task {
try? await Task.sleep(for: .seconds(2))
reply()
}
return .terminateLater
}
}
@main
struct ByreApp: App {
@NSApplicationDelegateAdaptor private var delegate: AppDelegate
@ViewState private var connection = Connection()
@ViewState private var spike = SpikeLog()
@ViewState private var overlays = Overlays()
var body: some Scene {
Window("byre", id: "main") {
RootView()
.environment(connection)
.environment(spike)
.environment(overlays)
.font(Fonts.font(13))
.frame(minWidth: 640, minHeight: 400)
.onAppear {
installCtrlMonitor(spike)
delegate.connection = connection
}
}
.defaultSize(width: 1280, height: 820)
.commands {
CommandGroup(after: .appInfo) {
Button("Change Server…") {
@@ -29,19 +60,3 @@ struct ByreApp: App {
}
}
}
@MainActor
private func installCtrlMonitor(_ spike: SpikeLog) {
NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in
let flags = event.modifierFlags.intersection(.deviceIndependentFlagsMask)
guard flags.contains(.control), !flags.contains(.command), let key = event.charactersIgnoringModifiers, ["k", "p", "l", "s", "/"].contains(key) else {
return event
}
if event.window?.firstResponder is TerminalView {
spike.log("ctrl-\(key) passed to the terminal")
return event
}
spike.log("ctrl-\(key) taken as a Go shortcut")
return nil
}
}