121 lines · 3.6 KB · Swift
RawDownload
import SwiftUI final class SettingsOpenRequest {    var wasHandled = false} @MainActorstruct SettingsWindowOpener {    enum Path {        case notification        case appKit    }     enum Outcome: Equatable {        case preferred        case fallback        case failed    }     private let notification: @MainActor () -> Bool    private let appKit: @MainActor () -> Bool     init(        notification: @escaping @MainActor () -> Bool,        appKit: @escaping @MainActor () -> Bool)    {        self.notification = notification        self.appKit = appKit    }     static func live() -> Self {        Self(            notification: {                let request = SettingsOpenRequest()                NotificationCenter.default.post(name: .codexbarOpenSettings, object: request)                return request.wasHandled            },            appKit: {                NSApp.sendAction(Selector(("showPreferencesWindow:")), to: nil, from: nil)            })    }     func open(preferred: Path) -> Outcome {        let attempts = preferred == .notification            ? [self.notification, self.appKit]            : [self.appKit, self.notification]        if attempts[0]() {            return .preferred        }        if attempts[1]() {            return .fallback        }        return .failed    }} struct HiddenWindowView: View {    @Environment(\.openSettings) private var openSettings     var body: some View {        Color.clear            .frame(width: 20, height: 20)            .background(KeepaliveWindowConfigurator())            .onReceive(NotificationCenter.default.publisher(for: .codexbarOpenSettings)) { notification in                (notification.object as? SettingsOpenRequest)?.wasHandled = true                Task { @MainActor in                    self.openSettings()                }            }            .task {                // Migrate keychain items to reduce permission prompts during development (runs off main thread)                await Task.detached(priority: .userInitiated) {                    KeychainMigration.migrateIfNeeded()                }.value            }    }} @MainActorstruct KeepaliveWindowConfigurator: NSViewRepresentable {    func makeNSView(context: Context) -> KeepaliveWindowConfiguratorView {        KeepaliveWindowConfiguratorView()    }     func updateNSView(_ nsView: KeepaliveWindowConfiguratorView, context: Context) {}} @MainActorfinal class KeepaliveWindowConfiguratorView: NSView {    private let windowProvider: (NSView) -> NSWindow?     init(windowProvider: @escaping (NSView) -> NSWindow? = { $0.window }) {        self.windowProvider = windowProvider        super.init(frame: .zero)    }     @available(*, unavailable)    required init?(coder: NSCoder) {        fatalError("init(coder:) is unavailable")    }     override func viewDidMoveToWindow() {        super.viewDidMoveToWindow()        guard let window = self.windowProvider(self) else { return }         window.identifier = NSUserInterfaceItemIdentifier("CodexBarLifecycleKeepalive")        // Make the keepalive window truly invisible and non-interactive.        window.styleMask = [.borderless]        window.collectionBehavior = [.auxiliary, .ignoresCycle, .transient, .canJoinAllSpaces]        window.isExcludedFromWindowsMenu = true        window.level = .floating        window.isOpaque = false        window.alphaValue = 0        window.backgroundColor = .clear        window.hasShadow = false        window.ignoresMouseEvents = true        window.canHide = false        window.setContentSize(NSSize(width: 1, height: 1))        window.setFrameOrigin(NSPoint(x: -5000, y: -5000))    }}