Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
e53143d
Add shortcuts to move surfaces between panes
Jul 23, 2026
254ebbd
Address pane movement review findings
Jul 23, 2026
a0d2aac
Test optional Iroh limiter configuration
lawrencecchen Jul 23, 2026
f99573a
Fix palette window routing visibility
Jul 23, 2026
452c0b9
Fix redundant await warning
Jul 23, 2026
f17accd
Fail closed without palette workspace window
Jul 23, 2026
17d86a4
Merge remote-tracking branch 'origin/main' into issue-8752-move-surfa…
Jul 23, 2026
8455d39
Test missing directional pane splits
Jul 24, 2026
5b9e97f
Create missing panes when moving surfaces
Jul 24, 2026
0b41d43
Use split lifecycle for moved surface refresh
Jul 24, 2026
941b1eb
dock: import CmuxWorkspaces where the restored-lifecycle extension ne…
ejc3 Jul 24, 2026
3a49357
dock: spell out two closure return types the compiler cannot infer
ejc3 Jul 24, 2026
94a329e
control-socket: return the resume-approval switch expression
ejc3 Jul 24, 2026
dde0b6a
Make pane move tests independent of insertion order
Jul 24, 2026
20dbdc9
Merge remote-tracking branch 'origin/main' into issue-8752-move-surfa…
Jul 24, 2026
30d71b0
Merge remote-tracking branch 'origin/pr-8857' into issue-8752-move-su…
Jul 24, 2026
cc1943d
Fix dock working directory test transfer fixture
Jul 24, 2026
c0b6881
Clarify adjacent shortcut routing alias
Jul 24, 2026
850c06a
Merge remote-tracking branch 'origin/main' into issue-8752-move-surfa…
Jul 24, 2026
09b71c3
Test repeated pane-move shortcuts stay bounded
Jul 24, 2026
7e3f1a5
Bound repeated directional pane moves
Jul 24, 2026
8034002
Fix WindowDock snapshot actor isolation
Jul 24, 2026
e7a9227
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
Jul 26, 2026
b6a2d08
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
austinywang Jul 27, 2026
e01134b
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
austinywang Jul 27, 2026
d9d5cdb
Merge remote-tracking branch 'origin/main' into issue-8752-move-surfa…
austinywang Jul 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,18 @@ extension ShortcutAction {
case .prevSurface: return ShortcutStroke(key: "[", command: true, shift: true)
case .moveSurfaceLeft: return ShortcutStroke(key: "[", command: true, shift: true, option: true)
case .moveSurfaceRight: return ShortcutStroke(key: "]", command: true, shift: true, option: true)
case .moveSurfaceToPreviousPane:
return ShortcutStroke(key: "[", command: true, shift: true, control: true)
case .moveSurfaceToNextPane:
return ShortcutStroke(key: "]", command: true, shift: true, control: true)
case .moveSurfaceToPaneLeft:
return ShortcutStroke(key: "←", command: true, shift: true, option: true)
case .moveSurfaceToPaneRight:
return ShortcutStroke(key: "→", command: true, shift: true, option: true)
case .moveSurfaceToPaneUp:
return ShortcutStroke(key: "↑", command: true, shift: true, option: true)
case .moveSurfaceToPaneDown:
return ShortcutStroke(key: "↓", command: true, shift: true, option: true)
case .selectSurfaceByNumber: return ShortcutStroke(key: "1", control: true)
case .selectWorkspaceByNumber: return ShortcutStroke(key: "1", command: true)
case .moveWorkspaceUp: return ShortcutStroke(key: "[", command: true, option: true, control: true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,20 @@ extension ShortcutAction {
case .triggerFlash: return "Flash Focused Panel"
case .nextSurface: return "Next Surface"
case .prevSurface: return "Previous Surface"
case .moveSurfaceLeft: return String(localized: "shortcut.moveSurfaceLeft.label", defaultValue: "Move Surface Left")
case .moveSurfaceRight: return String(localized: "shortcut.moveSurfaceRight.label", defaultValue: "Move Surface Right")
case .moveSurfaceLeft: return String(localized: "shortcut.moveSurfaceLeft.label", defaultValue: "Reorder Surface Left")
case .moveSurfaceRight: return String(localized: "shortcut.moveSurfaceRight.label", defaultValue: "Reorder Surface Right")
case .moveSurfaceToPreviousPane:
return String(localized: "shortcut.moveSurfaceToPreviousPane.label", defaultValue: "Move Surface to Previous Pane")
case .moveSurfaceToNextPane:
return String(localized: "shortcut.moveSurfaceToNextPane.label", defaultValue: "Move Surface to Next Pane")
case .moveSurfaceToPaneLeft:
return String(localized: "shortcut.moveSurfaceToPaneLeft.label", defaultValue: "Move Surface to Pane on Left")
case .moveSurfaceToPaneRight:
return String(localized: "shortcut.moveSurfaceToPaneRight.label", defaultValue: "Move Surface to Pane on Right")
case .moveSurfaceToPaneUp:
return String(localized: "shortcut.moveSurfaceToPaneUp.label", defaultValue: "Move Surface to Pane Above")
case .moveSurfaceToPaneDown:
return String(localized: "shortcut.moveSurfaceToPaneDown.label", defaultValue: "Move Surface to Pane Below")
case .selectSurfaceByNumber: return "Select Surface 1…9"
case .nextSidebarTab: return "Next Workspace"
case .prevSidebarTab: return "Previous Workspace"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,60 @@
extension ShortcutAction {
/// Which group this action belongs to in the settings pane.
public var group: Group {
switch self {
case .openSettings, .reloadConfiguration, .showHideAllWindows, .globalSearch,
.newWindow, .closeWindow, .toggleFullScreen, .quit:
return .app
case .toggleSidebar, .newTab, .newBrowserWorkspace, .saveLayoutTemplate, .openFolder, .reopenPreviousSession, .goToWorkspace,
.commandPalette, .commandPaletteNext, .commandPalettePrevious, .sendFeedback,
.showNotifications, .jumpToUnread, .toggleUnread, .markOldestUnreadAndJumpNext,
.focusRightSidebar, .switchRightSidebarToFiles, .switchRightSidebarToFind,
.switchRightSidebarToSessions, .switchRightSidebarToFeed,
.switchRightSidebarToDock, .triggerFlash, .reopenClosedWorkspace:
return .workspace
case .nextSurface, .prevSurface, .moveSurfaceLeft, .moveSurfaceRight,
.moveSurfaceToPreviousPane, .moveSurfaceToNextPane,
.moveSurfaceToPaneLeft, .moveSurfaceToPaneRight,
.moveSurfaceToPaneUp, .moveSurfaceToPaneDown,
.selectSurfaceByNumber,
.nextSidebarTab, .prevSidebarTab, .moveWorkspaceUp, .moveWorkspaceDown,
.focusHistoryBack, .focusHistoryForward, .selectWorkspaceByNumber,
.renameTab, .renameWorkspace, .editWorkspaceDescription,
.markWorkspaceDone, .cycleWorkspaceStatus, .toggleChecklistItemComplete,
.closeTab, .closeOtherTabsInPane, .closeWorkspace,
.newWorkspaceGroup, .groupSelectedWorkspaces,
.toggleFocusedWorkspaceGroupCollapsed, .reopenClosedBrowserPanel,
.newSurface, .toggleTerminalCopyMode, .focusTextBoxInput,
.cycleTextBoxSubmitAction, .attachTextBoxFile, .sendCtrlFToTerminal,
.clearScreenKeepScrollback:
return .navigation
case .focusLeft, .focusRight, .focusUp, .focusDown, .splitRight, .splitDown,
.toggleSplitZoom, .equalizeSplits, .splitBrowserRight, .splitBrowserDown,
.toggleRightSidebar, .fileExplorerOpenSelection, .fileExplorerOpenSelectionFinderAlias,
.toggleCanvasLayout, .canvasRevealFocusedPane, .canvasOverview,
.canvasZoomIn, .canvasZoomOut, .canvasZoomReset, .canvasTidy,
.canvasAlignLeft, .canvasAlignRight, .canvasAlignTop, .canvasAlignBottom,
.canvasEqualizeWidths, .canvasEqualizeHeights,
.canvasDistributeHorizontally, .canvasDistributeVertically,
.simulatorHome, .simulatorRotateLeft, .simulatorRotateRight,
.simulatorToggleAppearance, .simulatorToggleSoftwareKeyboard:
return .panes
case .openDiffViewer, .saveFilePreview, .openBrowser, .focusBrowserAddressBar,
.browserBack, .browserForward, .browserReload, .browserHardReload,
.browserZoomIn, .browserZoomOut, .browserZoomReset,
.markdownZoomIn, .markdownZoomOut, .markdownZoomReset,
.find, .findInDirectory, .findNext, .findPrevious,
.hideFind, .useSelectionForFind, .toggleBrowserDeveloperTools,
.showBrowserJavaScriptConsole, .toggleBrowserFocusMode, .toggleReactGrab,
.diffViewerScrollDown, .diffViewerScrollUp,
.diffViewerScrollHalfPageDown, .diffViewerScrollHalfPageUp,
.diffViewerScrollDownEmacs, .diffViewerScrollUpEmacs,
.diffViewerScrollToBottom, .diffViewerScrollToTop,
.diffViewerOpenFileSearch, .diffViewerNextFile, .diffViewerPreviousFile:
return .browser
}
}

/// Logical grouping used for sectioning the shortcuts pane.
public enum Group: String, CaseIterable, Sendable, Hashable {
/// Application-wide actions.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,18 @@ public enum ShortcutAction: String, CaseIterable, Sendable, Hashable, SettingCod
case moveSurfaceLeft
/// Moves the selected surface one position right.
case moveSurfaceRight
/// Moves the selected surface to the previous pane in spatial order.
case moveSurfaceToPreviousPane
/// Moves the selected surface to the next pane in spatial order.
case moveSurfaceToNextPane
/// Moves the selected surface to the pane on the left.
case moveSurfaceToPaneLeft
/// Moves the selected surface to the pane on the right.
case moveSurfaceToPaneRight
/// Moves the selected surface to the pane above.
case moveSurfaceToPaneUp
/// Moves the selected surface to the pane below.
case moveSurfaceToPaneDown
case selectSurfaceByNumber
case nextSidebarTab
case prevSidebarTab
Expand Down Expand Up @@ -186,54 +198,6 @@ public enum ShortcutAction: String, CaseIterable, Sendable, Hashable, SettingCod
}

extension ShortcutAction {
/// Which group this action belongs to in the settings pane.
public var group: Group {
switch self {
case .openSettings, .reloadConfiguration, .showHideAllWindows, .globalSearch,
.newWindow, .closeWindow, .toggleFullScreen, .quit:
return .app
case .toggleSidebar, .newTab, .newBrowserWorkspace, .saveLayoutTemplate, .openFolder, .reopenPreviousSession, .goToWorkspace,
.commandPalette, .commandPaletteNext, .commandPalettePrevious, .sendFeedback,
.showNotifications, .jumpToUnread, .toggleUnread, .markOldestUnreadAndJumpNext,
.focusRightSidebar, .switchRightSidebarToFiles, .switchRightSidebarToFind,
.switchRightSidebarToSessions, .switchRightSidebarToFeed,
.switchRightSidebarToDock, .triggerFlash, .reopenClosedWorkspace:
return .workspace
case .nextSurface, .prevSurface, .moveSurfaceLeft, .moveSurfaceRight, .selectSurfaceByNumber,
.nextSidebarTab, .prevSidebarTab, .moveWorkspaceUp, .moveWorkspaceDown, .focusHistoryBack, .focusHistoryForward,
.selectWorkspaceByNumber, .renameTab, .renameWorkspace,
.editWorkspaceDescription, .markWorkspaceDone, .cycleWorkspaceStatus, .toggleChecklistItemComplete, .closeTab, .closeOtherTabsInPane, .closeWorkspace,
.newWorkspaceGroup, .groupSelectedWorkspaces, .toggleFocusedWorkspaceGroupCollapsed,
.reopenClosedBrowserPanel, .newSurface, .toggleTerminalCopyMode,
.focusTextBoxInput, .cycleTextBoxSubmitAction, .attachTextBoxFile, .sendCtrlFToTerminal,
.clearScreenKeepScrollback:
return .navigation
case .focusLeft, .focusRight, .focusUp, .focusDown, .splitRight, .splitDown,
.toggleSplitZoom, .equalizeSplits, .splitBrowserRight, .splitBrowserDown,
.toggleRightSidebar, .fileExplorerOpenSelection, .fileExplorerOpenSelectionFinderAlias,
.toggleCanvasLayout, .canvasRevealFocusedPane, .canvasOverview,
.canvasZoomIn, .canvasZoomOut, .canvasZoomReset, .canvasTidy,
.canvasAlignLeft, .canvasAlignRight, .canvasAlignTop, .canvasAlignBottom,
.canvasEqualizeWidths, .canvasEqualizeHeights,
.canvasDistributeHorizontally, .canvasDistributeVertically,
.simulatorHome, .simulatorRotateLeft, .simulatorRotateRight,
.simulatorToggleAppearance, .simulatorToggleSoftwareKeyboard:
return .panes
case .openDiffViewer, .saveFilePreview, .openBrowser, .focusBrowserAddressBar, .browserBack,
.browserForward, .browserReload, .browserHardReload, .browserZoomIn, .browserZoomOut,
.browserZoomReset, .markdownZoomIn, .markdownZoomOut, .markdownZoomReset,
.find, .findInDirectory, .findNext, .findPrevious,
.hideFind, .useSelectionForFind, .toggleBrowserDeveloperTools,
.showBrowserJavaScriptConsole, .toggleBrowserFocusMode, .toggleReactGrab,
.diffViewerScrollDown, .diffViewerScrollUp,
.diffViewerScrollHalfPageDown, .diffViewerScrollHalfPageUp,
.diffViewerScrollDownEmacs, .diffViewerScrollUpEmacs, .diffViewerScrollToBottom,
.diffViewerScrollToTop, .diffViewerOpenFileSearch,
.diffViewerNextFile, .diffViewerPreviousFile:
return .browser
}
}

/// Whether this action binds the whole `1…9` digit range through a
/// single stored placeholder.
///
Expand Down
127 changes: 123 additions & 4 deletions Resources/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -63803,6 +63803,23 @@
}
}
},
"command.surfaceNavigation.subtitle": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Surface Navigation"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "サーフェスナビゲーション"
}
}
}
},
"command.switchExtensionSidebar.subtitle": {
"extractionState": "manual",
"localizations": {
Expand Down Expand Up @@ -202932,13 +202949,13 @@
"en": {
"stringUnit": {
"state": "translated",
"value": "Move Surface Left"
"value": "Reorder Surface Left"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "サーフェスを左へ移動"
"value": "サーフェスを左へ並べ替え"
}
}
}
Expand All @@ -202949,13 +202966,115 @@
"en": {
"stringUnit": {
"state": "translated",
"value": "Move Surface Right"
"value": "Reorder Surface Right"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "サーフェスを右へ並べ替え"
}
}
}
},
"shortcut.moveSurfaceToNextPane.label": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Move Surface to Next Pane"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "サーフェスを次のペインへ移動"
}
}
}
},
"shortcut.moveSurfaceToPaneDown.label": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Move Surface to Pane Below"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "サーフェスを下のペインへ移動"
}
}
}
},
"shortcut.moveSurfaceToPaneLeft.label": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Move Surface to Pane on Left"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "サーフェスを左のペインへ移動"
}
}
}
},
"shortcut.moveSurfaceToPaneRight.label": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Move Surface to Pane on Right"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "サーフェスを右のペインへ移動"
}
}
}
},
"shortcut.moveSurfaceToPaneUp.label": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Move Surface to Pane Above"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "サーフェスを上のペインへ移動"
}
}
}
},
"shortcut.moveSurfaceToPreviousPane.label": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Move Surface to Previous Pane"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "サーフェスを右へ移動"
"value": "サーフェスを前のペインへ移動"
}
}
}
Expand Down
Loading