Update for frame resampling using TimelineView, but locks at 120FPS

This commit is contained in:
Hariharan Mudaliar 2026-01-23 12:20:17 +05:30
commit 5990fbac06
No known key found for this signature in database
GPG key ID: 025583EB0BE5640E
4 changed files with 25 additions and 9 deletions

View file

@ -114,8 +114,10 @@ struct ExtensionLockScreenWidgetView: View {
@ViewBuilder @ViewBuilder
private func liquidGlassBackground(shape: RoundedRectangle) -> some View { private func liquidGlassBackground(shape: RoundedRectangle) -> some View {
LiquidGlassBackground(variant: requestedLiquidGlassVariant, cornerRadius: descriptor.cornerRadius) { TimelineView(.animation) { context in
Color.black.opacity(0.08) LiquidGlassBackground(variant: requestedLiquidGlassVariant, cornerRadius: descriptor.cornerRadius, trigger: context.date.timeIntervalSinceReferenceDate) {
Color.black.opacity(0.08)
}
} }
.overlay { .overlay {
tintOverlay(shape: shape) tintOverlay(shape: shape)

View file

@ -781,8 +781,10 @@ struct LockScreenMusicPanel: View {
@ViewBuilder @ViewBuilder
private var customLiquidPanelBackdrop: some View { private var customLiquidPanelBackdrop: some View {
LiquidGlassBackground(variant: musicGlassVariant, cornerRadius: panelCornerRadius) { TimelineView(.animation) { context in
Color.white.opacity(0.04) LiquidGlassBackground(variant: musicGlassVariant, cornerRadius: panelCornerRadius, trigger: context.date.timeIntervalSinceReferenceDate) {
Color.white.opacity(0.04)
}
} }
.frame(maxWidth: .infinity, maxHeight: .infinity) .frame(maxWidth: .infinity, maxHeight: .infinity)
.allowsHitTesting(false) .allowsHitTesting(false)
@ -860,8 +862,10 @@ struct LockScreenMusicPanel: View {
@ViewBuilder @ViewBuilder
private func customLiquidAlbumArtBackground(cornerRadius: CGFloat) -> some View { private func customLiquidAlbumArtBackground(cornerRadius: CGFloat) -> some View {
LiquidGlassBackground(variant: musicGlassVariant, cornerRadius: cornerRadius) { TimelineView(.animation) { context in
Color.clear LiquidGlassBackground(variant: musicGlassVariant, cornerRadius: cornerRadius, trigger: context.date.timeIntervalSinceReferenceDate) {
Color.clear
}
} }
} }

View file

@ -136,8 +136,10 @@ struct LockScreenTimerWidget: View {
} }
private var customLiquidBackground: some View { private var customLiquidBackground: some View {
LiquidGlassBackground(variant: timerGlassVariant, cornerRadius: Self.cornerRadius) { TimelineView(.animation) { context in
Color.black.opacity(0.12) LiquidGlassBackground(variant: timerGlassVariant, cornerRadius: Self.cornerRadius, trigger: context.date.timeIntervalSinceReferenceDate) {
Color.black.opacity(0.12)
}
} }
} }

View file

@ -44,7 +44,7 @@ public struct LiquidGlassBackground<Content: View>: NSViewRepresentable {
private let content: Content private let content: Content
private let cornerRadius: CGFloat private let cornerRadius: CGFloat
private let variant: LiquidGlassVariant private let variant: LiquidGlassVariant
private let trigger: Double
/// Creates a new liquid‑glass container. /// Creates a new liquid‑glass container.
/// - Parameters: /// - Parameters:
/// - variant: Any ``LiquidGlassVariant`` (0–19). Defaults to `.v11`, which is visually super pleasing /// - variant: Any ``LiquidGlassVariant`` (0–19). Defaults to `.v11`, which is visually super pleasing
@ -53,10 +53,12 @@ public struct LiquidGlassBackground<Content: View>: NSViewRepresentable {
public init( public init(
variant: LiquidGlassVariant = .defaultVariant, variant: LiquidGlassVariant = .defaultVariant,
cornerRadius: CGFloat = 10, cornerRadius: CGFloat = 10,
trigger: Double = 0,
@ViewBuilder content: () -> Content @ViewBuilder content: () -> Content
) { ) {
self.variant = variant self.variant = variant
self.cornerRadius = cornerRadius self.cornerRadius = cornerRadius
self.trigger = trigger
self.content = content() self.content = content()
} }
@ -130,5 +132,11 @@ public struct LiquidGlassBackground<Content: View>: NSViewRepresentable {
} }
nsView.setValue(cornerRadius, forKey: "cornerRadius") nsView.setValue(cornerRadius, forKey: "cornerRadius")
callPrivateVariantSetter(on: nsView, value: variant.rawValue) callPrivateVariantSetter(on: nsView, value: variant.rawValue)
// Micro-jitter: imperceptibly adjust opacity so WindowServer re-samples the wallpaper every frame.
let jitter = sin(trigger * 100) * 0.000001
nsView.alphaValue = 1.0 - CGFloat(abs(jitter))
nsView.needsDisplay = true
} }
} }