|
1 | 1 | import AppKit |
2 | 2 | import Perception |
3 | 3 | import SwiftUI |
| 4 | +import Logger |
4 | 5 |
|
5 | 6 | struct OverlayFrameEnvironmentKey: EnvironmentKey { |
6 | 7 | static let defaultValue: CGRect = .zero |
@@ -86,18 +87,21 @@ final class OverlayPanel: NSPanel { |
86 | 87 | } |
87 | 88 |
|
88 | 89 | func setTopLeftCoordinateFrame(_ frame: CGRect, display: Bool) { |
89 | | - let screen = NSScreen.screens |
90 | | - .first(where: { $0.frame.intersects(frame) }) ?? NSScreen.main |
| 90 | + let zeroScreen = NSScreen.screens.first { $0.frame.origin == .zero } |
| 91 | + ?? NSScreen.primaryScreen ?? NSScreen.main |
91 | 92 | let panelFrame = Self.convertAXRectToNSPanelFrame( |
92 | 93 | axRect: frame, |
93 | | - forScreen: screen |
| 94 | + forPrimaryScreen: zeroScreen |
94 | 95 | ) |
95 | 96 | panelState.windowFrame = frame |
96 | 97 | panelState.windowFrameNSCoordinate = panelFrame |
97 | 98 | setFrame(panelFrame, display: display) |
98 | 99 | } |
99 | 100 |
|
100 | | - static func convertAXRectToNSPanelFrame(axRect: CGRect, forScreen screen: NSScreen?) -> CGRect { |
| 101 | + static func convertAXRectToNSPanelFrame( |
| 102 | + axRect: CGRect, |
| 103 | + forPrimaryScreen screen: NSScreen? |
| 104 | + ) -> CGRect { |
101 | 105 | guard let screen = screen else { return .zero } |
102 | 106 | let screenFrame = screen.frame |
103 | 107 | let flippedY = screenFrame.origin.y + screenFrame.size |
@@ -139,3 +143,35 @@ func overlayLevel(_ addition: Int) -> NSWindow.Level { |
139 | 143 | return .init(minimumWidgetLevel + addition) |
140 | 144 | } |
141 | 145 |
|
| 146 | +public extension CGRect { |
| 147 | + func flipped(relativeTo reference: CGRect) -> CGRect { |
| 148 | + let flippedOrigin = CGPoint( |
| 149 | + x: origin.x, |
| 150 | + y: reference.height - origin.y - height |
| 151 | + ) |
| 152 | + return CGRect(origin: flippedOrigin, size: size) |
| 153 | + } |
| 154 | + |
| 155 | + func relative(to reference: CGRect) -> CGRect { |
| 156 | + let relativeOrigin = CGPoint( |
| 157 | + x: origin.x - reference.origin.x, |
| 158 | + y: origin.y - reference.origin.y |
| 159 | + ) |
| 160 | + return CGRect(origin: relativeOrigin, size: size) |
| 161 | + } |
| 162 | +} |
| 163 | + |
| 164 | +public extension NSScreen { |
| 165 | + var isPrimary: Bool { |
| 166 | + let id = deviceDescription[.init("NSScreenNumber")] as? CGDirectDisplayID |
| 167 | + return id == CGMainDisplayID() |
| 168 | + } |
| 169 | + |
| 170 | + static var primaryScreen: NSScreen? { |
| 171 | + NSScreen.screens.first { |
| 172 | + let id = $0.deviceDescription[.init("NSScreenNumber")] as? CGDirectDisplayID |
| 173 | + return id == CGMainDisplayID() |
| 174 | + } |
| 175 | + } |
| 176 | +} |
| 177 | + |
0 commit comments