Skip to content

v0.7.3 — Sticky Re-apply + Persistent Menu Panel

Choose a tag to compare

@ChiFungHillmanChan ChiFungHillmanChan released this 26 Jul 13:21
· 5 commits to main since this release

Scene V0.7.3 fixes the most annoying thing about re-using a layout: re-firing it no longer reshuffles the windows that were already sitting in it. The menu bar dropdown also stops closing every time you click something in it.

What's new

  • Re-applying a layout keeps placed windows where they are. Open Quads with four windows, close one, open a different app, then click Quads again: the three windows still in their slots do not move, and only the new window slides into the freed slot. Previously every window was re-mapped by z-order, so one small change reshuffled the whole screen. Windows you drag-swapped keep their swapped positions across re-applies too, and windows nudged slightly out of place snap back to exact alignment.
  • The menu bar dropdown stays open while you use it. Clicking Free Mode, a layout, or a workspace no longer dismisses it — you can toggle Free Mode off and fire a layout in a single visit instead of opening the menu twice. Checkmarks and the active-workspace mark now update live in front of you rather than on the next open. The panel closes when you click outside it, press Escape, or open Settings.

Why this matters

Scene's layouts were previously all-or-nothing: any re-fire was a full re-shuffle, which made "just put this new window in the empty slot" impossible — you had to accept every other window moving too. Sticky re-apply makes a layout something you can return to incrementally, which is how people actually work through a day. And the dropdown change removes the one interaction in the app that punished you for using it: toggling Free Mode off, only to have the menu close before you could do the thing you turned it off for.

Under the hood

  • LayoutEngine.plan now runs a sticky pass before assignment: a window whose current frame matches a slot rect within 10 pt (via the existing rectsApproxEqual) claims that slot, then remaining windows fill remaining slots in z-order, and leftovers minimize as before. Stateless by design — no persisted window→slot map that can go stale when windows close and reopen. Switching to a different layout still remaps everything by z-order, since no frame matches the new slot rects.
  • Placement carries an explicit slotIndex. Sticky assignment can claim slots {0, 2, 3} while slot 1 stays free, so placements are no longer index-parallel to layout.slots; the drag-swap and seam-resize window→slot snapshot reads the field instead of inferring the slot from array position.
  • MenuBarExtra moves from .menu to .window style. Native macOS menus always dismiss on item click and that is not overridable, so the dropdown is now a 280 pt panel of custom rows carrying the same content, order, thumbnails, hotkey glyphs, and localization strings as the old menu — no new strings, all three locales unchanged.
  • Tests: 363 → 371. Eight new cases pin the sticky contract, including the exact close-one-add-one scenario, swap preservation, overflow, and the 8 pt vs 12 pt tolerance edges.
  • Universal binary (arm64 + x86_64), macOS 14+, Apple notarized.

Known limitation

Apps that refuse Accessibility resize requests — Apple's own System Settings is the usual one — never land exactly on a slot rect, so they are not recognized as already-placed and may still be re-slotted when you re-fire a layout.

Install

Download Scene-0.7.3.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.