Repository navigation
v1.3
Three fixes since v1.2, all targeting long-session stability on macOS Tahoe.
Bug fixes
Multi-hour freeze / black-screen-on-restart — MAX_TTM_SLOTS was 6 (mis-copied from MAX_BMP_SLOTS). Visitor and final scenes reference TTM slot 6, so adsAddScene silently skipped loading that slot and then indexed out of range. Inside the legacyScreenSaver host this manifested as a runaway Swift exclusivity spin on the main thread, only triggered after hours when the 11-day scheduler happened to pick an affected scene. Slot count corrected to 10 (matching jc_reborn and the Go port). Fixes #7.
Settings not persisting across screensaver restarts — On macOS Tahoe the configure sheet, preview process, and full-screen process each run in separate sandboxed containers. ScreenSaverDefaults writes were invisible across processes. Fixed via distributed notifications (with payload encoded in the object field, which unlike userInfo survives the sandbox) plus a direct ByHost plist write as a belt-and-suspenders fallback.
Audio playing on all monitors — macOS starts one legacyScreenSaver instance per display. Audio is now gated to the main screen only.
Also includes: a background-thread stall watchdog (MainThreadStallMonitor) that logs a breadcrumb and engine-state snapshot to the unified log when the main thread stops making progress — the diagnostic that pinpointed the freeze above.