SIGSTOP WallpaperAgent and the aerial extensions while MusicManager
reports paused so the lockscreen Canvas holds its current frame, and
SIGCONT on resume, hide(), and willTerminate so the agent is never
left suspended.
Signed-off-by: Jis G Jacob <studiokeys@blissroms.org>
OSDUIHelper jetsam-exits when idle and launchd spawns a fresh PID on
the next media-key press, so the one-shot SIGSTOP only suppressed the
first incarnation. SystemOSDManager now polls for the PID after
kickstart and runs a background watcher that re-SIGSTOPs every new
incarnation, with state guarded by OSAllocatedUnfairLock. Watcher is
torn down on enableSystemHUD().
Fixes the legacy OSDUIHelper duplicate-HUD path in #419.
The macOS 26 Liquid Glass HUD (loginwindow -> BezelServices ->
ControlCenter SystemBannerService) is a separate render path gated by
the com.apple.private.system-banner-client entitlement and is not
suppressible from a regular user-space app; it needs a privileged
SMAppService helper and is out of scope here.
Signed-off-by: Jis G Jacob <studiokeys@blissroms.org>
The 1 GiB resident-size threshold is reasonable for a release build,
but Swift/SwiftUI debug builds plus the AVPlayer-backed Canvas video
pipeline and SkyLight overlay windows can easily exceed it during
normal Xcode-attached development. The restart-alert dialog firing
mid-development is disruptive and not actionable.
Keep the 1 GiB safety net on release, raise to 4 GiB in DEBUG so
developers running under Xcode aren't interrupted by spurious
restart prompts. The poll interval, cooldown, and alert text all
stay the same.
Signed-off-by: Jis G Jacob <studiokeys@blissroms.org>
Two fixes for the right-click-artwork-to-wallpaper flow on Spotify
tracks that have a Canvas video.
1. Force AllSpacesAndDisplays.Type and SystemDefault.Type to
"individual" while the artwork is active (was: keep existing
value via nil-coalescing). On macOS Tahoe the user-level
wallpaper rotation honors the parent Type field, so leaving it
as "folder" caused WallpaperAgent to advance to the next image
in a rotating wallpaper pack instead of honoring the patched
single-image / aerial choice. The original Type is preserved in
the plist backup at temp/atoll_wallpaper_backup.plist and is
restored byte-for-byte on dismiss, so rotation resumes normally
after the artwork is dismissed. The forced override is also
applied to nested Displays / Spaces blocks but only when Type
was already present, to avoid mutating block shapes that
intentionally omit it.
2. When the Canvas is expected at right-click time
(effectiveVideoURL != nil), defer applyArtworkToPlist and
restartWallpaperAgent entirely. Previously the flow applied raw
album art as the static wallpaper, restarted the agent, then
prepared and applied the aerial in a second restart, causing a
visible flash of the raw album cover. The deferred path stores
the blurred fallback URL in pendingFallbackStaticURL and only
touches the plist once: with the aerial on success, or with the
blurred album cover via applyDeferredStaticFallback if the
aerial asset prep or aerial-plist patch fails. The in-app
videoWindow continues to mask the desktop wallpaper during prep
on the unlocked screen; the lock screen simply transitions from
the existing wallpaper straight to the Canvas video.
The earlier ?? nil-coalescing in patchWallpaperEntries also covered
per-Display, per-Space.Default, and per-Space.Displays Type fields,
so those are forced too where present.
Signed-off-by: Jis G Jacob <studiokeys@blissroms.org>
The Spotify Canvas fallback layout previously centered the panel+artwork
group on screenFrame.midY, so the enlarged artwork tile could push up
into the row of circular widgets (battery, audio, AQI, weather).
Clamp maxCenterY against the bottom edge of both
LockScreenWeatherPanelManager.latestFrame and
LockScreenTimerWidgetPanelManager.latestFrame, with a 20pt clearance,
and guard against the clamp inverting via max(maxCenterY, minCenterY).
The panel reflows through the existing
.atollLockScreenPanelFrameDidChange notification, so the artwork
overlay window follows the new panel position automatically.
Signed-off-by: Jis G Jacob <studiokeys@blissroms.org>
Uses MusicKit MusicCatalogSearchRequest to find the current track, then
fetches editorialVideo.motionTallVideo3x4 HLS URL via MusicDataRequest.
The animated artwork URL is pre-fetched on track change and cached per
song for instant availability.
Adds NSAppleMusicUsageDescription to Info.plist for MusicKit
authorization.
Signed-off-by: Jis G Jacob <studiokeys@blissroms.org>
Right-click on the album art in the lock screen music panel to set it
as the desktop wallpaper. Right-click again or click anywhere on the
background to restore the original wallpaper. Wallpaper also restores
automatically on track change or screen unlock.
Uses direct plist manipulation of the wallpaper config to avoid leaving
traces in the wallpaper picker. Album art PNG is pre-cached in the
background on track change for instant application.
Adds video artwork URL fetching from iTunes catalog for Apple Music
tracks (musicVideo entity search).
Signed-off-by: Jis G Jacob <studiokeys@blissroms.org>
fix: stabilize terminal notch open/close, focus, and opacity
Improve terminal tab behavior in notch by preventing hover re-open races, keeping outside-click close logic accurate, and reliably restoring terminal opacity/translucency after remounts. Also ensure terminal receives focus on open and resigns cleanly on close so keyboard input and close/open cycles behave consistently.
- When lyrics was enabled the music widget would overlap the timers widget causing overlapped widgets which looks awful
Signed-off-by: Jis G Jacob <studiokeys@blissroms.org>
Adds an AirPlay device picker popover to the music player controls, allowing users to select and control volume for individual AirPlay devices (HomePod, Apple TV, AirPort Express, etc.) when Apple Music is the active player.
Calendars in the "Select Calendars" settings section are now grouped by their source account with color indicators, making it possible to distinguish calendars that share the same name across different accounts.
Each account group header includes a toggle to select or deselect all calendars in that group.