Repository navigation
cmux NEXT sidebar: multi-view prototype (navigate on release, drag without switching, on-screen rows lit) - #23437
Conversation
…view prototype (red) Debug Settings sidebar.multiView (off): the tunable, SidebarModel.onScreen and the row's isOnScreen state, with no behavior yet. SidebarMultiViewPressTests checks, frame by frame, that a press changes no selection until mouse-up, that a hold-then-drag keeps the shown workspace, and that every on-screen workspace row gets the soft fill. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ithout switching, on-screen rows highlighted Behind Debug Settings sidebar.multiView (off by default), Leo's item D: - a plain press on a workspace row selects nothing; the release on the same row navigates; - a hold-then-drag moves the row and leaves the shown workspace and the selection as they are; - every workspace in SidebarModel.onScreen draws the multi-selection's soft fill, the focused one the selection's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba7-3152-78b2-bfdf-bb6eb0d5a053&host=cosmic-gray
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
Owned by claude-sr2/sidebar-drag-bugs on cosmic-gray · session |
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by Tour of |
|
Bead |
|
|
|
Found 6 test failures on Blacksmith runners: Failures
|
|
Independent review (codex exec, read-only, head 371e4d2): VERDICT: PASS. No blockers. With the toggle off, behavior is unchanged. With it on, mouse-down defers navigation, mouse-up on the same row navigates once, and a drag never selects. Cancel, Escape, focus loss, rename, placeholders, modifier clicks, tab rows and the window handoff all bypass or clear the deferred click. |
…ebar-multiview # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Logic/SidebarTunables.swift
|
Shipped in:
|
…ger switches to it Leo 2026-10-21: "RIGHT CLICKING OR MOUSE DOWN DRAGGING ON A WORKSPACE SHOULDN'T BE IMMEDIATELY FOCUSING". - menu(for:) no longer clicks the right-clicked row: the menu is for that row (or the whole selection when the row is in it) and the shown workspace stays. - A plain press on a workspace row selects nothing; the release on the same row navigates and a drag moves the row without switching (the navigate-on-release path #23437 added behind sidebar.multiView, now the default). A control-click selects nothing. - Cmd/Shift-click keep changing the multi-selection on the press (they never switch the shown workspace). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray
…ger switches to it (#23977) * cmux NEXT sidebar: a right-click or a press on a workspace row no longer switches to it Leo 2026-10-21: "RIGHT CLICKING OR MOUSE DOWN DRAGGING ON A WORKSPACE SHOULDN'T BE IMMEDIATELY FOCUSING". - menu(for:) no longer clicks the right-clicked row: the menu is for that row (or the whole selection when the row is in it) and the shown workspace stays. - A plain press on a workspace row selects nothing; the release on the same row navigates and a drag moves the row without switching (the navigate-on-release path #23437 added behind sidebar.multiView, now the default). A control-click selects nothing. - Cmd/Shift-click keep changing the multi-selection on the press (they never switch the shown workspace). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray * cmux NEXT sidebar: Group Selected Workspaces acts on the right-clicked row's selection Review of #23977: with a right-click no longer selecting its row, the menu of a row outside a multi-selection showed Group Selected Workspaces and grouped the other rows. The action now takes WindowMembershipHandlers.workspaces (the selection only when it holds the target) for both its run and its visibility. The focus-loss drag test expects the shown row's fill, since the press no longer selects; stale comments updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… a drag puts the shown workspace back Lawrence 2026-10-21: "switching workspaces is very slow, we need to make it speed of light. on mousedown, instantly switch." #23977 (1794aca, Leo) moved the switch to the release so a press that drags would not switch; a click then waited for the mouse-up (about 80-150 ms of a person's click) before anything drew. - A plain press switches now (SidebarPress.switchedOnPress); its release sends nothing more. A drag past the threshold puts back the item and selection shown before the press (restorePressSwitch), so Leo's rule holds: a drag moves the row and leaves the shown workspace. The parked content makes both swaps warm. sidebar.multiView keeps navigate-on-release (#23437). - Off the switch path: SidebarLookedStore coalesces its JSON encode and defaults write (every switch wrote up to 256 stamps on main before the frame); showWorkspace's parked sweep asks the owner map, O(parked), not a Set of every member; sidebar arrow keys patch the two rows instead of reloading the list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… a drag puts the shown workspace back Lawrence 2026-10-21: "switching workspaces is very slow, we need to make it speed of light. on mousedown, instantly switch." #23977 (1794aca, Leo) moved the switch to the release so a press that drags would not switch; a click then waited for the mouse-up (about 80-150 ms of a person's click) before anything drew. - A plain press switches now (SidebarPress.switchedOnPress); its release sends nothing more. A drag past the threshold puts back the item and selection shown before the press (restorePressSwitch), so Leo's rule holds: a drag moves the row and leaves the shown workspace. The parked content makes both swaps warm. sidebar.multiView keeps navigate-on-release (#23437). - Off the switch path: SidebarLookedStore coalesces its JSON encode and defaults write (every switch wrote up to 256 stamps on main before the frame); showWorkspace's parked sweep asks the owner map, O(parked), not a Set of every member; sidebar arrow keys patch the two rows instead of reloading the list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Leo's sidebar item D (2026-10-21) asked to "do the Claude Code desktop multi-view better". This PR is a prototype behind the Debug Settings toggle
sidebar.multiView(Sidebar section, "Navigate on release (multi-view prototype)"), off by default. With the toggle off, nothing changes.With it on:
WorkspaceMerge).SidebarModel.onScreenlists the workspaces the window has on screen. Their rows draw the multi-selection's soft fill (Palette.secondarySelectionFill), and the focused row keeps the selection's fill. A change to the set repaints only the row fills (syncRowStates), without a reload.The Chrome, Claude desktop and Codex comparison is in cmuxterm-hq#2746 (
knowledge/inspiration/sidebars.md).Not built yet:
onScreenin the App yet; the model and the drawing are here and tested.These need the multi-workspace content view first; that is the next step.
SidebarModel's selection methods moved unchanged toSidebarModel+Selection.swiftso the file shrinks instead of growing.Changelog
none (Debug-only prototype, off by default)
Tests
SidebarMultiViewPressTestsis the per-frame test. After each mouse event it lays the list out and draws a frame, then checks the selection, the shown workspace and the filled rows. The red commit has the toggle, the model field and the row state with no behavior.cmux-ci run --class light --script scripts/ci/package-test-lane.sh --arg=suite --arg=Packages/macOS/CmuxNext --arg=SidebarMultiViewPressTests --env CMUX_CI_XCODE_APP=/Applications/Xcode_26.6.app --ref <sha>active=ywhereactive=xwas expected; the drag switched to the lifted row; no on-screen fills were drawn. The two toggle-off tests passed.SidebarPointerGestureTests(the existing click, drag and stale-drag behavior, toggle off) on the same head: 9 of 9 passed.The base's CmuxNext test target doesn't compile right now (#23363
isReadOnly, #23386PaletteMenuVocabularyTests). Both fleet runs had those two one-line fixes on top, on scratch refs (scratch/smv-before,scratch/smv-after). This branch itself carries neither.No capture: nothing visible changes with the Debug toggle off, which is the default. With it on, the App doesn't fill the on-screen set yet, so the press and drag behavior is proven by the per-frame test above.
Observed / Not run
scripts/cmux-next/prepush-gate.py(no new violations); the god-file check against base (SidebarModel.swiftshrank from 615 to 564 lines).onScreenyet, so a capture would only show the press and drag behavior. No full CmuxNext suite.🤖 Generated with Claude Code
Agent session: cosmic-gray