Skip to content

v0.7.4 — Dock-Stable Layouts + One-Hop Updates

Choose a tag to compare

@ChiFungHillmanChan ChiFungHillmanChan released this 26 Jul 13:58
· 2 commits to main since this release

Scene V0.7.4 fixes a layout bug that only showed up on multi-display Macs — the Dock quietly moving your windows around — plus two smaller things: you can now see which layout is applied, and users far behind on versions update straight to the newest release instead of climbing one version at a time.

What's new

  • The Dock no longer drags your layout around. On a multi-display Mac the Dock follows your pointer, and macOS reserves space for it only on whichever display it currently sits on. Scene tiled into that reserved space, so moving the Dock to your other monitor and re-firing a layout resized and shifted every window by the Dock's height — defeating the sticky re-apply that V0.7.3 had just introduced. Scene now reserves the Dock's thickness on every display, so a layout's target rects depend only on your display arrangement. Re-apply is stationary no matter where the Dock has wandered.
  • Windows parked over the Dock are visible to Scene again. A window whose center sat in the Dock strip was previously dropped from the plan entirely — and dropped only while the Dock happened to be on that screen.
  • The menu bar panel ticks the layout you applied. A checkmark sits at the far right of the active layout's row and its name goes bold, so you can tell at a glance which layout is live without counting windows.
  • Updating from an old build goes straight to the newest release. Scene asked GitHub for releases/latest, which sounds like "newest version" but is defined as "most recent release sorted by the date of the commit its tag points at". Cut a hotfix from an older commit and that endpoint hands back the release it supersedes — so someone far behind could be offered an older build, install it, then be offered the next one on relaunch. Scene now reads the full release list and picks the highest version itself.

Why this matters

V0.7.3 made re-applying a layout non-destructive, which only works if "the same layout on the same screen" means the same rectangles every time. It didn't: NSScreen.visibleFrame made the tiling area a function of where your pointer had recently been, because that's what decides which display the Dock is on. Every window fell outside the 10 pt sticky tolerance and got re-assigned by z-order. The fix makes the geometry depend on your display arrangement alone, which is what everyone assumed it already did.

Trade-off worth knowing

The display your Dock is not on now reserves the Dock strip too — that's the cost of the tiling area no longer moving underneath you. If you run Dock auto-hide there's no cost at all, and single-display Macs are byte-identical to V0.7.3.

Under the hood

  • New TilingFrame replaces raw NSScreen.visibleFrame for all slot math. It reserves the Dock uniformly across screens (max of the left/bottom/right insets across the arrangement; the top inset stays per-screen because the menu bar doesn't follow the pointer). Since the Dock occupies exactly one display at a time, that maximum is its thickness and stays constant as it moves. Degenerate arrangements fall back to visibleFrame, and the maximum over a single screen is that screen's own visibleFrame — hence no change for single-display users.
  • DragSwapController and SeamResizeController are constructed with a visibleFrameOverride pointing at the same frame, so nearest-slot and seam-reflow math agree with where windows were actually placed.
  • AXWindowEnumerator's display-ownership test moves from visibleFrame to screen.frameframe is the correct question for "which display does this window belong to".
  • Coordinator.activeLayoutID is set on the success path of performApplyLayout only, so a fire that finds no windows or loses Accessibility mid-call never ticks a row your screen doesn't reflect. In-memory like Free Mode: after a relaunch nothing is ticked, because Scene can't know whether your windows are still tiled.
  • UpdateChecker lists releases?per_page=100, drops drafts and prereleases, and selects the highest tag with numeric per-component comparison — so v0.10.0 correctly beats v0.9.0, which a string sort gets backwards. The update banner also clears when no newer release exists, so it can't survive a manual DMG install.
  • Tests: 371 → 394. Twelve cases pin the Dock contract, including Dock-on-A vs Dock-on-B yielding identical frames and single-display identity in both Dock states. Eleven pin the release selector, including the out-of-order created_at case.
  • Universal binary (arm64 + x86_64), macOS 14+, Apple notarized.

Install

Download Scene-0.7.4.dmg below or via brew install --cask chifunghillmanchan/tap/scene. Drag Scene.app to /Applications, then follow docs/INSTALL.md for the one-time Accessibility-permission step.

Upgrade notes

V0.5.6+ users: click Update available in the menu bar and Scene swaps itself for the new bundle and relaunches; Accessibility permission survives the swap. No data migration, no changes to layouts, hotkeys, or workspaces.

If you run more than one display, expect your layouts to sit slightly differently the first time you fire one after upgrading — that's the Dock strip now being reserved consistently. It won't move again after that.