Repository navigation
Conversation
Add an optional Spaces-style slide when switching virtual workspaces: the outgoing workspace slides off one edge while the incoming one slides in from the other. Direction follows workspace order, and next/prev keep their natural direction across wrap-around. New settings, independent of `animate` (off by default): - workspace_transition = "none" | "slide" - workspace_transition_duration (seconds, default 0.25) - workspace_transition_axis = "horizontal" | "vertical" Outgoing windows slide offscreen, then settle at their usual hidden park on the final frame, so the rest of the system sees the normal parked state. Windows are classified by geometry (`is_parked`), since macOS pulls parked windows up by their title bar. The slide falls back to the instant switch during drags and in low-power mode. Rapid switching stays cheap: - Each transition window keeps its own clock. A window retargeted mid-motion continues from its presented frame for a share of the duration matching the distance it has left, easing out instead of restarting from rest; windows a replacement does not handle finish on their original schedule, and each window ends its lease as soon as it lands. - A settled park frame is tagged `FrameSource::Park`, and the app actor skips the end-of-motion repair for it: macOS always clamps a park, so the rewrite could never succeed. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_018JyfUbLLYEiyoxyQ2vjRsy
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.
What
An optional Spaces-style slide when switching virtual workspaces. The outgoing workspace slides off one edge while the incoming one slides in from the other. The direction follows workspace order, and next/prev keep their natural direction across wrap-around. It's off by default and independent of
animate.We're open to changing this. If you'd prefer a different shape, for example a nested
[settings.workspace_transition]table, folding it into the existinganimation_*keys, or different names and values, we're happy to discuss and rework it.How it works
apply_layoutroutes the switch arrange to a newAnimationManager::workspace_transition_layoutwhen a direction is pending for that space.HiddenWindowPlacement::is_parkedtreats a window as parked if at most a sliver shows on either axis. macOS pulls parked windows back up by their title bar (a park requested at y=955 lands around y=924), so an exact match fails.instant_layout_innernow only cancels presentations whose pending target actually changed, so focus and raise arranges right after a switch don't cut the slide short.Rapid switching
Toggling workspaces quickly (⌥1 ⌥2 ⌥1 …) was expensive, so two changes affect the shared engine:
ActiveAnimation.Replacerestarted all windows on a fresh full duration, including windows that weren't retargeted.animate = truelayouts, since they sharereplace_with.FrameSource::Park.set_framewrites, one per outgoing window. Other AX traffic was unchanged.Testing
cargo +nightly fmt --all --check,cargo check --locked, and the full test suite pass.Park.🤖 Generated with Claude Code
https://claude.ai/code/session_018JyfUbLLYEiyoxyQ2vjRsy