import AppKit public extension NSScreen { /// Die `CGDirectDisplayID` dieses Bildschirms. Anders als der Index in /// `NSScreen.screens` überlebt sie ein Umstecken oder Umsortieren. public var displayID: CGDirectDisplayID { deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? CGDirectDisplayID ?? 0 } var isBuiltInDisplay: Bool { CGDisplayIsBuiltin(displayID) != 0 } /// Der Bildschirm mit der Menüleiste. /// /// Das ist der **erste** in `NSScreen.screens`, nicht `NSScreen.main` — /// letzteres ist der mit dem aktiven Fenster und wandert beim Klicken. var isMainDisplay: Bool { NSScreen.screens.first?.displayID == displayID } /// Reduziert den Bildschirm auf genau die Werte, die die Geometrie braucht. /// Alles Weitere bleibt draußen, damit `NotchGeometry` ohne Fenstersystem /// prüfbar bleibt. var onyxMetrics: ScreenMetrics { ScreenMetrics(frame: frame, safeAreaTop: safeAreaInsets.top, auxiliaryTopLeft: auxiliaryTopLeftArea, auxiliaryTopRight: auxiliaryTopRightArea, isBuiltIn: isBuiltInDisplay, menuBarHeight: onyxMenuBarHeight, isMain: isMainDisplay, displayID: displayID) } /// Die Höhe der Menüleiste auf diesem Bildschirm. /// /// `visibleFrame` lässt sie oben aus — die Differenz *ist* die Leiste. /// Bei einem Vollbildfenster ist die Differenz null; dann taugt sie nicht /// als Maß, und die Systemdicke tritt an ihre Stelle. var onyxMenuBarHeight: CGFloat { let measured = frame.maxY - visibleFrame.maxY return measured > 1 ? measured : NSStatusBar.system.thickness } /// Verdeckt gerade ein Vollbildfenster die Menüleiste? /// /// Es gibt keine öffentliche API, die „hier läuft ein Vollbildvideo" meldet. /// Der verlässliche Hinweis ist die verschwundene Menüleiste: bei echtem /// Vollbild reicht `visibleFrame` bis an die Oberkante von `frame`. var isShowingFullScreenWindow: Bool { frame.maxY - visibleFrame.maxY < 1 } }