import SwiftUI import AppKit // MARK: - App Delegate final class PadXcodeDaemonDelegate: NSObject, NSApplicationDelegate { func applicationDidFinishLaunching(_ notification: Notification) { // Start daemon on app launch. The controller is created by the App // struct before this fires and stored in the shared reference below. guard let controller = PadXcodeDaemonApp.sharedController else { return } Task { @MainActor in await controller.start() } } func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return false } } // MARK: - App @main struct PadXcodeDaemonApp: App { @NSApplicationDelegateAdaptor(PadXcodeDaemonDelegate.self) private var appDelegate @StateObject private var preferences = AppPreferences() @StateObject private var controller: DaemonController // Static reference so the delegate can access the controller before // SwiftUI finishes wiring up @State bindings. static var sharedController: DaemonController? init() { ensureConfigFile() let prefs = AppPreferences() let ctrl = DaemonController(preferences: prefs) _preferences = StateObject(wrappedValue: prefs) _controller = StateObject(wrappedValue: ctrl) // Store before applicationDidFinishLaunching fires. PadXcodeDaemonApp.sharedController = ctrl } var body: some Scene { MenuBarExtra { MenuBarView(controller: controller, preferences: preferences) } label: { MenuBarIcon(controller: controller) } .menuBarExtraStyle(.window) Window("PadXcode Daemon Settings", id: "settings") { DaemonSettingsView(controller: controller, preferences: preferences) } .windowResizability(.contentSize) .defaultSize(width: 520, height: 580) .windowStyle(.titleBar) .commandsRemoved() Window("Daemon Log", id: "log") { DaemonLogWindowView(controller: controller) } .defaultSize(width: 700, height: 500) .windowStyle(.titleBar) .commandsRemoved() } }