macOS client panes and transcript
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user