Acord/ios/src/AcordApp.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()
}
}
}