From ecba8206e4c8cac76dd3e6f8844204abfda03dfd Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Thu, 04 Jun 2026 17:24:20 +0800
Subject: [PATCH] make quick switch overlay full bleed
---
C1.source/Sources/Aligner/QuickSwitchRootView.swift | 80 +++++++++++++++++++++++-----------------
1 files changed, 46 insertions(+), 34 deletions(-)
diff --git a/C1.source/Sources/Aligner/QuickSwitchRootView.swift b/C1.source/Sources/Aligner/QuickSwitchRootView.swift
index 739b941..41973d4 100644
--- a/C1.source/Sources/Aligner/QuickSwitchRootView.swift
+++ b/C1.source/Sources/Aligner/QuickSwitchRootView.swift
@@ -10,6 +10,7 @@
@MainActor
final class QuickSwitchRootView: NSView {
private let backgroundLayer = CAGradientLayer()
+ private let safeAreaFillLayer = CALayer()
private let glassLayer = CALayer()
private let laneLayer = CALayer()
private let spaceLaneContentLayer = CALayer()
@@ -116,6 +117,14 @@
static let normalGap: CGFloat = 16
static let minGap: CGFloat = 8
static let maxRows = 2
+ }
+
+ private enum RootLayoutMetrics {
+ static let horizontalMargin: CGFloat = 24
+ static let topContentMargin: CGFloat = 24
+ static let shelfGap: CGFloat = 16
+ static let waterfallTopGap: CGFloat = 14
+ static let bottomMargin: CGFloat = 34
}
private enum WaterfallMetrics {
@@ -443,7 +452,12 @@
"viewClass": String(describing: Self.self),
"isLayerBacked": wantsLayer,
"bounds": dictionary(from: bounds),
+ "safeAreaTopInset": Double(topSafeAreaInset),
+ "safeAreaFillFrame": dictionary(from: safeAreaFillLayer.frame),
"glassFrame": dictionary(from: glassLayer.frame),
+ "glassCornerRadius": Double(glassLayer.cornerRadius),
+ "glassBorderWidth": Double(glassLayer.borderWidth),
+ "glassShadowOpacity": Double(glassLayer.shadowOpacity),
"spaceLaneFrame": dictionary(from: laneLayer.frame),
"spaceLaneContentWidth": Double(spaceLaneContentWidth),
"spaceLaneVisibleWidth": Double(laneLayer.bounds.width),
@@ -1174,14 +1188,14 @@
backgroundLayer.endPoint = CGPoint(x: 0.5, y: 0.0)
rootLayer.addSublayer(backgroundLayer)
- glassLayer.cornerRadius = 24
- glassLayer.backgroundColor = NSColor.windowBackgroundColor.withAlphaComponent(0.72).cgColor
- glassLayer.borderColor = NSColor.separatorColor.withAlphaComponent(0.35).cgColor
- glassLayer.borderWidth = 1
- glassLayer.shadowColor = NSColor.black.cgColor
- glassLayer.shadowOpacity = 0.16
- glassLayer.shadowRadius = 24
- glassLayer.shadowOffset = CGSize(width: 0, height: -8)
+ safeAreaFillLayer.backgroundColor = NSColor.black.cgColor
+ rootLayer.addSublayer(safeAreaFillLayer)
+
+ glassLayer.cornerRadius = 0
+ glassLayer.backgroundColor = NSColor.clear.cgColor
+ glassLayer.borderColor = NSColor.clear.cgColor
+ glassLayer.borderWidth = 0
+ glassLayer.shadowOpacity = 0
rootLayer.addSublayer(glassLayer)
laneLayer.backgroundColor = NSColor.controlBackgroundColor.withAlphaComponent(0.50).cgColor
@@ -1251,17 +1265,12 @@
badge.masksToBounds = true
let selectedIndicator = CALayer()
- selectedIndicator.cornerRadius = 2
- selectedIndicator.backgroundColor = (item.appGroupIndex == selectedAppGroupIndex
- ? NSColor.controlAccentColor
- : NSColor.clear
- ).cgColor
+ selectedIndicator.isHidden = true
container.addSublayer(background)
container.addSublayer(icon)
container.addSublayer(label)
container.addSublayer(badge)
- container.addSublayer(selectedIndicator)
appShelfContentLayer.addSublayer(container)
return AppShelfItemLayers(
@@ -1464,33 +1473,40 @@
backgroundLayer.frame = bounds
- let horizontalInset = max(36, bounds.width * 0.045)
- let topInset = max(36, bounds.height * 0.055)
- glassLayer.frame = bounds.insetBy(dx: horizontalInset, dy: topInset)
+ let safeAreaTopInset = topSafeAreaInset
+ safeAreaFillLayer.frame = CGRect(
+ x: 0,
+ y: max(0, bounds.height - safeAreaTopInset),
+ width: bounds.width,
+ height: safeAreaTopInset
+ )
+ safeAreaFillLayer.isHidden = safeAreaTopInset <= 0.5
+ glassLayer.frame = bounds
let contentBounds = glassLayer.bounds
- let horizontalMargin: CGFloat = 22
+ let horizontalMargin = RootLayoutMetrics.horizontalMargin
+ let topMargin = safeAreaTopInset + RootLayoutMetrics.topContentMargin
let laneHeight = min(104, max(82, contentBounds.height * 0.12))
let availableContentWidth = contentBounds.width - horizontalMargin * 2
appShelfLayout = appShelfLayout(for: availableContentWidth)
let shelfHeight = appShelfHeight(forRows: appShelfLayout.rows)
laneLayer.frame = CGRect(
x: horizontalMargin,
- y: contentBounds.height - horizontalMargin - laneHeight,
+ y: contentBounds.height - topMargin - laneHeight,
width: availableContentWidth,
height: laneHeight
)
shelfLayer.frame = CGRect(
x: horizontalMargin,
- y: laneLayer.frame.minY - 16 - shelfHeight,
+ y: laneLayer.frame.minY - RootLayoutMetrics.shelfGap - shelfHeight,
width: laneLayer.frame.width,
height: shelfHeight
)
waterfallLayer.frame = CGRect(
x: shelfLayer.frame.minX,
- y: 34,
+ y: RootLayoutMetrics.bottomMargin,
width: shelfLayer.frame.width,
- height: shelfLayer.frame.minY - 48
+ height: max(1, shelfLayer.frame.minY - RootLayoutMetrics.bottomMargin - RootLayoutMetrics.waterfallTopGap)
)
layoutSpaceLaneSegments()
@@ -1498,6 +1514,10 @@
layoutWaterfallColumns()
CATransaction.commit()
+ }
+
+ private var topSafeAreaInset: CGFloat {
+ max(0, window?.screen?.safeAreaInsets.top ?? safeAreaInsets.top)
}
private func appShelfLayout(for availableWidth: CGFloat) -> AppShelfLayout {
@@ -1837,21 +1857,13 @@
: NSColor.controlAccentColor.withAlphaComponent(0.90)
).cgColor
item.badgeLayer.frame = CGRect(
- x: iconX + visualIconSize - badgeWidth + 3,
- y: iconY + visualIconSize - 14,
+ x: iconX - 3,
+ y: iconY - 2,
width: badgeWidth,
height: 16
)
- item.selectedIndicatorLayer.frame = CGRect(
- x: bounds.midX - 8,
- y: 0,
- width: 16,
- height: 4
- )
- item.selectedIndicatorLayer.backgroundColor = (isSelected
- ? NSColor.controlAccentColor
- : NSColor.clear
- ).cgColor
+ item.selectedIndicatorLayer.frame = .zero
+ item.selectedIndicatorLayer.backgroundColor = NSColor.clear.cgColor
}
private func appShelfRows() -> [[AppShelfItemLayers]] {
--
Gitblit v1.9.3