Die Breite kam vom **schmalsten** aktiven Bildschirm — mit der Begründung, dasselbe Panel erscheine überall. Ein Fernseher widerlegt das: bei 720 Punkten Breite bleiben drei Spalten, vier Widgets brechen auf zwei Reihen um, und das Panel wird hoch statt breit. Auf dem Notebook, wo achtmal Platz gewesen wäre. Jetzt rechnet jeder Bildschirm für sich. Der Koordinator kennt seine Bildschirme ohnehin und reicht die Kennung schon durch — sie wurde nur nicht benutzt. Die zweite Hälfte war, dass es nach dem Abstecken so blieb: die Größe wurde einmal gerechnet und nie wieder. `NSScreen` meldet sich nicht bei SwiftUI, also gibt es jetzt einen mitgezählten Bildschirmwechsel, den die Ansicht mitliest, und beim Wechsel werden die Fenstergrößen neu gesetzt — verzögert um einen Durchlauf, damit der Koordinator seine Fenster vorher neu aufgebaut hat. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
36 lines
1.3 KiB
Swift
36 lines
1.3 KiB
Swift
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
|
|
}
|
|
|
|
/// 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,
|
|
displayID: displayID)
|
|
}
|
|
|
|
/// 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
|
|
}
|
|
}
|