48 lines
1.4 KiB
Swift
48 lines
1.4 KiB
Swift
import AppKit
|
|
import SwiftTerm
|
|
import SwiftUI
|
|
|
|
typealias ViewState = State
|
|
|
|
@main
|
|
struct ByreApp: App {
|
|
@ViewState private var connection = Connection()
|
|
@ViewState private var spike = SpikeLog()
|
|
|
|
var body: some Scene {
|
|
Window("byre", id: "main") {
|
|
RootView()
|
|
.environment(connection)
|
|
.environment(spike)
|
|
.font(Fonts.font(13))
|
|
.onAppear {
|
|
installCtrlMonitor(spike)
|
|
}
|
|
}
|
|
.commands {
|
|
CommandGroup(after: .appInfo) {
|
|
Button("Change Server…") {
|
|
connection.changeServer()
|
|
}
|
|
}
|
|
PasteboardCommands()
|
|
}
|
|
}
|
|
}
|
|
|
|
@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
|
|
}
|
|
}
|