Panel deckt die Menüleiste nicht mehr zu

Die Fläche reichte über die ganze Breite bis an die Bildschirmoberkante,
damit sie mit der schwarzen Notch zu einem Körper verschmilzt. Bei einer
Kachel ging das auf; bei sechs deckt sie die komplette Menüleiste zu, samt
aller Statuselemente.

Die Silhouette ist jetzt ein T: oben ein Steg in Notch-Breite, ab Unterkante
der Menüleiste die volle Fläche. Die Notch bleibt verschmolzen, die
Menüleiste bleibt frei.

Das allein hätte nur so ausgesehen, als wäre es gelöst. Das Fenster liegt
weiterhin über der Leiste, dort nur durchsichtig — und ein durchsichtiges
Fenster schluckt Klicks trotzdem. Die Trefferprüfung reicht sie jetzt
durch: links und rechts der Notch gehört der oberste Streifen der
Menüleiste.

Aus demselben Grund fragt der Koordinator nicht mehr den Fensterrahmen,
sondern die sichtbare Fläche. Wer den Rahmen befragt, hält einen Klick auf
ein fremdes Statuselement für einen Klick ins Panel — und einen Zeiger über
der Menüleiste für einen im Panel.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-08-11 17:44:07 +02:00
parent eff3c30a71
commit 68e53d3f6f
4 changed files with 186 additions and 94 deletions

View File

@@ -75,15 +75,25 @@ public final class NotchScreenController {
// groß wie das ausgefahrene Panel, damit die Animation Platz hat
// würde man `panel.frame` nehmen, hielte ein Zeiger in der noch leeren
// Fläche das Panel offen.
let inside = geometry.triggerRect.contains(point)
|| (presentation.isExpanded && panel.frame.contains(point))
let inside = geometry.triggerRect.contains(point) || containsVisiblePoint(point)
send(inside ? .pointerEntered : .pointerExited)
}
public func click() { send(.click) }
public func clickedOutside() { send(.clickedOutside) }
/// Für den Koordinator: wo das Panel gerade steht.
public var panelFrame: CGRect { panel.frame }
/// Ob ein Punkt auf der **sichtbaren** Fläche des Panels liegt.
///
/// Nicht `panel.frame`: das Fenster reicht bis an die Bildschirmoberkante
/// und ist links und rechts der Notch dort durchsichtig dieser Streifen
/// gehört der Menüleiste. Wer den Fensterrahmen befragt, hält einen Klick
/// auf ein fremdes Statuselement für einen Klick ins Panel.
public func containsVisiblePoint(_ point: CGPoint) -> Bool {
guard presentation.isExpanded, panel.frame.contains(point) else { return false }
let menuBarBand = panel.frame.maxY - geometry.rect.height
guard point.y > menuBarBand else { return true }
return abs(point.x - panel.frame.midX) <= geometry.rect.width / 2
}
public func escape() { send(.escape) }
public func setSuppressed(_ suppressed: Bool) {
guard suppressed != machine.isSuppressed else { return }