import AppKit extension NSScreen { // MARK: - Stable display identifier /// Returns a stable UUID string for this screen by querying CoreGraphics. /// Falls back to the localized name if the CG UUID is unavailable. var displayUUID: String { guard let screenNumber = deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? CGDirectDisplayID else { return localizedName } guard let uuid = CGDisplayCreateUUIDFromDisplayID(screenNumber) else { return localizedName } return CFUUIDCreateString(nil, uuid.takeUnretainedValue()) as String } // MARK: - Notch detection /// `true` when this screen has a physical camera notch (safe area inset at top > 0). var hasNotch: Bool { safeAreaInsets.top > 0 } // MARK: - Closed notch sizing /// Computes the closed-state notch size for this screen, /// respecting the user's height mode and custom height preferences. func closedNotchSize(using settings: AppSettings.DisplaySettings) -> CGSize { let height = closedNotchHeight(using: settings) let width = closedNotchWidth() return CGSize(width: width, height: height) } /// Height of the closed notch bar, determined by the user's chosen mode. private func closedNotchHeight(using settings: AppSettings.DisplaySettings) -> CGFloat { if hasNotch { let mode = NotchHeightMode(rawValue: settings.notchHeightMode) ?? .matchRealNotchSize switch mode { case .matchRealNotchSize: return safeAreaInsets.top case .matchMenuBar: return menuBarHeight() case .custom: return settings.notchHeight } } else { let mode = NonNotchHeightMode(rawValue: settings.nonNotchHeightMode) ?? .matchMenuBar switch mode { case .matchMenuBar: return menuBarHeight() case .custom: return settings.nonNotchHeight } } } /// Width of the closed notch. /// On notch screens, spans from one auxiliary top area to the other. /// On non-notch screens, uses a reasonable fixed width. private func closedNotchWidth() -> CGFloat { if hasNotch { if let topLeft = auxiliaryTopLeftArea, let topRight = auxiliaryTopRightArea { // The notch occupies the space between the two menu bar segments return frame.width - topLeft.width - topRight.width + 4 } // Fallback for older API — approximate from safe area return 220 } else { // Non-notch screens: a compact simulated notch return 220 } } /// The effective menu bar height for this screen. private func menuBarHeight() -> CGFloat { return frame.maxY - visibleFrame.maxY } }