64 lines
1.8 KiB
Swift
64 lines
1.8 KiB
Swift
import SwiftUI
|
|
import os.log
|
|
import Darwin
|
|
|
|
@main
|
|
struct AcordApp: App {
|
|
init() {
|
|
Self.captureStderr()
|
|
dlog("AcordApp.init")
|
|
}
|
|
|
|
/// redirects Rust staticlib stderr into NSLog and real stdout.
|
|
private static func captureStderr() {
|
|
let realStdout = dup(fileno(stdout))
|
|
guard realStdout != -1 else { return }
|
|
let outFile = fdopen(realStdout, "w")
|
|
guard outFile != nil else { close(realStdout); return }
|
|
setvbuf(outFile, nil, _IONBF, 0)
|
|
|
|
var fds: [Int32] = [0, 0]
|
|
guard pipe(&fds) == 0 else { return }
|
|
dup2(fds[1], fileno(stderr))
|
|
setvbuf(stderr, nil, _IONBF, 0)
|
|
|
|
DispatchQueue.global(qos: .utility).async {
|
|
guard let f = fdopen(fds[0], "r") else { return }
|
|
var line: UnsafeMutablePointer<CChar>?
|
|
var cap: Int = 0
|
|
while getline(&line, &cap, f) > 0 {
|
|
if let l = line {
|
|
fputs("[Rust] ", outFile)
|
|
fputs(l, outFile)
|
|
NSLog("[Rust] %s", l)
|
|
}
|
|
}
|
|
if let l = line { free(l) }
|
|
}
|
|
}
|
|
|
|
var body: some Scene {
|
|
WindowGroup {
|
|
ContentView()
|
|
.onAppear { dlog("AcordApp scene WindowGroup appeared") }
|
|
}
|
|
}
|
|
}
|
|
|
|
struct ContentView: View {
|
|
@StateObject private var controller = ViewportController()
|
|
|
|
var body: some View {
|
|
VStack(spacing: 0) {
|
|
MenuBar(controller: controller)
|
|
IcedViewportRepresentable(controller: controller)
|
|
.ignoresSafeArea(.container, edges: .bottom)
|
|
}
|
|
.ignoresSafeArea(.keyboard)
|
|
.onAppear {
|
|
dlog("ContentView.onAppear")
|
|
PermissionsManager.requestSystemPermissions()
|
|
}
|
|
}
|
|
}
|