From 5990fbac0606e73b651d3592ba12b9124dd4157e Mon Sep 17 00:00:00 2001 From: Hariharan Mudaliar Date: Fri, 23 Jan 2026 12:20:17 +0530 Subject: [PATCH 1/3] Update for frame resampling using TimelineView, but locks at 120FPS --- .../Extensions/ExtensionLockScreenWidgetView.swift | 6 ++++-- .../components/LockScreen/LockScreenMusicPanel.swift | 12 ++++++++---- .../LockScreen/LockScreenTimerWidget.swift | 6 ++++-- DynamicIsland/helpers/LiquidGlassBackground.swift | 10 +++++++++- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/DynamicIsland/components/Extensions/ExtensionLockScreenWidgetView.swift b/DynamicIsland/components/Extensions/ExtensionLockScreenWidgetView.swift index f12625f..f6baa01 100644 --- a/DynamicIsland/components/Extensions/ExtensionLockScreenWidgetView.swift +++ b/DynamicIsland/components/Extensions/ExtensionLockScreenWidgetView.swift @@ -114,8 +114,10 @@ struct ExtensionLockScreenWidgetView: View { @ViewBuilder private func liquidGlassBackground(shape: RoundedRectangle) -> some View { - LiquidGlassBackground(variant: requestedLiquidGlassVariant, cornerRadius: descriptor.cornerRadius) { - Color.black.opacity(0.08) + TimelineView(.animation) { context in + LiquidGlassBackground(variant: requestedLiquidGlassVariant, cornerRadius: descriptor.cornerRadius, trigger: context.date.timeIntervalSinceReferenceDate) { + Color.black.opacity(0.08) + } } .overlay { tintOverlay(shape: shape) diff --git a/DynamicIsland/components/LockScreen/LockScreenMusicPanel.swift b/DynamicIsland/components/LockScreen/LockScreenMusicPanel.swift index 6e796e8..8d74e46 100644 --- a/DynamicIsland/components/LockScreen/LockScreenMusicPanel.swift +++ b/DynamicIsland/components/LockScreen/LockScreenMusicPanel.swift @@ -781,8 +781,10 @@ struct LockScreenMusicPanel: View { @ViewBuilder private var customLiquidPanelBackdrop: some View { - LiquidGlassBackground(variant: musicGlassVariant, cornerRadius: panelCornerRadius) { - Color.white.opacity(0.04) + TimelineView(.animation) { context in + LiquidGlassBackground(variant: musicGlassVariant, cornerRadius: panelCornerRadius, trigger: context.date.timeIntervalSinceReferenceDate) { + Color.white.opacity(0.04) + } } .frame(maxWidth: .infinity, maxHeight: .infinity) .allowsHitTesting(false) @@ -860,8 +862,10 @@ struct LockScreenMusicPanel: View { @ViewBuilder private func customLiquidAlbumArtBackground(cornerRadius: CGFloat) -> some View { - LiquidGlassBackground(variant: musicGlassVariant, cornerRadius: cornerRadius) { - Color.clear + TimelineView(.animation) { context in + LiquidGlassBackground(variant: musicGlassVariant, cornerRadius: cornerRadius, trigger: context.date.timeIntervalSinceReferenceDate) { + Color.clear + } } } diff --git a/DynamicIsland/components/LockScreen/LockScreenTimerWidget.swift b/DynamicIsland/components/LockScreen/LockScreenTimerWidget.swift index def01d6..2c0e6f7 100644 --- a/DynamicIsland/components/LockScreen/LockScreenTimerWidget.swift +++ b/DynamicIsland/components/LockScreen/LockScreenTimerWidget.swift @@ -136,8 +136,10 @@ struct LockScreenTimerWidget: View { } private var customLiquidBackground: some View { - LiquidGlassBackground(variant: timerGlassVariant, cornerRadius: Self.cornerRadius) { - Color.black.opacity(0.12) + TimelineView(.animation) { context in + LiquidGlassBackground(variant: timerGlassVariant, cornerRadius: Self.cornerRadius, trigger: context.date.timeIntervalSinceReferenceDate) { + Color.black.opacity(0.12) + } } } diff --git a/DynamicIsland/helpers/LiquidGlassBackground.swift b/DynamicIsland/helpers/LiquidGlassBackground.swift index b8d8f7f..f251b47 100644 --- a/DynamicIsland/helpers/LiquidGlassBackground.swift +++ b/DynamicIsland/helpers/LiquidGlassBackground.swift @@ -44,7 +44,7 @@ public struct LiquidGlassBackground: NSViewRepresentable { private let content: Content private let cornerRadius: CGFloat private let variant: LiquidGlassVariant - + private let trigger: Double /// Creates a new liquid‑glass container. /// - Parameters: /// - variant: Any ``LiquidGlassVariant`` (0–19). Defaults to `.v11`, which is visually super pleasing @@ -53,10 +53,12 @@ public struct LiquidGlassBackground: NSViewRepresentable { public init( variant: LiquidGlassVariant = .defaultVariant, cornerRadius: CGFloat = 10, + trigger: Double = 0, @ViewBuilder content: () -> Content ) { self.variant = variant self.cornerRadius = cornerRadius + self.trigger = trigger self.content = content() } @@ -130,5 +132,11 @@ public struct LiquidGlassBackground: NSViewRepresentable { } nsView.setValue(cornerRadius, forKey: "cornerRadius") 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 } } From 850bdc592b000c8d88d9c55e4a3f8bb8b60c1966 Mon Sep 17 00:00:00 2001 From: Hariharan Mudaliar Date: Fri, 23 Jan 2026 12:37:17 +0530 Subject: [PATCH 2/3] Cap Liquid Glass Effect to 30FPS for reduced GPU throttling --- .../components/Extensions/ExtensionLockScreenWidgetView.swift | 2 +- .../components/LockScreen/LockScreenMusicPanel.swift | 4 ++-- .../components/LockScreen/LockScreenTimerWidget.swift | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/DynamicIsland/components/Extensions/ExtensionLockScreenWidgetView.swift b/DynamicIsland/components/Extensions/ExtensionLockScreenWidgetView.swift index f6baa01..32863b4 100644 --- a/DynamicIsland/components/Extensions/ExtensionLockScreenWidgetView.swift +++ b/DynamicIsland/components/Extensions/ExtensionLockScreenWidgetView.swift @@ -114,7 +114,7 @@ struct ExtensionLockScreenWidgetView: View { @ViewBuilder private func liquidGlassBackground(shape: RoundedRectangle) -> some View { - TimelineView(.animation) { context in + TimelineView(.periodic(from: .now, by: 1.0 / 30.0)) { context in LiquidGlassBackground(variant: requestedLiquidGlassVariant, cornerRadius: descriptor.cornerRadius, trigger: context.date.timeIntervalSinceReferenceDate) { Color.black.opacity(0.08) } diff --git a/DynamicIsland/components/LockScreen/LockScreenMusicPanel.swift b/DynamicIsland/components/LockScreen/LockScreenMusicPanel.swift index 8d74e46..590a212 100644 --- a/DynamicIsland/components/LockScreen/LockScreenMusicPanel.swift +++ b/DynamicIsland/components/LockScreen/LockScreenMusicPanel.swift @@ -781,7 +781,7 @@ struct LockScreenMusicPanel: View { @ViewBuilder private var customLiquidPanelBackdrop: some View { - TimelineView(.animation) { context in + TimelineView(.periodic(from: .now, by: 1.0 / 30.0)) { context in LiquidGlassBackground(variant: musicGlassVariant, cornerRadius: panelCornerRadius, trigger: context.date.timeIntervalSinceReferenceDate) { Color.white.opacity(0.04) } @@ -862,7 +862,7 @@ struct LockScreenMusicPanel: View { @ViewBuilder private func customLiquidAlbumArtBackground(cornerRadius: CGFloat) -> some View { - TimelineView(.animation) { context in + TimelineView(.periodic(from: .now, by: 1.0 / 30.0)) { context in LiquidGlassBackground(variant: musicGlassVariant, cornerRadius: cornerRadius, trigger: context.date.timeIntervalSinceReferenceDate) { Color.clear } diff --git a/DynamicIsland/components/LockScreen/LockScreenTimerWidget.swift b/DynamicIsland/components/LockScreen/LockScreenTimerWidget.swift index 2c0e6f7..f59c898 100644 --- a/DynamicIsland/components/LockScreen/LockScreenTimerWidget.swift +++ b/DynamicIsland/components/LockScreen/LockScreenTimerWidget.swift @@ -136,7 +136,7 @@ struct LockScreenTimerWidget: View { } private var customLiquidBackground: some View { - TimelineView(.animation) { context in + TimelineView(.periodic(from: .now, by: 1.0 / 30.0)) { context in LiquidGlassBackground(variant: timerGlassVariant, cornerRadius: Self.cornerRadius, trigger: context.date.timeIntervalSinceReferenceDate) { Color.black.opacity(0.12) } From 465d6e089ab551779b928e9ee147a2759f17dcef Mon Sep 17 00:00:00 2001 From: Hariharan Mudaliar Date: Fri, 23 Jan 2026 13:12:22 +0530 Subject: [PATCH 3/3] BugFix: Lock Screen Widgets going away to other screens --- .../LockScreenDisplayContextProvider.swift | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/DynamicIsland/managers/LockScreenDisplayContextProvider.swift b/DynamicIsland/managers/LockScreenDisplayContextProvider.swift index 933f172..e181185 100644 --- a/DynamicIsland/managers/LockScreenDisplayContextProvider.swift +++ b/DynamicIsland/managers/LockScreenDisplayContextProvider.swift @@ -1,4 +1,5 @@ import AppKit +import CoreGraphics struct LockScreenDisplayContext { let screen: NSScreen @@ -30,7 +31,7 @@ final class LockScreenDisplayContextProvider { @discardableResult func refresh(reason: String) -> LockScreenDisplayContext? { - guard let screen = NSScreen.main ?? NSScreen.screens.first else { + guard let screen = preferredLockScreen() else { context = nil return nil } @@ -52,6 +53,29 @@ final class LockScreenDisplayContextProvider { return refresh(reason: "snapshot-miss") } + private func preferredLockScreen() -> NSScreen? { + if let builtin = NSScreen.screens.first(where: { screen in + guard let number = screen.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? NSNumber else { + return false + } + return CGDisplayIsBuiltin(CGDirectDisplayID(number.uint32Value)) != 0 + }) { + return builtin + } + + let mainDisplayID = CGMainDisplayID() + if let mainScreen = NSScreen.screens.first(where: { screen in + guard let number = screen.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? NSNumber else { + return false + } + return CGDirectDisplayID(number.uint32Value) == mainDisplayID + }) { + return mainScreen + } + + return NSScreen.main ?? NSScreen.screens.first + } + private func registerObservers() { screenChangeObserver = NotificationCenter.default.addObserver( forName: NSApplication.didChangeScreenParametersNotification,