Ariver
2026-06-19 81b5a5f847e74fe1106829b13db2cccda8dd5798
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import AppKit
import CoreGraphics
import AlignerCore
 
@MainActor
final class QuickSwitchOverlayHost: OverlayHostProtocol {
    private let panel: QuickSwitchPanel
    private let screenProvider: (OverlayContext) -> NSScreen?
    private let debugOverlayWidth: CGFloat?
    private var currentScreen: NSScreen?
 
    init(
        screenProvider: ((OverlayContext) -> NSScreen?)? = nil,
        title: String = "Aligner Quick Switch Overlay",
        contentView: NSView? = nil,
        debugOverlayWidth: CGFloat? = nil
    ) {
        self.screenProvider = screenProvider ?? Self.screen(for:)
        self.debugOverlayWidth = debugOverlayWidth
        self.panel = QuickSwitchPanel()
        self.panel.title = title
        self.panel.contentView = contentView
        currentScreen = self.screenProvider(OverlayContext(entryPoint: .quickSwitch))
        applyWindowPolicy()
    }
 
    var currentLevel: CGWindowLevel {
        CGWindowLevel(panel.level.rawValue)
    }
 
    func show(context: OverlayContext) {
        currentScreen = screenProvider(context)
        applyWindowPolicy()
        panel.orderFrontRegardless()
    }
 
    func hide(reason: DismissReason) {
        detachAllChildren()
        panel.orderOut(nil)
    }
 
    func promoteForTextInput(allowAppActivation: Bool) {
        panel.makeKeyAndOrderFront(nil)
        if allowAppActivation {
            NSApp.activate(ignoringOtherApps: true)
        }
    }
 
    func attachChild(_ window: NSWindow) {
        if let panel = window as? NSPanel {
            OverlayWindowPolicy.apply(to: panel, on: currentScreen)
        } else {
            window.level = panel.level
            window.collectionBehavior = panel.collectionBehavior
            if let currentScreen {
                window.setFrame(currentScreen.frame, display: false)
            }
        }
        panel.addChildWindow(window, ordered: .above)
    }
 
    func detachChild(_ window: NSWindow) {
        panel.removeChildWindow(window)
    }
 
    func beginSheet(_ sheetPanel: NSPanel, completion: (() -> Void)?) {
        panel.beginSheet(sheetPanel) { _ in
            completion?()
        }
    }
 
    private func detachAllChildren() {
        for child in panel.childWindows ?? [] {
            panel.removeChildWindow(child)
            child.orderOut(nil)
        }
    }
 
    private func applyWindowPolicy() {
        OverlayWindowPolicy.apply(to: panel, on: currentScreen)
 
        guard
            let currentScreen,
            let debugOverlayWidth,
            debugOverlayWidth > 0
        else {
            return
        }
 
        let width = min(debugOverlayWidth, currentScreen.frame.width)
        let frame = CGRect(
            x: currentScreen.frame.midX - width / 2,
            y: currentScreen.frame.minY,
            width: width,
            height: currentScreen.frame.height
        )
        panel.setFrame(frame, display: false)
    }
 
    private static func screen(for context: OverlayContext) -> NSScreen? {
        screen(matching: context.targetDisplayUUID) ?? NSScreen.main
    }
 
    private static func screen(matching displayUUID: String?) -> NSScreen? {
        guard let displayUUID else { return nil }
 
        return NSScreen.screens.first { screen in
            guard
                let number = screen.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? NSNumber,
                let unmanagedUUID = CGDisplayCreateUUIDFromDisplayID(CGDirectDisplayID(number.uint32Value))
            else {
                return false
            }
 
            let uuid = unmanagedUUID.takeRetainedValue()
            let screenUUID = CFUUIDCreateString(nil, uuid) as String?
            return screenUUID?.caseInsensitiveCompare(displayUUID) == .orderedSame
        }
    }
}
 
@MainActor
private final class QuickSwitchPanel: NSPanel {
    init() {
        super.init(
            contentRect: .zero,
            styleMask: OverlayWindowPolicy.styleMask,
            backing: .buffered,
            defer: false
        )
    }
 
    override var canBecomeKey: Bool {
        true
    }
 
    override var canBecomeMain: Bool {
        true
    }
}