Rock-solid multi-display restore, safer coordinate conversions, and a Catalina-friendly remap UI.
Version: 1.10Date: October 20, 2025Category: Reliability / multi-display
Robust multi-display restore
Enhancements
Rock-solid multi-display restore — Windows now reliably restore to the correct monitor using robust screen attribution and a safer restore pipeline.
Smarter screen attribution (save) — Uses CoreGraphics display bounds with a configurable primary rule (center-in-bounds or largest overlap) plus nearest fallback to assign the correct display when capturing.
Stronger target screen resolution (restore) — Matches displays by exact saved bounds first, then nearest origin, then ID, then closest size to resist ID flips and cable swaps.
AX/AppKit conversion fixed — Coordinates are now converted relative to the main display's top-left (not the desktop union), preventing main-screen snapping.
Strict screen enforcement (optional) — A center-hop to the destination display before final placement helps stubborn apps land on the correct monitor.
Better window selection — For apps with multiple windows (Chrome, VS Code, etc.), the chosen window is now scored by title match and screen proximity.
Display remap UI (when screens are missing) — Presents a 10.15-friendly modal panel listing all connected displays with OK/Cancel and clear suggestions.
Grouped, readable logs — Save/restore output is grouped by display name with blank-line spacing; per-app restore sections are also separated for fast scanning.
Bug Fixes
Fixed windows restoring to the wrong monitor after sleep/reboot or cable swaps (bounds/origin matching + corrected coordinate conversions).
Fixed cases where only the Built-in display appeared in the remap prompt; all connected displays now appear consistently on macOS 10.15.
Fixed AX timing issues for apps like Microsoft Teams by polling for windows (and falling back to main/focused window) before restore.
Fixed incorrect Y-axis and union-frame math that could cause off-screen placement or main-screen snapping.
Fixed screen ID persistence issues by storing CGDirectDisplayID as unsigned bits in Core Data to avoid sign extension.