Repository navigation
Resize adjacent snapped windows with a draggable divider - #1907
Draft
kiteretsu903 wants to merge 7 commits into
Draft
kiteretsu903 wants to merge 7 commits into
kiteretsu903 wants to merge 7 commits into
Conversation
kiteretsu903
force-pushed
the
fix/review-window-dividers
branch
2 times, most recently
from
October 10, 2026 02:51
b9773fb to
706710b
Compare
kiteretsu903
force-pushed
the
fix/review-window-dividers
branch
from
October 14, 2026 01:46
706710b to
0ba8225
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds the off-by-default “Drag dividers to resize adjacent windows” option under Adjacent Windows. Eligible side-by-side or top/bottom windows placed by Rectangle expose a handle near their shared boundary. Dragging previews a new split; releasing applies the pair placement. Double-clicking requests an equal split.
Behavior and boundaries
Optional enhanced transitions
“Enhanced transitions” captures the background once per drag on macOS 14 or later with Screen Recording permission. The guide and moving outlines render separately. Capture failure, missing permission, or a late result falls back to the basic guide. Basic divider use requires no capture permission.
Implementation and dependencies
Pair discovery, drag geometry, verified pair placement, and optional capture live within the divider feature. The change reuses the shared placement coordinator and Glass support. It contains no learned-size store, management UI, or preview-only size tracking. It does not depend on Layout Helper; when both are present, a small interaction hook coordinates their sessions.
Validation
The shared Glass geometry tests also passed after correcting an assertion that mixed a new material’s model frame with its parent’s previous rendered frame. Model and presentation geometry are now checked separately, with a bounded requirement for rendered samples. This follow-up changes tests only.
The current branch passed a signed Debug build and all 622 XCTest tests, including rounded-size settlement, fixed-axis/wholly-ignored resize handling, off-screen entry retention, click-through event targeting, cross-axis pair eligibility, reported-minimum warnings, and Escape rollback after the first write. Native acceptance on macOS 27.2 / Apple silicon passed first/repeated drags and equal reset on both axes, changed native reported minimums on the same pair, odd-point gaps, cancellation before release, moved/disabled-pair invalidation, and real enhanced background capture followed by cancellation, and recovery after temporary covering-window removal. The 7-method native suite additionally routes a synthetic unrelated left-click through SnappingManager during real AX/WindowServer settlement and verifies both windows finish. This checks manager integration; it does not claim a physical mouse reproduction of every WindowServer event field. An earlier native interaction run used the secondary display because a Notification Center surface obscured the primary divider. The current regression run used the primary display after a Notification Center surface covered the secondary test area; the obstructed runs correctly hid the handle and are retained in the local test logs.
An earlier run exposed a stale AX preparation snapshot: lowering the app-reported minimum still constrained the next drag to the old value. Hover preparation now refreshes the snapshot on its existing background worker. The native regression reproduces the old failure on both axes and passes after the fix. No learned or persisted size limit is reintroduced.
The basic native drag also passed with enhanced transitions enabled and a test-only unavailable-permission result; system TCC settings were unchanged. The automated native suite uses an isolated AppKit fixture and actual AX/WindowServer writes; test-only input seams route through the native panel callbacks. Installed application and preference state were restored and verified. The demo below predates the standalone rebase.
An earlier physical-input acceptance run used global macOS mouse and keyboard events with the test pointer overrides disabled. Native hover, first and repeated drags, and double-click equal-split reset passed for both side-by-side and top/bottom pairs. Escape during an active divider drag passed on the second connected display, leaving both windows unchanged. The installed binary, saved preferences, and pointer position were restored afterward.
This replaces the corresponding part of #1890.
Demo
10-window-dividers.mp4
Window animation is disabled. Recorded with the combined build and only this feature and its required visual options enabled.
Settings