detached 0c37670

Merge pull request 'refactor(config)!: rename workspace up/down actions to prev/next' (#12) from refactor/workspace-prev-next into main

commit
0c37670ba31655923e99047c11777b7d0ec4ff8f
author
bnema · · 2026-10-07 07:35 UTC
merge of
1cd4666 + 888535e · diff against the first parent
signature
unsigned
20 files · +133 -123
M README.md +8 -8
@@ -261,14 +261,14 @@ bind.cmd+shift+s = toggle-window-stash
261261 bind.cmd+o = toggle-overview
262262
263263 # Workspaces
264-bind.cmd+pageup = focus-workspace-up
265-bind.cmd+pagedown = focus-workspace-down
266-bind.cmd+shift+pageup = move-column-to-workspace-up
267-bind.cmd+shift+pagedown = move-column-to-workspace-down
268-bind.cmd+ctrl+shift+up = move-workspace-up
269-bind.cmd+ctrl+shift+down = move-workspace-down
270-bind.cmd+ctrl+shift+k = move-workspace-up
271-bind.cmd+ctrl+shift+j = move-workspace-down
264+bind.cmd+pageup = focus-workspace-prev
265+bind.cmd+pagedown = focus-workspace-next
266+bind.cmd+shift+pageup = move-column-to-workspace-prev
267+bind.cmd+shift+pagedown = move-column-to-workspace-next
268+bind.cmd+ctrl+shift+up = move-workspace-prev
269+bind.cmd+ctrl+shift+down = move-workspace-next
270+bind.cmd+ctrl+shift+k = move-workspace-prev
271+bind.cmd+ctrl+shift+j = move-workspace-next
272272 bind.cmd+code:2 = focus-workspace 1
273273 bind.cmd+code:3 = focus-workspace 2
274274 bind.cmd+code:4 = focus-workspace 3
@@ -261,14 +261,14 @@ bind.cmd+shift+s = toggle-window-stash
261 bind.cmd+o = toggle-overview261 bind.cmd+o = toggle-overview
262 262
263 # Workspaces263 # Workspaces
264-bind.cmd+pageup = focus-workspace-up264+bind.cmd+pageup = focus-workspace-prev
265-bind.cmd+pagedown = focus-workspace-down265+bind.cmd+pagedown = focus-workspace-next
266-bind.cmd+shift+pageup = move-column-to-workspace-up266+bind.cmd+shift+pageup = move-column-to-workspace-prev
267-bind.cmd+shift+pagedown = move-column-to-workspace-down267+bind.cmd+shift+pagedown = move-column-to-workspace-next
268-bind.cmd+ctrl+shift+up = move-workspace-up268+bind.cmd+ctrl+shift+up = move-workspace-prev
269-bind.cmd+ctrl+shift+down = move-workspace-down269+bind.cmd+ctrl+shift+down = move-workspace-next
270-bind.cmd+ctrl+shift+k = move-workspace-up270+bind.cmd+ctrl+shift+k = move-workspace-prev
271-bind.cmd+ctrl+shift+j = move-workspace-down271+bind.cmd+ctrl+shift+j = move-workspace-next
272 bind.cmd+code:2 = focus-workspace 1272 bind.cmd+code:2 = focus-workspace 1
273 bind.cmd+code:3 = focus-workspace 2273 bind.cmd+code:3 = focus-workspace 2
274 bind.cmd+code:4 = focus-workspace 3274 bind.cmd+code:4 = focus-workspace 3
M docs/config.md +14 -14
@@ -148,7 +148,7 @@ In scroll and fixed layouts with `natural-scroll = off`, a swipe left shows the
148148
149149 With `animations = off`, nothing moves during the swipe: when the fingers lift, a quick or long enough swipe navigates content or workspaces along the layout's axes. Cascade band swipes stop at the first and last band.
150150
151-Over the shown stash a sideways swipe slides it with the fingers, with a stop on each window, and moves one window at most. In scroll and fixed layouts where the view cannot scroll (a floating or fullscreen window, fixed overflow, or a named workspace), a quick swipe runs `focus-column-left/right` or `focus-workspace-up/down` when the fingers lift. Cascade keeps horizontal workspace navigation; vertical band swipes do nothing while a floating or fullscreen window has focus.
151+Over the shown stash a sideways swipe slides it with the fingers, with a stop on each window, and moves one window at most. In scroll and fixed layouts where the view cannot scroll (a floating or fullscreen window, fixed overflow, or a named workspace), a quick swipe runs `focus-column-left/right` or `focus-workspace-prev/next` when the fingers lift. Cascade keeps horizontal workspace navigation; vertical band swipes do nothing while a floating or fullscreen window has focus.
152152
153153 Two-finger scroll goes to the window under the pointer with the touchpad's timestamps, so apps with kinetic scrolling keep their inertia.
154154
@@ -194,7 +194,7 @@ Set `layout.overflow = cascade` globally, per output, or on a named workspace. C
194194
195195 Left/right focus follows column order across band boundaries. Up/down visits stacked windows first, then the closest column in the adjacent band. Column width presets and resizing do nothing; window height shares still apply. Maximizing a column hides its same-band siblings until focus moves or maximization ends.
196196
197-Three-finger vertical swipes scroll bands; horizontal swipes switch workspaces. Scroll and fixed workspaces retain their existing gesture axes. A switch keeps the source workspace's axis throughout its transition; the destination's axes apply to the next gesture. The `focus-workspace-up/down` commands still mean previous/next workspace, even when the transition is horizontal. Four-finger and stash gestures keep their existing behaviour.
197+Three-finger vertical swipes scroll bands; horizontal swipes switch workspaces. Scroll and fixed workspaces retain their existing gesture axes. A switch keeps the source workspace's axis throughout its transition; the destination's axes apply to the next gesture. The `focus-workspace-prev/next` commands switch to the previous or next workspace, whether the transition is vertical or horizontal. Four-finger and stash gestures keep their existing behaviour.
198198
199199 The overview presents bands side by side in one workspace card. Selecting a window reveals its band. Cascade supports dropping onto tiles, but not gap insertion or edge scrolling during a drag.
200200
@@ -219,13 +219,13 @@ The overview presents bands side by side in one workspace card. Selecting a wind
219219 | `set-column-width <+N%\|-N%>` | Widen or narrow the focused column by N% of the usable width (1-100), between 10% and 100%. The new width stays until changed; `cycle-column-width` then restarts at the first preset. Does nothing in fixed overflow |
220220 | `set-window-height <+N%\|-N%>` | Give the focused window N% more or less of its column's height; the other rows give or take it in proportion. Each row keeps at least 10%. A window joining or leaving the column resets equal rows. Does nothing past 9 rows |
221221 | `consume-or-expel-window-left/right` | A lone window joins the neighbor column; a stacked one leaves for a new column |
222-| `focus-workspace <N>` / `focus-workspace-up/down` | Show a numbered or neighbor workspace |
222+| `focus-workspace <N>` / `focus-workspace-prev/next` | Show a numbered or neighbor workspace |
223223 | `workspace <name>` | Toggle a named workspace |
224-| `move-column-to-workspace <N>` / `-up/-down` | Move the focused column |
225-| `move-window-to-workspace <N>` / `-up/-down` | Move only the focused window |
224+| `move-column-to-workspace <N>` / `-prev/-next` | Move the focused column |
225+| `move-window-to-workspace <N>` / `-prev/-next` | Move only the focused window |
226226 | `focus-monitor-left/right` / `focus-monitor-up/down` | Focus the neighbor monitor in that direction |
227227 | `move-workspace-to-monitor-left/right` / `move-workspace-to-monitor-up/down` | Move the workspace to the neighbor monitor in that direction; it gets a new home |
228-| `move-workspace-up/down` | Swap the current numbered workspace with its neighbor; the view follows it. It never passes the empty workspace at the end |
228+| `move-workspace-prev/next` | Swap the current numbered workspace with its neighbor; the view follows it. It never passes the empty workspace at the end |
229229 | `scale-up` / `scale-down` | Zoom the whole display; one second after the last press, the scale is saved to `output.<name>.scale` and a notification confirms it (`notify-send`) |
230230 | `quit` | Exit NeferWL |
231231
@@ -257,7 +257,7 @@ The drop can be on another monitor; focus follows the window. There, the middle
257257
258258 ### Overview
259259
260-`toggle-overview` shows scaled previews of the current workspace, including over fullscreen windows, over a background darkened by `floating.dim`. Windows keep their size and previews show their last frames. Covering floats and windows hidden behind a maximized column in `fixed` overflow appear as cards: the on-screen item is in front, hidden columns share one spiral-layout card, up to two cards behind peek above it, and passed cards peek below. Neighbor workspaces show dimmed stacks. Each monitor has one vertical overview. A named workspace appears directly below the numbered workspace from which its `workspace <name>` bind was invoked. Invoking it from another numbered workspace updates this placement; browsing the overview does not. Several named workspaces attached to the same numbered workspace follow configuration order, with horizontal rules separating their group from numbered rows. Named-to-named binds reuse the source's numbered attachment. Unattached named workspaces follow the last occupied numbered row, or the first row if all numbered workspaces are empty. The selected workspace stays centred and its immediate neighbors appear above and below; rows and stash previews keep their full width. Empty workspaces are skipped unless currently selected or serving as the invocation anchor of a visible named row. Named workspaces remain outside the numbered list and normal workspace up/down navigation. Smaller floats, such as dialogs, stay hidden. A fullscreen floating window, or any fullscreen window with `fixed` overflow, is its workspace's front card, with the windows it hides behind it; `scroll` overflow keeps its columns selectable in one card. Choosing the fullscreen window keeps it fullscreen; choosing another window leaves fullscreen.
260+`toggle-overview` shows scaled previews of the current workspace, including over fullscreen windows, over a background darkened by `floating.dim`. Windows keep their size and previews show their last frames. Covering floats and windows hidden behind a maximized column in `fixed` overflow appear as cards: the on-screen item is in front, hidden columns share one spiral-layout card, up to two cards behind peek above it, and passed cards peek below. Neighbor workspaces show dimmed stacks. Each monitor has one vertical overview. A named workspace appears directly below the numbered workspace from which its `workspace <name>` bind was invoked. Invoking it from another numbered workspace updates this placement; browsing the overview does not. Several named workspaces attached to the same numbered workspace follow configuration order, with horizontal rules separating their group from numbered rows. Named-to-named binds reuse the source's numbered attachment. Unattached named workspaces follow the last occupied numbered row, or the first row if all numbered workspaces are empty. The selected workspace stays centred and its immediate neighbors appear above and below; rows and stash previews keep their full width. Empty workspaces are skipped unless currently selected or serving as the invocation anchor of a visible named row. Named workspaces remain outside the numbered list and normal previous/next workspace navigation. Smaller floats, such as dialogs, stay hidden. A fullscreen floating window, or any fullscreen window with `fixed` overflow, is its workspace's front card, with the windows it hides behind it; `scroll` overflow keeps its columns selectable in one card. Choosing the fullscreen window keeps it fullscreen; choosing another window leaves fullscreen.
261261
262262 | Key | Action |
263263 | --- | --- |
@@ -266,7 +266,7 @@ The drop can be on another monitor; focus follows the window. There, the middle
266266 | `return` | Show the selected front card; picking a hidden column moves the maximization to it. Other rows shown keep their focus, maximization and float order |
267267 | `escape` | Return to the original workspace; every row shown keeps its focus, maximization and float order |
268268
269-The focus binds (`focus-column-left/right`, `focus-window-up/down`, `cmd+arrows` by default) move the selection like these keys. In the overview, `focus-workspace-up/down` also traverse cards before crossing workspace rows, including named ones, except inside a selected stash pile.
269+The focus binds (`focus-column-left/right`, `focus-window-up/down`, `cmd+arrows` by default) move the selection like these keys. In the overview, `focus-workspace-prev/next` also traverse cards before crossing workspace rows, including named ones, except inside a selected stash pile.
270270
271271 Each workspace's [stash](#stash), hidden or not, shows as a pile of cards on the left of its row, which stays centred unless it would overlap the pile: its selected window in front, up to three others behind it, dimmed. In the pile, `k` / `j` or up/down browse stash cards and stop at either end without changing workspace. Right (`l`) leaves the pile immediately; left (`h`) stays in the pile. On a stash-only workspace, right deselects the pile so up/down can change workspace. Browsing brings the selected card to the front without reordering the stash. `return` or a click on a card closes the overview with the stash shown on that window.
272272
@@ -311,10 +311,10 @@ With `keyboard.cmd = alt`, the `cmd+alt+…` binds have the same keys as `cmd+
311311 | `cmd+q` | `close-window` |
312312 | `ctrl+alt+backspace` | `quit` |
313313 | `ctrl+cmd+space` | `spawn fuzzel` |
314-| `cmd+pageup` | `focus-workspace-up` |
315-| `cmd+pagedown` | `focus-workspace-down` |
316-| `cmd+shift+pageup` | `move-column-to-workspace-up` |
317-| `cmd+shift+pagedown` | `move-column-to-workspace-down` |
314+| `cmd+pageup` | `focus-workspace-prev` |
315+| `cmd+pagedown` | `focus-workspace-next` |
316+| `cmd+shift+pageup` | `move-column-to-workspace-prev` |
317+| `cmd+shift+pagedown` | `move-column-to-workspace-next` |
318318 | `cmd+code:2` | `focus-workspace 1` |
319319 | `cmd+code:3` | `focus-workspace 2` |
320320 | `cmd+code:4` | `focus-workspace 3` |
@@ -343,7 +343,7 @@ With `keyboard.cmd = alt`, the `cmd+alt+…` binds have the same keys as `cmd+
343343 | `cmd+ctrl+shift+right` | `move-workspace-to-monitor-right` |
344344 | `cmd+ctrl+shift+h` | `move-workspace-to-monitor-left` |
345345 | `cmd+ctrl+shift+l` | `move-workspace-to-monitor-right` |
346-| `cmd+ctrl+shift+up` / `cmd+ctrl+shift+k` | `move-workspace-up` |
347-| `cmd+ctrl+shift+down` / `cmd+ctrl+shift+j` | `move-workspace-down` |
346+| `cmd+ctrl+shift+up` / `cmd+ctrl+shift+k` | `move-workspace-prev` |
347+| `cmd+ctrl+shift+down` / `cmd+ctrl+shift+j` | `move-workspace-next` |
348348 | `cmd+code:13` | `scale-up` |
349349 | `cmd+code:12` | `scale-down` |
@@ -148,7 +148,7 @@ In scroll and fixed layouts with `natural-scroll = off`, a swipe left shows the
148 148
149 With `animations = off`, nothing moves during the swipe: when the fingers lift, a quick or long enough swipe navigates content or workspaces along the layout's axes. Cascade band swipes stop at the first and last band.149 With `animations = off`, nothing moves during the swipe: when the fingers lift, a quick or long enough swipe navigates content or workspaces along the layout's axes. Cascade band swipes stop at the first and last band.
150 150
151-Over the shown stash a sideways swipe slides it with the fingers, with a stop on each window, and moves one window at most. In scroll and fixed layouts where the view cannot scroll (a floating or fullscreen window, fixed overflow, or a named workspace), a quick swipe runs `focus-column-left/right` or `focus-workspace-up/down` when the fingers lift. Cascade keeps horizontal workspace navigation; vertical band swipes do nothing while a floating or fullscreen window has focus.151+Over the shown stash a sideways swipe slides it with the fingers, with a stop on each window, and moves one window at most. In scroll and fixed layouts where the view cannot scroll (a floating or fullscreen window, fixed overflow, or a named workspace), a quick swipe runs `focus-column-left/right` or `focus-workspace-prev/next` when the fingers lift. Cascade keeps horizontal workspace navigation; vertical band swipes do nothing while a floating or fullscreen window has focus.
152 152
153 Two-finger scroll goes to the window under the pointer with the touchpad's timestamps, so apps with kinetic scrolling keep their inertia.153 Two-finger scroll goes to the window under the pointer with the touchpad's timestamps, so apps with kinetic scrolling keep their inertia.
154 154
@@ -194,7 +194,7 @@ Set `layout.overflow = cascade` globally, per output, or on a named workspace. C
194 194
195 Left/right focus follows column order across band boundaries. Up/down visits stacked windows first, then the closest column in the adjacent band. Column width presets and resizing do nothing; window height shares still apply. Maximizing a column hides its same-band siblings until focus moves or maximization ends.195 Left/right focus follows column order across band boundaries. Up/down visits stacked windows first, then the closest column in the adjacent band. Column width presets and resizing do nothing; window height shares still apply. Maximizing a column hides its same-band siblings until focus moves or maximization ends.
196 196
197-Three-finger vertical swipes scroll bands; horizontal swipes switch workspaces. Scroll and fixed workspaces retain their existing gesture axes. A switch keeps the source workspace's axis throughout its transition; the destination's axes apply to the next gesture. The `focus-workspace-up/down` commands still mean previous/next workspace, even when the transition is horizontal. Four-finger and stash gestures keep their existing behaviour.197+Three-finger vertical swipes scroll bands; horizontal swipes switch workspaces. Scroll and fixed workspaces retain their existing gesture axes. A switch keeps the source workspace's axis throughout its transition; the destination's axes apply to the next gesture. The `focus-workspace-prev/next` commands switch to the previous or next workspace, whether the transition is vertical or horizontal. Four-finger and stash gestures keep their existing behaviour.
198 198
199 The overview presents bands side by side in one workspace card. Selecting a window reveals its band. Cascade supports dropping onto tiles, but not gap insertion or edge scrolling during a drag.199 The overview presents bands side by side in one workspace card. Selecting a window reveals its band. Cascade supports dropping onto tiles, but not gap insertion or edge scrolling during a drag.
200 200
@@ -219,13 +219,13 @@ The overview presents bands side by side in one workspace card. Selecting a wind
219 | `set-column-width <+N%\|-N%>` | Widen or narrow the focused column by N% of the usable width (1-100), between 10% and 100%. The new width stays until changed; `cycle-column-width` then restarts at the first preset. Does nothing in fixed overflow |219 | `set-column-width <+N%\|-N%>` | Widen or narrow the focused column by N% of the usable width (1-100), between 10% and 100%. The new width stays until changed; `cycle-column-width` then restarts at the first preset. Does nothing in fixed overflow |
220 | `set-window-height <+N%\|-N%>` | Give the focused window N% more or less of its column's height; the other rows give or take it in proportion. Each row keeps at least 10%. A window joining or leaving the column resets equal rows. Does nothing past 9 rows |220 | `set-window-height <+N%\|-N%>` | Give the focused window N% more or less of its column's height; the other rows give or take it in proportion. Each row keeps at least 10%. A window joining or leaving the column resets equal rows. Does nothing past 9 rows |
221 | `consume-or-expel-window-left/right` | A lone window joins the neighbor column; a stacked one leaves for a new column |221 | `consume-or-expel-window-left/right` | A lone window joins the neighbor column; a stacked one leaves for a new column |
222-| `focus-workspace <N>` / `focus-workspace-up/down` | Show a numbered or neighbor workspace |222+| `focus-workspace <N>` / `focus-workspace-prev/next` | Show a numbered or neighbor workspace |
223 | `workspace <name>` | Toggle a named workspace |223 | `workspace <name>` | Toggle a named workspace |
224-| `move-column-to-workspace <N>` / `-up/-down` | Move the focused column |224+| `move-column-to-workspace <N>` / `-prev/-next` | Move the focused column |
225-| `move-window-to-workspace <N>` / `-up/-down` | Move only the focused window |225+| `move-window-to-workspace <N>` / `-prev/-next` | Move only the focused window |
226 | `focus-monitor-left/right` / `focus-monitor-up/down` | Focus the neighbor monitor in that direction |226 | `focus-monitor-left/right` / `focus-monitor-up/down` | Focus the neighbor monitor in that direction |
227 | `move-workspace-to-monitor-left/right` / `move-workspace-to-monitor-up/down` | Move the workspace to the neighbor monitor in that direction; it gets a new home |227 | `move-workspace-to-monitor-left/right` / `move-workspace-to-monitor-up/down` | Move the workspace to the neighbor monitor in that direction; it gets a new home |
228-| `move-workspace-up/down` | Swap the current numbered workspace with its neighbor; the view follows it. It never passes the empty workspace at the end |228+| `move-workspace-prev/next` | Swap the current numbered workspace with its neighbor; the view follows it. It never passes the empty workspace at the end |
229 | `scale-up` / `scale-down` | Zoom the whole display; one second after the last press, the scale is saved to `output.<name>.scale` and a notification confirms it (`notify-send`) |229 | `scale-up` / `scale-down` | Zoom the whole display; one second after the last press, the scale is saved to `output.<name>.scale` and a notification confirms it (`notify-send`) |
230 | `quit` | Exit NeferWL |230 | `quit` | Exit NeferWL |
231 231
@@ -257,7 +257,7 @@ The drop can be on another monitor; focus follows the window. There, the middle
257 257
258 ### Overview258 ### Overview
259 259
260-`toggle-overview` shows scaled previews of the current workspace, including over fullscreen windows, over a background darkened by `floating.dim`. Windows keep their size and previews show their last frames. Covering floats and windows hidden behind a maximized column in `fixed` overflow appear as cards: the on-screen item is in front, hidden columns share one spiral-layout card, up to two cards behind peek above it, and passed cards peek below. Neighbor workspaces show dimmed stacks. Each monitor has one vertical overview. A named workspace appears directly below the numbered workspace from which its `workspace <name>` bind was invoked. Invoking it from another numbered workspace updates this placement; browsing the overview does not. Several named workspaces attached to the same numbered workspace follow configuration order, with horizontal rules separating their group from numbered rows. Named-to-named binds reuse the source's numbered attachment. Unattached named workspaces follow the last occupied numbered row, or the first row if all numbered workspaces are empty. The selected workspace stays centred and its immediate neighbors appear above and below; rows and stash previews keep their full width. Empty workspaces are skipped unless currently selected or serving as the invocation anchor of a visible named row. Named workspaces remain outside the numbered list and normal workspace up/down navigation. Smaller floats, such as dialogs, stay hidden. A fullscreen floating window, or any fullscreen window with `fixed` overflow, is its workspace's front card, with the windows it hides behind it; `scroll` overflow keeps its columns selectable in one card. Choosing the fullscreen window keeps it fullscreen; choosing another window leaves fullscreen.260+`toggle-overview` shows scaled previews of the current workspace, including over fullscreen windows, over a background darkened by `floating.dim`. Windows keep their size and previews show their last frames. Covering floats and windows hidden behind a maximized column in `fixed` overflow appear as cards: the on-screen item is in front, hidden columns share one spiral-layout card, up to two cards behind peek above it, and passed cards peek below. Neighbor workspaces show dimmed stacks. Each monitor has one vertical overview. A named workspace appears directly below the numbered workspace from which its `workspace <name>` bind was invoked. Invoking it from another numbered workspace updates this placement; browsing the overview does not. Several named workspaces attached to the same numbered workspace follow configuration order, with horizontal rules separating their group from numbered rows. Named-to-named binds reuse the source's numbered attachment. Unattached named workspaces follow the last occupied numbered row, or the first row if all numbered workspaces are empty. The selected workspace stays centred and its immediate neighbors appear above and below; rows and stash previews keep their full width. Empty workspaces are skipped unless currently selected or serving as the invocation anchor of a visible named row. Named workspaces remain outside the numbered list and normal previous/next workspace navigation. Smaller floats, such as dialogs, stay hidden. A fullscreen floating window, or any fullscreen window with `fixed` overflow, is its workspace's front card, with the windows it hides behind it; `scroll` overflow keeps its columns selectable in one card. Choosing the fullscreen window keeps it fullscreen; choosing another window leaves fullscreen.
261 261
262 | Key | Action |262 | Key | Action |
263 | --- | --- |263 | --- | --- |
@@ -266,7 +266,7 @@ The drop can be on another monitor; focus follows the window. There, the middle
266 | `return` | Show the selected front card; picking a hidden column moves the maximization to it. Other rows shown keep their focus, maximization and float order |266 | `return` | Show the selected front card; picking a hidden column moves the maximization to it. Other rows shown keep their focus, maximization and float order |
267 | `escape` | Return to the original workspace; every row shown keeps its focus, maximization and float order |267 | `escape` | Return to the original workspace; every row shown keeps its focus, maximization and float order |
268 268
269-The focus binds (`focus-column-left/right`, `focus-window-up/down`, `cmd+arrows` by default) move the selection like these keys. In the overview, `focus-workspace-up/down` also traverse cards before crossing workspace rows, including named ones, except inside a selected stash pile.269+The focus binds (`focus-column-left/right`, `focus-window-up/down`, `cmd+arrows` by default) move the selection like these keys. In the overview, `focus-workspace-prev/next` also traverse cards before crossing workspace rows, including named ones, except inside a selected stash pile.
270 270
271 Each workspace's [stash](#stash), hidden or not, shows as a pile of cards on the left of its row, which stays centred unless it would overlap the pile: its selected window in front, up to three others behind it, dimmed. In the pile, `k` / `j` or up/down browse stash cards and stop at either end without changing workspace. Right (`l`) leaves the pile immediately; left (`h`) stays in the pile. On a stash-only workspace, right deselects the pile so up/down can change workspace. Browsing brings the selected card to the front without reordering the stash. `return` or a click on a card closes the overview with the stash shown on that window.271 Each workspace's [stash](#stash), hidden or not, shows as a pile of cards on the left of its row, which stays centred unless it would overlap the pile: its selected window in front, up to three others behind it, dimmed. In the pile, `k` / `j` or up/down browse stash cards and stop at either end without changing workspace. Right (`l`) leaves the pile immediately; left (`h`) stays in the pile. On a stash-only workspace, right deselects the pile so up/down can change workspace. Browsing brings the selected card to the front without reordering the stash. `return` or a click on a card closes the overview with the stash shown on that window.
272 272
@@ -311,10 +311,10 @@ With `keyboard.cmd = alt`, the `cmd+alt+…` binds have the same keys as `cmd+
311 | `cmd+q` | `close-window` |311 | `cmd+q` | `close-window` |
312 | `ctrl+alt+backspace` | `quit` |312 | `ctrl+alt+backspace` | `quit` |
313 | `ctrl+cmd+space` | `spawn fuzzel` |313 | `ctrl+cmd+space` | `spawn fuzzel` |
314-| `cmd+pageup` | `focus-workspace-up` |314+| `cmd+pageup` | `focus-workspace-prev` |
315-| `cmd+pagedown` | `focus-workspace-down` |315+| `cmd+pagedown` | `focus-workspace-next` |
316-| `cmd+shift+pageup` | `move-column-to-workspace-up` |316+| `cmd+shift+pageup` | `move-column-to-workspace-prev` |
317-| `cmd+shift+pagedown` | `move-column-to-workspace-down` |317+| `cmd+shift+pagedown` | `move-column-to-workspace-next` |
318 | `cmd+code:2` | `focus-workspace 1` |318 | `cmd+code:2` | `focus-workspace 1` |
319 | `cmd+code:3` | `focus-workspace 2` |319 | `cmd+code:3` | `focus-workspace 2` |
320 | `cmd+code:4` | `focus-workspace 3` |320 | `cmd+code:4` | `focus-workspace 3` |
@@ -343,7 +343,7 @@ With `keyboard.cmd = alt`, the `cmd+alt+…` binds have the same keys as `cmd+
343 | `cmd+ctrl+shift+right` | `move-workspace-to-monitor-right` |343 | `cmd+ctrl+shift+right` | `move-workspace-to-monitor-right` |
344 | `cmd+ctrl+shift+h` | `move-workspace-to-monitor-left` |344 | `cmd+ctrl+shift+h` | `move-workspace-to-monitor-left` |
345 | `cmd+ctrl+shift+l` | `move-workspace-to-monitor-right` |345 | `cmd+ctrl+shift+l` | `move-workspace-to-monitor-right` |
346-| `cmd+ctrl+shift+up` / `cmd+ctrl+shift+k` | `move-workspace-up` |346+| `cmd+ctrl+shift+up` / `cmd+ctrl+shift+k` | `move-workspace-prev` |
347-| `cmd+ctrl+shift+down` / `cmd+ctrl+shift+j` | `move-workspace-down` |347+| `cmd+ctrl+shift+down` / `cmd+ctrl+shift+j` | `move-workspace-next` |
348 | `cmd+code:13` | `scale-up` |348 | `cmd+code:13` | `scale-up` |
349 | `cmd+code:12` | `scale-down` |349 | `cmd+code:12` | `scale-down` |
M examples/config +9 -9
@@ -182,17 +182,17 @@ bind.ctrl+cmd+space = spawn fuzzel
182182
183183 # Workspaces stack vertically; numbers follow their order. An empty one always
184184 # waits below the last. cmd+up/down past the column edge also switch workspace.
185-bind.cmd+pageup = focus-workspace-up
186-bind.cmd+pagedown = focus-workspace-down
185+bind.cmd+pageup = focus-workspace-prev
186+bind.cmd+pagedown = focus-workspace-next
187187 # move-column-to-workspace moves the whole column; move-window-to-workspace
188-# (N, -up, -down) moves only the focused window and has no default bind.
189-bind.cmd+shift+pageup = move-column-to-workspace-up
190-bind.cmd+shift+pagedown = move-column-to-workspace-down
188+# (N, -prev, -next) moves only the focused window and has no default bind.
189+bind.cmd+shift+pageup = move-column-to-workspace-prev
190+bind.cmd+shift+pagedown = move-column-to-workspace-next
191191 # Reorder workspaces: swap the current one with its neighbor.
192-bind.cmd+ctrl+shift+up = move-workspace-up
193-bind.cmd+ctrl+shift+down = move-workspace-down
194-bind.cmd+ctrl+shift+k = move-workspace-up
195-bind.cmd+ctrl+shift+j = move-workspace-down
192+bind.cmd+ctrl+shift+up = move-workspace-prev
193+bind.cmd+ctrl+shift+down = move-workspace-next
194+bind.cmd+ctrl+shift+k = move-workspace-prev
195+bind.cmd+ctrl+shift+j = move-workspace-next
196196 bind.cmd+code:2 = focus-workspace 1
197197 bind.cmd+code:3 = focus-workspace 2
198198 bind.cmd+code:4 = focus-workspace 3
@@ -182,17 +182,17 @@ bind.ctrl+cmd+space = spawn fuzzel
182 182
183 # Workspaces stack vertically; numbers follow their order. An empty one always183 # Workspaces stack vertically; numbers follow their order. An empty one always
184 # waits below the last. cmd+up/down past the column edge also switch workspace.184 # waits below the last. cmd+up/down past the column edge also switch workspace.
185-bind.cmd+pageup = focus-workspace-up185+bind.cmd+pageup = focus-workspace-prev
186-bind.cmd+pagedown = focus-workspace-down186+bind.cmd+pagedown = focus-workspace-next
187 # move-column-to-workspace moves the whole column; move-window-to-workspace187 # move-column-to-workspace moves the whole column; move-window-to-workspace
188-# (N, -up, -down) moves only the focused window and has no default bind.188+# (N, -prev, -next) moves only the focused window and has no default bind.
189-bind.cmd+shift+pageup = move-column-to-workspace-up189+bind.cmd+shift+pageup = move-column-to-workspace-prev
190-bind.cmd+shift+pagedown = move-column-to-workspace-down190+bind.cmd+shift+pagedown = move-column-to-workspace-next
191 # Reorder workspaces: swap the current one with its neighbor.191 # Reorder workspaces: swap the current one with its neighbor.
192-bind.cmd+ctrl+shift+up = move-workspace-up192+bind.cmd+ctrl+shift+up = move-workspace-prev
193-bind.cmd+ctrl+shift+down = move-workspace-down193+bind.cmd+ctrl+shift+down = move-workspace-next
194-bind.cmd+ctrl+shift+k = move-workspace-up194+bind.cmd+ctrl+shift+k = move-workspace-prev
195-bind.cmd+ctrl+shift+j = move-workspace-down195+bind.cmd+ctrl+shift+j = move-workspace-next
196 bind.cmd+code:2 = focus-workspace 1196 bind.cmd+code:2 = focus-workspace 1
197 bind.cmd+code:3 = focus-workspace 2197 bind.cmd+code:3 = focus-workspace 2
198 bind.cmd+code:4 = focus-workspace 3198 bind.cmd+code:4 = focus-workspace 3
M internal/adapters/config/config.go +14 -14
@@ -46,10 +46,10 @@ var defaultBinds = []struct{ combo, action string }{
4646 {"cmd+q", "close-window"},
4747 {"ctrl+alt+backspace", "quit"},
4848 {"ctrl+cmd+space", "spawn fuzzel"},
49- {"cmd+pageup", "focus-workspace-up"},
50- {"cmd+pagedown", "focus-workspace-down"},
51- {"cmd+shift+pageup", "move-column-to-workspace-up"},
52- {"cmd+shift+pagedown", "move-column-to-workspace-down"},
49+ {"cmd+pageup", "focus-workspace-prev"},
50+ {"cmd+pagedown", "focus-workspace-next"},
51+ {"cmd+shift+pageup", "move-column-to-workspace-prev"},
52+ {"cmd+shift+pagedown", "move-column-to-workspace-next"},
5353 {"cmd+ctrl+left", "focus-monitor-left"},
5454 {"cmd+ctrl+right", "focus-monitor-right"},
5555 {"cmd+ctrl+up", "focus-monitor-up"},
@@ -62,8 +62,8 @@ var defaultBinds = []struct{ combo, action string }{
6262 {"cmd+alt+right", "set-column-width +10%"},
6363 {"cmd+alt+up", "set-window-height -10%"},
6464 {"cmd+alt+down", "set-window-height +10%"},
65- {"cmd+ctrl+shift+up", "move-workspace-up"},
66- {"cmd+ctrl+shift+down", "move-workspace-down"},
65+ {"cmd+ctrl+shift+up", "move-workspace-prev"},
66+ {"cmd+ctrl+shift+down", "move-workspace-next"},
6767 {"cmd+shift+space", "toggle-floating"},
6868 }
6969 var actions = map[string]bool{
@@ -77,12 +77,12 @@ var actions = map[string]bool{
7777 "move-workspace-to-monitor-down": true,
7878 "scale-up": true,
7979 "scale-down": true,
80- "focus-workspace-up": true,
81- "focus-workspace-down": true,
82- "move-column-to-workspace-up": true,
83- "move-column-to-workspace-down": true,
84- "move-window-to-workspace-up": true,
85- "move-window-to-workspace-down": true,
80+ "focus-workspace-prev": true,
81+ "focus-workspace-next": true,
82+ "move-column-to-workspace-prev": true,
83+ "move-column-to-workspace-next": true,
84+ "move-window-to-workspace-prev": true,
85+ "move-window-to-workspace-next": true,
8686 "none": true,
8787 "consume-or-expel-window-left": true,
8888 "consume-or-expel-window-right": true,
@@ -103,8 +103,8 @@ var actions = map[string]bool{
103103 "quit": true,
104104 "move-window-up": true,
105105 "move-window-down": true,
106- "move-workspace-up": true,
107- "move-workspace-down": true,
106+ "move-workspace-prev": true,
107+ "move-workspace-next": true,
108108 "toggle-floating": true,
109109 }
110110 var components = map[string]bool{"core": true, "wayland": true, "input": true, "drm": true, "seat": true, "render": true, "sync": true, "config": true, "app": true}
@@ -46,10 +46,10 @@ var defaultBinds = []struct{ combo, action string }{
46 {"cmd+q", "close-window"},46 {"cmd+q", "close-window"},
47 {"ctrl+alt+backspace", "quit"},47 {"ctrl+alt+backspace", "quit"},
48 {"ctrl+cmd+space", "spawn fuzzel"},48 {"ctrl+cmd+space", "spawn fuzzel"},
49- {"cmd+pageup", "focus-workspace-up"},49+ {"cmd+pageup", "focus-workspace-prev"},
50- {"cmd+pagedown", "focus-workspace-down"},50+ {"cmd+pagedown", "focus-workspace-next"},
51- {"cmd+shift+pageup", "move-column-to-workspace-up"},51+ {"cmd+shift+pageup", "move-column-to-workspace-prev"},
52- {"cmd+shift+pagedown", "move-column-to-workspace-down"},52+ {"cmd+shift+pagedown", "move-column-to-workspace-next"},
53 {"cmd+ctrl+left", "focus-monitor-left"},53 {"cmd+ctrl+left", "focus-monitor-left"},
54 {"cmd+ctrl+right", "focus-monitor-right"},54 {"cmd+ctrl+right", "focus-monitor-right"},
55 {"cmd+ctrl+up", "focus-monitor-up"},55 {"cmd+ctrl+up", "focus-monitor-up"},
@@ -62,8 +62,8 @@ var defaultBinds = []struct{ combo, action string }{
62 {"cmd+alt+right", "set-column-width +10%"},62 {"cmd+alt+right", "set-column-width +10%"},
63 {"cmd+alt+up", "set-window-height -10%"},63 {"cmd+alt+up", "set-window-height -10%"},
64 {"cmd+alt+down", "set-window-height +10%"},64 {"cmd+alt+down", "set-window-height +10%"},
65- {"cmd+ctrl+shift+up", "move-workspace-up"},65+ {"cmd+ctrl+shift+up", "move-workspace-prev"},
66- {"cmd+ctrl+shift+down", "move-workspace-down"},66+ {"cmd+ctrl+shift+down", "move-workspace-next"},
67 {"cmd+shift+space", "toggle-floating"},67 {"cmd+shift+space", "toggle-floating"},
68 }68 }
69 var actions = map[string]bool{69 var actions = map[string]bool{
@@ -77,12 +77,12 @@ var actions = map[string]bool{
77 "move-workspace-to-monitor-down": true,77 "move-workspace-to-monitor-down": true,
78 "scale-up": true,78 "scale-up": true,
79 "scale-down": true,79 "scale-down": true,
80- "focus-workspace-up": true,80+ "focus-workspace-prev": true,
81- "focus-workspace-down": true,81+ "focus-workspace-next": true,
82- "move-column-to-workspace-up": true,82+ "move-column-to-workspace-prev": true,
83- "move-column-to-workspace-down": true,83+ "move-column-to-workspace-next": true,
84- "move-window-to-workspace-up": true,84+ "move-window-to-workspace-prev": true,
85- "move-window-to-workspace-down": true,85+ "move-window-to-workspace-next": true,
86 "none": true,86 "none": true,
87 "consume-or-expel-window-left": true,87 "consume-or-expel-window-left": true,
88 "consume-or-expel-window-right": true,88 "consume-or-expel-window-right": true,
@@ -103,8 +103,8 @@ var actions = map[string]bool{
103 "quit": true,103 "quit": true,
104 "move-window-up": true,104 "move-window-up": true,
105 "move-window-down": true,105 "move-window-down": true,
106- "move-workspace-up": true,106+ "move-workspace-prev": true,
107- "move-workspace-down": true,107+ "move-workspace-next": true,
108 "toggle-floating": true,108 "toggle-floating": true,
109 }109 }
110 var components = map[string]bool{"core": true, "wayland": true, "input": true, "drm": true, "seat": true, "render": true, "sync": true, "config": true, "app": true}110 var components = map[string]bool{"core": true, "wayland": true, "input": true, "drm": true, "seat": true, "render": true, "sync": true, "config": true, "app": true}
M internal/adapters/config/config_test.go +11 -1
@@ -31,7 +31,7 @@ func TestDefaultsAndLoad(t *testing.T) {
3131 if d.Binds["Cmd+s"] != "toggle-stash-visible" || d.Binds["Cmd+Shift+s"] != "toggle-window-stash" || d.Binds["Cmd+o"] != "toggle-overview" || d.Binds["Cmd+f"] != "maximize-column" || d.Binds["Cmd+Shift+f"] != "toggle-fullscreen" || d.Binds["Cmd+Shift+h"] != "move-column-left" || d.Binds["Cmd+j"] != "focus-window-down" || d.Binds["Cmd+Shift+code:2"] != "move-column-to-workspace 1" || d.Focus.FollowMove {
3232 t.Fatal(d.Binds)
3333 }
34- if d.Binds["Cmd+Shift+Up"] != "move-window-up" || d.Binds["Cmd+Shift+j"] != "move-window-down" || d.Binds["Alt+Cmd+Left"] != "set-column-width -10%" || d.Binds["Alt+Cmd+l"] != "set-column-width +10%" || d.Binds["Alt+Cmd+k"] != "set-window-height -10%" || d.Binds["Cmd+Ctrl+Shift+Down"] != "move-workspace-down" || d.Binds["Cmd+Ctrl+Shift+k"] != "move-workspace-up" || d.Binds["Cmd+Shift+space"] != "toggle-floating" {
34+ if d.Binds["Cmd+Shift+Up"] != "move-window-up" || d.Binds["Cmd+Shift+j"] != "move-window-down" || d.Binds["Alt+Cmd+Left"] != "set-column-width -10%" || d.Binds["Alt+Cmd+l"] != "set-column-width +10%" || d.Binds["Alt+Cmd+k"] != "set-window-height -10%" || d.Binds["Cmd+Ctrl+Shift+Down"] != "move-workspace-next" || d.Binds["Cmd+Ctrl+Shift+k"] != "move-workspace-prev" || d.Binds["Cmd+Shift+space"] != "toggle-floating" {
3535 t.Fatal(d.Binds)
3636 }
3737 if d.Binds["Cmd+Ctrl+space"] != "spawn fuzzel" || d.Binds["Alt+Ctrl+BackSpace"] != "quit" {
@@ -283,6 +283,9 @@ func TestWarningsKeepDefaults(t *testing.T) {
283283 {"bind.cmd+ = quit", "missing key"},
284284 {"bind.hyper+x = quit", "unknown modifier"},
285285 {"bind.cmd+x = bogus", "unknown action"},
286+ {"bind.cmd+x = focus-workspace-up", "unknown action"},
287+ {"bind.cmd+x = move-workspace-down", "unknown action"},
288+ {"bind.cmd+x = move-column-to-workspace-up", "unknown action"},
286289 {"bind.cmd+x = set-column-width 10%", "set-column-width needs"},
287290 {"bind.cmd+x = set-column-width +0%", "set-column-width needs"},
288291 {"bind.cmd+x = set-window-height -101%", "set-window-height needs"},
@@ -304,6 +307,13 @@ func TestWarningsKeepDefaults(t *testing.T) {
304307 }
305308 }
306309
310+func TestWorkspacePrevNextAction(t *testing.T) {
311+ c, w := parseString(t, "bind.cmd+x = focus-workspace-next")
312+ if len(w) != 0 || c.Binds["Cmd+x"] != "focus-workspace-next" {
313+ t.Fatal(c.Binds["Cmd+x"], w)
314+ }
315+}
316+
307317 func TestXwayland(t *testing.T) {
308318 if Defaults().Xwayland != "xwayland-satellite" {
309319 t.Fatal(Defaults().Xwayland)
@@ -31,7 +31,7 @@ func TestDefaultsAndLoad(t *testing.T) {
31 if d.Binds["Cmd+s"] != "toggle-stash-visible" || d.Binds["Cmd+Shift+s"] != "toggle-window-stash" || d.Binds["Cmd+o"] != "toggle-overview" || d.Binds["Cmd+f"] != "maximize-column" || d.Binds["Cmd+Shift+f"] != "toggle-fullscreen" || d.Binds["Cmd+Shift+h"] != "move-column-left" || d.Binds["Cmd+j"] != "focus-window-down" || d.Binds["Cmd+Shift+code:2"] != "move-column-to-workspace 1" || d.Focus.FollowMove {31 if d.Binds["Cmd+s"] != "toggle-stash-visible" || d.Binds["Cmd+Shift+s"] != "toggle-window-stash" || d.Binds["Cmd+o"] != "toggle-overview" || d.Binds["Cmd+f"] != "maximize-column" || d.Binds["Cmd+Shift+f"] != "toggle-fullscreen" || d.Binds["Cmd+Shift+h"] != "move-column-left" || d.Binds["Cmd+j"] != "focus-window-down" || d.Binds["Cmd+Shift+code:2"] != "move-column-to-workspace 1" || d.Focus.FollowMove {
32 t.Fatal(d.Binds)32 t.Fatal(d.Binds)
33 }33 }
34- if d.Binds["Cmd+Shift+Up"] != "move-window-up" || d.Binds["Cmd+Shift+j"] != "move-window-down" || d.Binds["Alt+Cmd+Left"] != "set-column-width -10%" || d.Binds["Alt+Cmd+l"] != "set-column-width +10%" || d.Binds["Alt+Cmd+k"] != "set-window-height -10%" || d.Binds["Cmd+Ctrl+Shift+Down"] != "move-workspace-down" || d.Binds["Cmd+Ctrl+Shift+k"] != "move-workspace-up" || d.Binds["Cmd+Shift+space"] != "toggle-floating" {34+ if d.Binds["Cmd+Shift+Up"] != "move-window-up" || d.Binds["Cmd+Shift+j"] != "move-window-down" || d.Binds["Alt+Cmd+Left"] != "set-column-width -10%" || d.Binds["Alt+Cmd+l"] != "set-column-width +10%" || d.Binds["Alt+Cmd+k"] != "set-window-height -10%" || d.Binds["Cmd+Ctrl+Shift+Down"] != "move-workspace-next" || d.Binds["Cmd+Ctrl+Shift+k"] != "move-workspace-prev" || d.Binds["Cmd+Shift+space"] != "toggle-floating" {
35 t.Fatal(d.Binds)35 t.Fatal(d.Binds)
36 }36 }
37 if d.Binds["Cmd+Ctrl+space"] != "spawn fuzzel" || d.Binds["Alt+Ctrl+BackSpace"] != "quit" {37 if d.Binds["Cmd+Ctrl+space"] != "spawn fuzzel" || d.Binds["Alt+Ctrl+BackSpace"] != "quit" {
@@ -283,6 +283,9 @@ func TestWarningsKeepDefaults(t *testing.T) {
283 {"bind.cmd+ = quit", "missing key"},283 {"bind.cmd+ = quit", "missing key"},
284 {"bind.hyper+x = quit", "unknown modifier"},284 {"bind.hyper+x = quit", "unknown modifier"},
285 {"bind.cmd+x = bogus", "unknown action"},285 {"bind.cmd+x = bogus", "unknown action"},
286+ {"bind.cmd+x = focus-workspace-up", "unknown action"},
287+ {"bind.cmd+x = move-workspace-down", "unknown action"},
288+ {"bind.cmd+x = move-column-to-workspace-up", "unknown action"},
286 {"bind.cmd+x = set-column-width 10%", "set-column-width needs"},289 {"bind.cmd+x = set-column-width 10%", "set-column-width needs"},
287 {"bind.cmd+x = set-column-width +0%", "set-column-width needs"},290 {"bind.cmd+x = set-column-width +0%", "set-column-width needs"},
288 {"bind.cmd+x = set-window-height -101%", "set-window-height needs"},291 {"bind.cmd+x = set-window-height -101%", "set-window-height needs"},
@@ -304,6 +307,13 @@ func TestWarningsKeepDefaults(t *testing.T) {
304 }307 }
305 }308 }
306 309
310+func TestWorkspacePrevNextAction(t *testing.T) {
311+ c, w := parseString(t, "bind.cmd+x = focus-workspace-next")
312+ if len(w) != 0 || c.Binds["Cmd+x"] != "focus-workspace-next" {
313+ t.Fatal(c.Binds["Cmd+x"], w)
314+ }
315+}
316+
307 func TestXwayland(t *testing.T) {317 func TestXwayland(t *testing.T) {
308 if Defaults().Xwayland != "xwayland-satellite" {318 if Defaults().Xwayland != "xwayland-satellite" {
309 t.Fatal(Defaults().Xwayland)319 t.Fatal(Defaults().Xwayland)
M internal/core/action.go +21 -21
@@ -25,15 +25,15 @@ const (
2525 ActionToggleOverview Action = "toggle-overview"
2626 ActionCloseWindow Action = "close-window"
2727 ActionQuit Action = "quit"
28- // Workspaces stack vertically; up/down stop at the ends.
29- ActionFocusWorkspaceUp Action = "focus-workspace-up"
30- ActionFocusWorkspaceDown Action = "focus-workspace-down"
31- // Move the focused column, or only the focused window, one workspace
32- // up or down.
33- ActionMoveColumnToWorkspaceUp Action = "move-column-to-workspace-up"
34- ActionMoveColumnToWorkspaceDown Action = "move-column-to-workspace-down"
35- ActionMoveWindowToWorkspaceUp Action = "move-window-to-workspace-up"
36- ActionMoveWindowToWorkspaceDown Action = "move-window-to-workspace-down"
28+ // Workspaces stack vertically; prev/next stop at the ends.
29+ ActionFocusWorkspacePrev Action = "focus-workspace-prev"
30+ ActionFocusWorkspaceNext Action = "focus-workspace-next"
31+ // Move the focused column, or only the focused window, to the previous
32+ // or next workspace.
33+ ActionMoveColumnToWorkspacePrev Action = "move-column-to-workspace-prev"
34+ ActionMoveColumnToWorkspaceNext Action = "move-column-to-workspace-next"
35+ ActionMoveWindowToWorkspacePrev Action = "move-window-to-workspace-prev"
36+ ActionMoveWindowToWorkspaceNext Action = "move-window-to-workspace-next"
3737 // Monitors act on the neighbor in that direction of the global layout
3838 // (ADR 011).
3939 ActionFocusMonitorLeft Action = "focus-monitor-left"
@@ -54,8 +54,8 @@ const (
5454 ActionMoveWindowUp Action = "move-window-up"
5555 ActionMoveWindowDown Action = "move-window-down"
5656 // Swap the active numbered workspace with its neighbor.
57- ActionMoveWorkspaceUp Action = "move-workspace-up"
58- ActionMoveWorkspaceDown Action = "move-workspace-down"
57+ ActionMoveWorkspacePrev Action = "move-workspace-prev"
58+ ActionMoveWorkspaceNext Action = "move-workspace-next"
5959 // Turn the focused tile into a free floating window, or back.
6060 ActionToggleFloating Action = "toggle-floating"
6161 )
@@ -349,17 +349,17 @@ func (m *Monitor) Apply(a Action) Effect {
349349 return Effect{}
350350 }
351351 }
352- case ActionFocusWorkspaceUp, ActionFocusWorkspaceDown:
353- if m.shown == nil && a == ActionFocusWorkspaceUp {
352+ case ActionFocusWorkspacePrev, ActionFocusWorkspaceNext:
353+ if m.shown == nil && a == ActionFocusWorkspacePrev {
354354 m.Focus(m.Active - 1)
355355 } else if m.shown == nil {
356356 m.Focus(m.Active + 1)
357357 }
358358 return Effect{}
359- case ActionMoveWorkspaceUp:
359+ case ActionMoveWorkspacePrev:
360360 m.MoveWorkspace(-1)
361361 return Effect{}
362- case ActionMoveWorkspaceDown:
362+ case ActionMoveWorkspaceNext:
363363 m.MoveWorkspace(1)
364364 return Effect{}
365365 }
@@ -372,8 +372,8 @@ func movesToWorkspace(a Action) bool {
372372 return op != FocusWorkspace
373373 }
374374 switch a {
375- case ActionMoveColumnToWorkspaceUp, ActionMoveColumnToWorkspaceDown,
376- ActionMoveWindowToWorkspaceUp, ActionMoveWindowToWorkspaceDown:
375+ case ActionMoveColumnToWorkspacePrev, ActionMoveColumnToWorkspaceNext,
376+ ActionMoveWindowToWorkspacePrev, ActionMoveWindowToWorkspaceNext:
377377 return true
378378 }
379379 return false
@@ -390,10 +390,10 @@ func (m *Monitor) moveDest(a Action) (i int, column, ok bool) {
390390 return 0, false, false
391391 }
392392 switch a {
393- case ActionMoveColumnToWorkspaceUp, ActionMoveWindowToWorkspaceUp:
394- return m.Active - 1, a == ActionMoveColumnToWorkspaceUp, m.Active > 0
395- case ActionMoveColumnToWorkspaceDown, ActionMoveWindowToWorkspaceDown:
396- return min(m.Active+1, len(m.Workspaces)-1), a == ActionMoveColumnToWorkspaceDown, true
393+ case ActionMoveColumnToWorkspacePrev, ActionMoveWindowToWorkspacePrev:
394+ return m.Active - 1, a == ActionMoveColumnToWorkspacePrev, m.Active > 0
395+ case ActionMoveColumnToWorkspaceNext, ActionMoveWindowToWorkspaceNext:
396+ return min(m.Active+1, len(m.Workspaces)-1), a == ActionMoveColumnToWorkspaceNext, true
397397 }
398398 return 0, false, false
399399 }
@@ -25,15 +25,15 @@ const (
25 ActionToggleOverview Action = "toggle-overview"25 ActionToggleOverview Action = "toggle-overview"
26 ActionCloseWindow Action = "close-window"26 ActionCloseWindow Action = "close-window"
27 ActionQuit Action = "quit"27 ActionQuit Action = "quit"
28- // Workspaces stack vertically; up/down stop at the ends.28+ // Workspaces stack vertically; prev/next stop at the ends.
29- ActionFocusWorkspaceUp Action = "focus-workspace-up"29+ ActionFocusWorkspacePrev Action = "focus-workspace-prev"
30- ActionFocusWorkspaceDown Action = "focus-workspace-down"30+ ActionFocusWorkspaceNext Action = "focus-workspace-next"
31- // Move the focused column, or only the focused window, one workspace31+ // Move the focused column, or only the focused window, to the previous
32- // up or down.32+ // or next workspace.
33- ActionMoveColumnToWorkspaceUp Action = "move-column-to-workspace-up"33+ ActionMoveColumnToWorkspacePrev Action = "move-column-to-workspace-prev"
34- ActionMoveColumnToWorkspaceDown Action = "move-column-to-workspace-down"34+ ActionMoveColumnToWorkspaceNext Action = "move-column-to-workspace-next"
35- ActionMoveWindowToWorkspaceUp Action = "move-window-to-workspace-up"35+ ActionMoveWindowToWorkspacePrev Action = "move-window-to-workspace-prev"
36- ActionMoveWindowToWorkspaceDown Action = "move-window-to-workspace-down"36+ ActionMoveWindowToWorkspaceNext Action = "move-window-to-workspace-next"
37 // Monitors act on the neighbor in that direction of the global layout37 // Monitors act on the neighbor in that direction of the global layout
38 // (ADR 011).38 // (ADR 011).
39 ActionFocusMonitorLeft Action = "focus-monitor-left"39 ActionFocusMonitorLeft Action = "focus-monitor-left"
@@ -54,8 +54,8 @@ const (
54 ActionMoveWindowUp Action = "move-window-up"54 ActionMoveWindowUp Action = "move-window-up"
55 ActionMoveWindowDown Action = "move-window-down"55 ActionMoveWindowDown Action = "move-window-down"
56 // Swap the active numbered workspace with its neighbor.56 // Swap the active numbered workspace with its neighbor.
57- ActionMoveWorkspaceUp Action = "move-workspace-up"57+ ActionMoveWorkspacePrev Action = "move-workspace-prev"
58- ActionMoveWorkspaceDown Action = "move-workspace-down"58+ ActionMoveWorkspaceNext Action = "move-workspace-next"
59 // Turn the focused tile into a free floating window, or back.59 // Turn the focused tile into a free floating window, or back.
60 ActionToggleFloating Action = "toggle-floating"60 ActionToggleFloating Action = "toggle-floating"
61 )61 )
@@ -349,17 +349,17 @@ func (m *Monitor) Apply(a Action) Effect {
349 return Effect{}349 return Effect{}
350 }350 }
351 }351 }
352- case ActionFocusWorkspaceUp, ActionFocusWorkspaceDown:352+ case ActionFocusWorkspacePrev, ActionFocusWorkspaceNext:
353- if m.shown == nil && a == ActionFocusWorkspaceUp {353+ if m.shown == nil && a == ActionFocusWorkspacePrev {
354 m.Focus(m.Active - 1)354 m.Focus(m.Active - 1)
355 } else if m.shown == nil {355 } else if m.shown == nil {
356 m.Focus(m.Active + 1)356 m.Focus(m.Active + 1)
357 }357 }
358 return Effect{}358 return Effect{}
359- case ActionMoveWorkspaceUp:359+ case ActionMoveWorkspacePrev:
360 m.MoveWorkspace(-1)360 m.MoveWorkspace(-1)
361 return Effect{}361 return Effect{}
362- case ActionMoveWorkspaceDown:362+ case ActionMoveWorkspaceNext:
363 m.MoveWorkspace(1)363 m.MoveWorkspace(1)
364 return Effect{}364 return Effect{}
365 }365 }
@@ -372,8 +372,8 @@ func movesToWorkspace(a Action) bool {
372 return op != FocusWorkspace372 return op != FocusWorkspace
373 }373 }
374 switch a {374 switch a {
375- case ActionMoveColumnToWorkspaceUp, ActionMoveColumnToWorkspaceDown,375+ case ActionMoveColumnToWorkspacePrev, ActionMoveColumnToWorkspaceNext,
376- ActionMoveWindowToWorkspaceUp, ActionMoveWindowToWorkspaceDown:376+ ActionMoveWindowToWorkspacePrev, ActionMoveWindowToWorkspaceNext:
377 return true377 return true
378 }378 }
379 return false379 return false
@@ -390,10 +390,10 @@ func (m *Monitor) moveDest(a Action) (i int, column, ok bool) {
390 return 0, false, false390 return 0, false, false
391 }391 }
392 switch a {392 switch a {
393- case ActionMoveColumnToWorkspaceUp, ActionMoveWindowToWorkspaceUp:393+ case ActionMoveColumnToWorkspacePrev, ActionMoveWindowToWorkspacePrev:
394- return m.Active - 1, a == ActionMoveColumnToWorkspaceUp, m.Active > 0394+ return m.Active - 1, a == ActionMoveColumnToWorkspacePrev, m.Active > 0
395- case ActionMoveColumnToWorkspaceDown, ActionMoveWindowToWorkspaceDown:395+ case ActionMoveColumnToWorkspaceNext, ActionMoveWindowToWorkspaceNext:
396- return min(m.Active+1, len(m.Workspaces)-1), a == ActionMoveColumnToWorkspaceDown, true396+ return min(m.Active+1, len(m.Workspaces)-1), a == ActionMoveColumnToWorkspaceNext, true
397 }397 }
398 return 0, false, false398 return 0, false, false
399 }399 }
M internal/core/core.go +2 -2
@@ -242,8 +242,8 @@ func (c *Core) apply(cfg ports.Config) error {
242242 continue
243243 }
244244 switch Action(a) {
245- case "none", ActionSpawnTerminal, ActionFocusColumnLeft, ActionFocusColumnRight, ActionFocusWindowUp, ActionFocusWindowDown, ActionMoveColumnLeft, ActionMoveColumnRight, ActionCycleColumnWidth, ActionMaximizeColumn, ActionToggleFullscreen, ActionToggleWindowStash, ActionToggleStashVisible, ActionToggleOverview, ActionCloseWindow, ActionQuit, ActionFocusWorkspaceUp, ActionFocusWorkspaceDown, ActionMoveColumnToWorkspaceUp, ActionMoveColumnToWorkspaceDown, ActionMoveWindowToWorkspaceUp, ActionMoveWindowToWorkspaceDown, ActionFocusMonitorLeft, ActionFocusMonitorRight, ActionFocusMonitorUp, ActionFocusMonitorDown, ActionMoveWorkspaceLeft, ActionMoveWorkspaceRight, ActionMoveWorkspaceToMonitorUp, ActionMoveWorkspaceToMonitorDown, ActionConsumeOrExpelLeft, ActionConsumeOrExpelRight,
246- ActionMoveWindowUp, ActionMoveWindowDown, ActionMoveWorkspaceUp, ActionMoveWorkspaceDown, ActionToggleFloating:
245+ case "none", ActionSpawnTerminal, ActionFocusColumnLeft, ActionFocusColumnRight, ActionFocusWindowUp, ActionFocusWindowDown, ActionMoveColumnLeft, ActionMoveColumnRight, ActionCycleColumnWidth, ActionMaximizeColumn, ActionToggleFullscreen, ActionToggleWindowStash, ActionToggleStashVisible, ActionToggleOverview, ActionCloseWindow, ActionQuit, ActionFocusWorkspacePrev, ActionFocusWorkspaceNext, ActionMoveColumnToWorkspacePrev, ActionMoveColumnToWorkspaceNext, ActionMoveWindowToWorkspacePrev, ActionMoveWindowToWorkspaceNext, ActionFocusMonitorLeft, ActionFocusMonitorRight, ActionFocusMonitorUp, ActionFocusMonitorDown, ActionMoveWorkspaceLeft, ActionMoveWorkspaceRight, ActionMoveWorkspaceToMonitorUp, ActionMoveWorkspaceToMonitorDown, ActionConsumeOrExpelLeft, ActionConsumeOrExpelRight,
246+ ActionMoveWindowUp, ActionMoveWindowDown, ActionMoveWorkspacePrev, ActionMoveWorkspaceNext, ActionToggleFloating:
247247 default:
248248 return fmt.Errorf("invalid action %q", a)
249249 }
@@ -242,8 +242,8 @@ func (c *Core) apply(cfg ports.Config) error {
242 continue242 continue
243 }243 }
244 switch Action(a) {244 switch Action(a) {
245- case "none", ActionSpawnTerminal, ActionFocusColumnLeft, ActionFocusColumnRight, ActionFocusWindowUp, ActionFocusWindowDown, ActionMoveColumnLeft, ActionMoveColumnRight, ActionCycleColumnWidth, ActionMaximizeColumn, ActionToggleFullscreen, ActionToggleWindowStash, ActionToggleStashVisible, ActionToggleOverview, ActionCloseWindow, ActionQuit, ActionFocusWorkspaceUp, ActionFocusWorkspaceDown, ActionMoveColumnToWorkspaceUp, ActionMoveColumnToWorkspaceDown, ActionMoveWindowToWorkspaceUp, ActionMoveWindowToWorkspaceDown, ActionFocusMonitorLeft, ActionFocusMonitorRight, ActionFocusMonitorUp, ActionFocusMonitorDown, ActionMoveWorkspaceLeft, ActionMoveWorkspaceRight, ActionMoveWorkspaceToMonitorUp, ActionMoveWorkspaceToMonitorDown, ActionConsumeOrExpelLeft, ActionConsumeOrExpelRight,245+ case "none", ActionSpawnTerminal, ActionFocusColumnLeft, ActionFocusColumnRight, ActionFocusWindowUp, ActionFocusWindowDown, ActionMoveColumnLeft, ActionMoveColumnRight, ActionCycleColumnWidth, ActionMaximizeColumn, ActionToggleFullscreen, ActionToggleWindowStash, ActionToggleStashVisible, ActionToggleOverview, ActionCloseWindow, ActionQuit, ActionFocusWorkspacePrev, ActionFocusWorkspaceNext, ActionMoveColumnToWorkspacePrev, ActionMoveColumnToWorkspaceNext, ActionMoveWindowToWorkspacePrev, ActionMoveWindowToWorkspaceNext, ActionFocusMonitorLeft, ActionFocusMonitorRight, ActionFocusMonitorUp, ActionFocusMonitorDown, ActionMoveWorkspaceLeft, ActionMoveWorkspaceRight, ActionMoveWorkspaceToMonitorUp, ActionMoveWorkspaceToMonitorDown, ActionConsumeOrExpelLeft, ActionConsumeOrExpelRight,
246- ActionMoveWindowUp, ActionMoveWindowDown, ActionMoveWorkspaceUp, ActionMoveWorkspaceDown, ActionToggleFloating:246+ ActionMoveWindowUp, ActionMoveWindowDown, ActionMoveWorkspacePrev, ActionMoveWorkspaceNext, ActionToggleFloating:
247 default:247 default:
248 return fmt.Errorf("invalid action %q", a)248 return fmt.Errorf("invalid action %q", a)
249 }249 }
M internal/core/gesture.go +2 -2
@@ -412,9 +412,9 @@ func (c *Core) swipeEnd(e ports.SwipeEnd) (shown bool) {
412412 a = ActionFocusColumnLeft
413413 }
414414 if workspace {
415- a = ActionFocusWorkspaceDown
415+ a = ActionFocusWorkspaceNext
416416 if step < 0 {
417- a = ActionFocusWorkspaceUp
417+ a = ActionFocusWorkspacePrev
418418 }
419419 } else if p.wraps {
420420 // A content swipe cannot escape the last band to another workspace.
@@ -412,9 +412,9 @@ func (c *Core) swipeEnd(e ports.SwipeEnd) (shown bool) {
412 a = ActionFocusColumnLeft412 a = ActionFocusColumnLeft
413 }413 }
414 if workspace {414 if workspace {
415- a = ActionFocusWorkspaceDown415+ a = ActionFocusWorkspaceNext
416 if step < 0 {416 if step < 0 {
417- a = ActionFocusWorkspaceUp417+ a = ActionFocusWorkspacePrev
418 }418 }
419 } else if p.wraps {419 } else if p.wraps {
420 // A content swipe cannot escape the last band to another workspace.420 // A content swipe cannot escape the last band to another workspace.
M internal/core/layout_buffers_test.go +4 -4
@@ -57,10 +57,10 @@ func layoutVariants(t *testing.T) map[string]*Monitor {
5757 v["fullscreen"] = m
5858
5959 m = base(OverflowScroll, 3)
60- m.Apply(ActionFocusWorkspaceDown)
60+ m.Apply(ActionFocusWorkspaceNext)
6161 m.AddWindow(20)
6262 m.AddWindow(21)
63- m.Apply(ActionFocusWorkspaceUp)
63+ m.Apply(ActionFocusWorkspacePrev)
6464 v["two-workspaces"] = m
6565
6666 m = base(OverflowScroll, 3)
@@ -69,9 +69,9 @@ func layoutVariants(t *testing.T) map[string]*Monitor {
6969 v["overview"] = m
7070
7171 m = base(OverflowScroll, 3)
72- m.Apply(ActionFocusWorkspaceDown)
72+ m.Apply(ActionFocusWorkspaceNext)
7373 m.AddWindow(20)
74- m.Apply(ActionFocusWorkspaceUp)
74+ m.Apply(ActionFocusWorkspacePrev)
7575 m.switchView.off = 0.4
7676 v["slide"] = m
7777
@@ -57,10 +57,10 @@ func layoutVariants(t *testing.T) map[string]*Monitor {
57 v["fullscreen"] = m57 v["fullscreen"] = m
58 58
59 m = base(OverflowScroll, 3)59 m = base(OverflowScroll, 3)
60- m.Apply(ActionFocusWorkspaceDown)60+ m.Apply(ActionFocusWorkspaceNext)
61 m.AddWindow(20)61 m.AddWindow(20)
62 m.AddWindow(21)62 m.AddWindow(21)
63- m.Apply(ActionFocusWorkspaceUp)63+ m.Apply(ActionFocusWorkspacePrev)
64 v["two-workspaces"] = m64 v["two-workspaces"] = m
65 65
66 m = base(OverflowScroll, 3)66 m = base(OverflowScroll, 3)
@@ -69,9 +69,9 @@ func layoutVariants(t *testing.T) map[string]*Monitor {
69 v["overview"] = m69 v["overview"] = m
70 70
71 m = base(OverflowScroll, 3)71 m = base(OverflowScroll, 3)
72- m.Apply(ActionFocusWorkspaceDown)72+ m.Apply(ActionFocusWorkspaceNext)
73 m.AddWindow(20)73 m.AddWindow(20)
74- m.Apply(ActionFocusWorkspaceUp)74+ m.Apply(ActionFocusWorkspacePrev)
75 m.switchView.off = 0.475 m.switchView.off = 0.4
76 v["slide"] = m76 v["slide"] = m
77 77
M internal/core/monitor_test.go +10 -10
@@ -154,12 +154,12 @@ func TestMonitorActions(t *testing.T) {
154154 t.Fatal(m.Active)
155155 }
156156 // Up at the top workspace stays.
157- m.Apply(ActionFocusWorkspaceUp)
157+ m.Apply(ActionFocusWorkspacePrev)
158158 if m.Active != 0 {
159159 t.Fatal(m.Active)
160160 }
161161 // Move the focused window (2) down: focus stays on workspace 1.
162- m.Apply(ActionMoveWindowToWorkspaceDown)
162+ m.Apply(ActionMoveWindowToWorkspaceNext)
163163 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {2}, {}}) || m.Active != 0 {
164164 t.Fatal(windows(m), m.Active)
165165 }
@@ -235,7 +235,7 @@ func TestMoveColumnToWorkspace(t *testing.T) {
235235 })
236236 t.Run("window only", func(t *testing.T) {
237237 m := stack()
238- m.Apply(ActionMoveWindowToWorkspaceDown)
238+ m.Apply(ActionMoveWindowToWorkspaceNext)
239239 if got := windows(m); !reflect.DeepEqual(got, [][]WindowID{{1, 2}, {3}, {}}) {
240240 t.Fatal(got)
241241 }
@@ -243,7 +243,7 @@ func TestMoveColumnToWorkspace(t *testing.T) {
243243 t.Run("follow shows the target", func(t *testing.T) {
244244 m := stack()
245245 m.SetFollowMove(true)
246- m.Apply(ActionMoveColumnToWorkspaceDown)
246+ m.Apply(ActionMoveColumnToWorkspaceNext)
247247 if id, _ := m.Focused(); m.Active != 1 || id != 3 {
248248 t.Fatal(m.Active, id)
249249 }
@@ -255,7 +255,7 @@ func TestMoveColumnToWorkspace(t *testing.T) {
255255 m := stack()
256256 c := &m.Current().Columns[1]
257257 c.Slot, c.Focus = 2, 0
258- m.Apply(ActionMoveWindowToWorkspaceDown)
258+ m.Apply(ActionMoveWindowToWorkspaceNext)
259259 if c := m.Current().Columns[1]; c.Slot != 0 || c.Windows[0] != 3 {
260260 t.Fatal(c)
261261 }
@@ -265,7 +265,7 @@ func TestMoveColumnToWorkspace(t *testing.T) {
265265 m.SetFollowMove(true)
266266 m.AddFloating(9, 10, 10)
267267 m.Current().FocusID(9)
268- m.Apply(ActionMoveWindowToWorkspaceDown)
268+ m.Apply(ActionMoveWindowToWorkspaceNext)
269269 if id, _ := m.Focused(); m.Active != 1 || id != 9 {
270270 t.Fatal(m.Active, id)
271271 }
@@ -273,7 +273,7 @@ func TestMoveColumnToWorkspace(t *testing.T) {
273273 t.Run("slot column loses its slot", func(t *testing.T) {
274274 m := stack()
275275 m.Current().Columns[1].Slot = 2
276- m.Apply(ActionMoveColumnToWorkspaceDown)
276+ m.Apply(ActionMoveColumnToWorkspaceNext)
277277 if c := m.Workspaces[1].Columns[0]; c.Slot != 0 {
278278 t.Fatal(c)
279279 }
@@ -344,7 +344,7 @@ func TestHiddenWorkspaceToggle(t *testing.T) {
344344 }
345345 m.AddWindow(2)
346346 // Up/down do not leave a hidden workspace.
347- m.Apply(ActionFocusWorkspaceDown)
347+ m.Apply(ActionFocusWorkspaceNext)
348348 m.Apply(ActionFocusWindowDown)
349349 if m.Current().Name != "dev" {
350350 t.Fatal("left the hidden workspace")
@@ -367,8 +367,8 @@ func TestHiddenWorkspaceToggle(t *testing.T) {
367367 }
368368 // Moving a window up/down from a hidden workspace does nothing.
369369 m.Apply("workspace dev")
370- m.Apply(ActionMoveWindowToWorkspaceDown)
371- m.Apply(ActionMoveWindowToWorkspaceUp)
370+ m.Apply(ActionMoveWindowToWorkspaceNext)
371+ m.Apply(ActionMoveWindowToWorkspacePrev)
372372 if id, _ := m.Focused(); id != 2 || m.Current().Name != "dev" {
373373 t.Fatal(id, windows(m))
374374 }
@@ -154,12 +154,12 @@ func TestMonitorActions(t *testing.T) {
154 t.Fatal(m.Active)154 t.Fatal(m.Active)
155 }155 }
156 // Up at the top workspace stays.156 // Up at the top workspace stays.
157- m.Apply(ActionFocusWorkspaceUp)157+ m.Apply(ActionFocusWorkspacePrev)
158 if m.Active != 0 {158 if m.Active != 0 {
159 t.Fatal(m.Active)159 t.Fatal(m.Active)
160 }160 }
161 // Move the focused window (2) down: focus stays on workspace 1.161 // Move the focused window (2) down: focus stays on workspace 1.
162- m.Apply(ActionMoveWindowToWorkspaceDown)162+ m.Apply(ActionMoveWindowToWorkspaceNext)
163 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {2}, {}}) || m.Active != 0 {163 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {2}, {}}) || m.Active != 0 {
164 t.Fatal(windows(m), m.Active)164 t.Fatal(windows(m), m.Active)
165 }165 }
@@ -235,7 +235,7 @@ func TestMoveColumnToWorkspace(t *testing.T) {
235 })235 })
236 t.Run("window only", func(t *testing.T) {236 t.Run("window only", func(t *testing.T) {
237 m := stack()237 m := stack()
238- m.Apply(ActionMoveWindowToWorkspaceDown)238+ m.Apply(ActionMoveWindowToWorkspaceNext)
239 if got := windows(m); !reflect.DeepEqual(got, [][]WindowID{{1, 2}, {3}, {}}) {239 if got := windows(m); !reflect.DeepEqual(got, [][]WindowID{{1, 2}, {3}, {}}) {
240 t.Fatal(got)240 t.Fatal(got)
241 }241 }
@@ -243,7 +243,7 @@ func TestMoveColumnToWorkspace(t *testing.T) {
243 t.Run("follow shows the target", func(t *testing.T) {243 t.Run("follow shows the target", func(t *testing.T) {
244 m := stack()244 m := stack()
245 m.SetFollowMove(true)245 m.SetFollowMove(true)
246- m.Apply(ActionMoveColumnToWorkspaceDown)246+ m.Apply(ActionMoveColumnToWorkspaceNext)
247 if id, _ := m.Focused(); m.Active != 1 || id != 3 {247 if id, _ := m.Focused(); m.Active != 1 || id != 3 {
248 t.Fatal(m.Active, id)248 t.Fatal(m.Active, id)
249 }249 }
@@ -255,7 +255,7 @@ func TestMoveColumnToWorkspace(t *testing.T) {
255 m := stack()255 m := stack()
256 c := &m.Current().Columns[1]256 c := &m.Current().Columns[1]
257 c.Slot, c.Focus = 2, 0257 c.Slot, c.Focus = 2, 0
258- m.Apply(ActionMoveWindowToWorkspaceDown)258+ m.Apply(ActionMoveWindowToWorkspaceNext)
259 if c := m.Current().Columns[1]; c.Slot != 0 || c.Windows[0] != 3 {259 if c := m.Current().Columns[1]; c.Slot != 0 || c.Windows[0] != 3 {
260 t.Fatal(c)260 t.Fatal(c)
261 }261 }
@@ -265,7 +265,7 @@ func TestMoveColumnToWorkspace(t *testing.T) {
265 m.SetFollowMove(true)265 m.SetFollowMove(true)
266 m.AddFloating(9, 10, 10)266 m.AddFloating(9, 10, 10)
267 m.Current().FocusID(9)267 m.Current().FocusID(9)
268- m.Apply(ActionMoveWindowToWorkspaceDown)268+ m.Apply(ActionMoveWindowToWorkspaceNext)
269 if id, _ := m.Focused(); m.Active != 1 || id != 9 {269 if id, _ := m.Focused(); m.Active != 1 || id != 9 {
270 t.Fatal(m.Active, id)270 t.Fatal(m.Active, id)
271 }271 }
@@ -273,7 +273,7 @@ func TestMoveColumnToWorkspace(t *testing.T) {
273 t.Run("slot column loses its slot", func(t *testing.T) {273 t.Run("slot column loses its slot", func(t *testing.T) {
274 m := stack()274 m := stack()
275 m.Current().Columns[1].Slot = 2275 m.Current().Columns[1].Slot = 2
276- m.Apply(ActionMoveColumnToWorkspaceDown)276+ m.Apply(ActionMoveColumnToWorkspaceNext)
277 if c := m.Workspaces[1].Columns[0]; c.Slot != 0 {277 if c := m.Workspaces[1].Columns[0]; c.Slot != 0 {
278 t.Fatal(c)278 t.Fatal(c)
279 }279 }
@@ -344,7 +344,7 @@ func TestHiddenWorkspaceToggle(t *testing.T) {
344 }344 }
345 m.AddWindow(2)345 m.AddWindow(2)
346 // Up/down do not leave a hidden workspace.346 // Up/down do not leave a hidden workspace.
347- m.Apply(ActionFocusWorkspaceDown)347+ m.Apply(ActionFocusWorkspaceNext)
348 m.Apply(ActionFocusWindowDown)348 m.Apply(ActionFocusWindowDown)
349 if m.Current().Name != "dev" {349 if m.Current().Name != "dev" {
350 t.Fatal("left the hidden workspace")350 t.Fatal("left the hidden workspace")
@@ -367,8 +367,8 @@ func TestHiddenWorkspaceToggle(t *testing.T) {
367 }367 }
368 // Moving a window up/down from a hidden workspace does nothing.368 // Moving a window up/down from a hidden workspace does nothing.
369 m.Apply("workspace dev")369 m.Apply("workspace dev")
370- m.Apply(ActionMoveWindowToWorkspaceDown)370+ m.Apply(ActionMoveWindowToWorkspaceNext)
371- m.Apply(ActionMoveWindowToWorkspaceUp)371+ m.Apply(ActionMoveWindowToWorkspacePrev)
372 if id, _ := m.Focused(); id != 2 || m.Current().Name != "dev" {372 if id, _ := m.Focused(); id != 2 || m.Current().Name != "dev" {
373 t.Fatal(id, windows(m))373 t.Fatal(id, windows(m))
374 }374 }
M internal/core/overview.go +4 -4
@@ -192,8 +192,8 @@ func overviewBlocks(a Action) bool {
192192 ActionToggleStashVisible, ActionConsumeOrExpelLeft,
193193 ActionConsumeOrExpelRight, ActionMoveWorkspaceLeft, ActionMoveWorkspaceRight,
194194 ActionMoveWorkspaceToMonitorUp, ActionMoveWorkspaceToMonitorDown,
195- ActionMoveWindowUp, ActionMoveWindowDown, ActionMoveWorkspaceUp,
196- ActionMoveWorkspaceDown, ActionToggleFloating:
195+ ActionMoveWindowUp, ActionMoveWindowDown, ActionMoveWorkspacePrev,
196+ ActionMoveWorkspaceNext, ActionToggleFloating:
197197 return true
198198 }
199199 return false
@@ -921,9 +921,9 @@ func (m *Monitor) overviewFocus(a Action) bool {
921921 m.OverviewMove(-1, 0)
922922 case ActionFocusColumnRight:
923923 m.OverviewMove(1, 0)
924- case ActionFocusWindowUp, ActionFocusWorkspaceUp:
924+ case ActionFocusWindowUp, ActionFocusWorkspacePrev:
925925 m.OverviewMove(0, -1)
926- case ActionFocusWindowDown, ActionFocusWorkspaceDown:
926+ case ActionFocusWindowDown, ActionFocusWorkspaceNext:
927927 m.OverviewMove(0, 1)
928928 default:
929929 return false
@@ -192,8 +192,8 @@ func overviewBlocks(a Action) bool {
192 ActionToggleStashVisible, ActionConsumeOrExpelLeft,192 ActionToggleStashVisible, ActionConsumeOrExpelLeft,
193 ActionConsumeOrExpelRight, ActionMoveWorkspaceLeft, ActionMoveWorkspaceRight,193 ActionConsumeOrExpelRight, ActionMoveWorkspaceLeft, ActionMoveWorkspaceRight,
194 ActionMoveWorkspaceToMonitorUp, ActionMoveWorkspaceToMonitorDown,194 ActionMoveWorkspaceToMonitorUp, ActionMoveWorkspaceToMonitorDown,
195- ActionMoveWindowUp, ActionMoveWindowDown, ActionMoveWorkspaceUp,195+ ActionMoveWindowUp, ActionMoveWindowDown, ActionMoveWorkspacePrev,
196- ActionMoveWorkspaceDown, ActionToggleFloating:196+ ActionMoveWorkspaceNext, ActionToggleFloating:
197 return true197 return true
198 }198 }
199 return false199 return false
@@ -921,9 +921,9 @@ func (m *Monitor) overviewFocus(a Action) bool {
921 m.OverviewMove(-1, 0)921 m.OverviewMove(-1, 0)
922 case ActionFocusColumnRight:922 case ActionFocusColumnRight:
923 m.OverviewMove(1, 0)923 m.OverviewMove(1, 0)
924- case ActionFocusWindowUp, ActionFocusWorkspaceUp:924+ case ActionFocusWindowUp, ActionFocusWorkspacePrev:
925 m.OverviewMove(0, -1)925 m.OverviewMove(0, -1)
926- case ActionFocusWindowDown, ActionFocusWorkspaceDown:926+ case ActionFocusWindowDown, ActionFocusWorkspaceNext:
927 m.OverviewMove(0, 1)927 m.OverviewMove(0, 1)
928 default:928 default:
929 return false929 return false
M internal/core/overview_behavior_test.go +3 -3
@@ -15,15 +15,15 @@ func TestOverviewVerticalBoundariesAndInputs(t *testing.T) {
1515 if m.stackFront(w) != (stackItem{stackFloat, 9}) {
1616 t.Fatal("screen front")
1717 }
18- m.overviewFocus(ActionFocusWorkspaceUp)
18+ m.overviewFocus(ActionFocusWorkspacePrev)
1919 if m.stackFront(w).kind != stackColumns || m.Active != 0 {
2020 t.Fatal("swipe did not visit card")
2121 }
22- m.overviewFocus(ActionFocusWorkspaceUp)
22+ m.overviewFocus(ActionFocusWorkspacePrev)
2323 if m.Active != 0 {
2424 t.Fatal("up at top crossed workspace boundary")
2525 }
26- m.overviewFocus(ActionFocusWorkspaceDown)
26+ m.overviewFocus(ActionFocusWorkspaceNext)
2727 if m.stackFront(w).kind != stackFloat || m.Active != 0 {
2828 t.Fatal("down did not return to front")
2929 }
@@ -15,15 +15,15 @@ func TestOverviewVerticalBoundariesAndInputs(t *testing.T) {
15 if m.stackFront(w) != (stackItem{stackFloat, 9}) {15 if m.stackFront(w) != (stackItem{stackFloat, 9}) {
16 t.Fatal("screen front")16 t.Fatal("screen front")
17 }17 }
18- m.overviewFocus(ActionFocusWorkspaceUp)18+ m.overviewFocus(ActionFocusWorkspacePrev)
19 if m.stackFront(w).kind != stackColumns || m.Active != 0 {19 if m.stackFront(w).kind != stackColumns || m.Active != 0 {
20 t.Fatal("swipe did not visit card")20 t.Fatal("swipe did not visit card")
21 }21 }
22- m.overviewFocus(ActionFocusWorkspaceUp)22+ m.overviewFocus(ActionFocusWorkspacePrev)
23 if m.Active != 0 {23 if m.Active != 0 {
24 t.Fatal("up at top crossed workspace boundary")24 t.Fatal("up at top crossed workspace boundary")
25 }25 }
26- m.overviewFocus(ActionFocusWorkspaceDown)26+ m.overviewFocus(ActionFocusWorkspaceNext)
27 if m.stackFront(w).kind != stackFloat || m.Active != 0 {27 if m.stackFront(w).kind != stackFloat || m.Active != 0 {
28 t.Fatal("down did not return to front")28 t.Fatal("down did not return to front")
29 }29 }
M internal/core/overview_cover_test.go +1 -1
@@ -173,7 +173,7 @@ func TestOverviewCoverActsOnSelection(t *testing.T) {
173173 t.Fatalf("behind close %d", e.Close)
174174 }
175175 w := m.Current()
176- m.Apply(ActionMoveWindowToWorkspaceDown)
176+ m.Apply(ActionMoveWindowToWorkspaceNext)
177177 if got, _ := m.find(1); got == w || !w.has(2) {
178178 t.Fatalf("moved the wrong window: %v", windows(m))
179179 }
@@ -173,7 +173,7 @@ func TestOverviewCoverActsOnSelection(t *testing.T) {
173 t.Fatalf("behind close %d", e.Close)173 t.Fatalf("behind close %d", e.Close)
174 }174 }
175 w := m.Current()175 w := m.Current()
176- m.Apply(ActionMoveWindowToWorkspaceDown)176+ m.Apply(ActionMoveWindowToWorkspaceNext)
177 if got, _ := m.find(1); got == w || !w.has(2) {177 if got, _ := m.find(1); got == w || !w.has(2) {
178 t.Fatalf("moved the wrong window: %v", windows(m))178 t.Fatalf("moved the wrong window: %v", windows(m))
179 }179 }
M internal/core/overview_move_test.go +13 -13
@@ -15,11 +15,11 @@ func TestOverviewMove(t *testing.T) {
1515 // row is the workspace index current after the move.
1616 row int
1717 }{
18- {"column down", ActionMoveColumnToWorkspaceDown, false, 0},
19- {"window down", ActionMoveWindowToWorkspaceDown, false, 0},
18+ {"column next", ActionMoveColumnToWorkspaceNext, false, 0},
19+ {"window next", ActionMoveWindowToWorkspaceNext, false, 0},
2020 {"column numbered", "move-column-to-workspace 2", false, 0},
2121 {"window numbered", "move-window-to-workspace 2", false, 0},
22- {"follows", ActionMoveColumnToWorkspaceDown, true, 1},
22+ {"follows", ActionMoveColumnToWorkspaceNext, true, 1},
2323 }
2424 for _, tt := range tests {
2525 t.Run(tt.name, func(t *testing.T) {
@@ -67,7 +67,7 @@ func TestOverviewMoveWindowFromStack(t *testing.T) {
6767 if m.overviewTarget() != 2 {
6868 t.Fatalf("selection %d", m.overviewTarget())
6969 }
70- m.Apply(ActionMoveWindowToWorkspaceDown)
70+ m.Apply(ActionMoveWindowToWorkspaceNext)
7171 if !slices.Equal(w.windows(), []WindowID{1, 3}) || !slices.Contains(m.Workspaces[1].windows(), 2) {
7272 t.Fatalf("windows %v", windows(m))
7373 }
@@ -82,7 +82,7 @@ func TestOverviewMoveSelectedUnderFloat(t *testing.T) {
8282 if id == 0 || id == 9 {
8383 t.Fatalf("selection %d", id)
8484 }
85- m.Apply(ActionMoveColumnToWorkspaceDown)
85+ m.Apply(ActionMoveColumnToWorkspaceNext)
8686 if !slices.Contains(m.Workspaces[1].windows(), id) || m.Workspaces[1].isFloat(9) {
8787 t.Fatalf("moved the wrong window: %v floats %v", windows(m), m.Workspaces[0].Floats)
8888 }
@@ -107,20 +107,20 @@ func TestOverviewMoveNoop(t *testing.T) {
107107 t.Fatal("no stash card selected")
108108 }
109109 return m
110- }, ActionMoveColumnToWorkspaceDown},
110+ }, ActionMoveColumnToWorkspaceNext},
111111 {"hidden small float", func() *Monitor {
112112 m := newMonitor("", "")
113113 m.SetOutput(300, 200)
114114 m.AddFloating(9, 50, 50)
115115 m.ToggleOverview()
116116 return m
117- }, ActionMoveWindowToWorkspaceDown},
117+ }, ActionMoveWindowToWorkspaceNext},
118118 {"up from first", func() *Monitor {
119119 m := overviewMonitor()
120120 m.ToggleOverview()
121121 m.OverviewMove(-1, 0)
122122 return m
123- }, ActionMoveColumnToWorkspaceUp},
123+ }, ActionMoveColumnToWorkspacePrev},
124124 {"to its own row", func() *Monitor {
125125 m := overviewMonitor()
126126 m.ToggleOverview()
@@ -132,7 +132,7 @@ func TestOverviewMoveNoop(t *testing.T) {
132132 m.ToggleNamed("game")
133133 m.ToggleOverview()
134134 return m
135- }, ActionMoveColumnToWorkspaceDown},
135+ }, ActionMoveColumnToWorkspaceNext},
136136 {"fixed maximize kept", func() *Monitor {
137137 m := overviewMonitor()
138138 w := m.Current()
@@ -142,7 +142,7 @@ func TestOverviewMoveNoop(t *testing.T) {
142142 m.ToggleOverview()
143143 m.OverviewMove(0, -1)
144144 return m
145- }, ActionMoveColumnToWorkspaceUp},
145+ }, ActionMoveColumnToWorkspacePrev},
146146 }
147147 for _, tt := range tests {
148148 t.Run(tt.name, func(t *testing.T) {
@@ -163,7 +163,7 @@ func TestOverviewMoveDestinationKeepsFocus(t *testing.T) {
163163 m.OverviewMove(0, 1)
164164 m.OverviewMove(0, -1)
165165 m.OverviewMove(-1, 0)
166- m.Apply(ActionMoveColumnToWorkspaceDown)
166+ m.Apply(ActionMoveColumnToWorkspaceNext)
167167 m.ToggleOverview()
168168 if id, _ := m.Workspaces[1].Focused(); id != 2 {
169169 t.Fatalf("destination focus %d, want 2", id)
@@ -179,7 +179,7 @@ func TestOverviewMoveDropsMaximizeHistory(t *testing.T) {
179179 w.FocusID(3)
180180 w.ToggleFullWidth()
181181 m.ToggleOverview()
182- m.Apply(ActionMoveColumnToWorkspaceDown)
182+ m.Apply(ActionMoveColumnToWorkspaceNext)
183183 if w.has(3) {
184184 t.Fatal("3 not moved")
185185 }
@@ -209,7 +209,7 @@ func TestOverviewMoveFromFullscreenRow(t *testing.T) {
209209 if m.overviewTarget() != 2 {
210210 t.Fatalf("follow %v: selection %d", follow, m.overviewTarget())
211211 }
212- m.Apply(ActionMoveColumnToWorkspaceDown)
212+ m.Apply(ActionMoveColumnToWorkspaceNext)
213213 if !slices.Equal(w.windows(), []WindowID{1, 3, 4}) || !slices.Equal(m.Workspaces[1].windows(), []WindowID{2}) {
214214 t.Fatalf("follow %v: windows %v", follow, windows(m))
215215 }
@@ -15,11 +15,11 @@ func TestOverviewMove(t *testing.T) {
15 // row is the workspace index current after the move.15 // row is the workspace index current after the move.
16 row int16 row int
17 }{17 }{
18- {"column down", ActionMoveColumnToWorkspaceDown, false, 0},18+ {"column next", ActionMoveColumnToWorkspaceNext, false, 0},
19- {"window down", ActionMoveWindowToWorkspaceDown, false, 0},19+ {"window next", ActionMoveWindowToWorkspaceNext, false, 0},
20 {"column numbered", "move-column-to-workspace 2", false, 0},20 {"column numbered", "move-column-to-workspace 2", false, 0},
21 {"window numbered", "move-window-to-workspace 2", false, 0},21 {"window numbered", "move-window-to-workspace 2", false, 0},
22- {"follows", ActionMoveColumnToWorkspaceDown, true, 1},22+ {"follows", ActionMoveColumnToWorkspaceNext, true, 1},
23 }23 }
24 for _, tt := range tests {24 for _, tt := range tests {
25 t.Run(tt.name, func(t *testing.T) {25 t.Run(tt.name, func(t *testing.T) {
@@ -67,7 +67,7 @@ func TestOverviewMoveWindowFromStack(t *testing.T) {
67 if m.overviewTarget() != 2 {67 if m.overviewTarget() != 2 {
68 t.Fatalf("selection %d", m.overviewTarget())68 t.Fatalf("selection %d", m.overviewTarget())
69 }69 }
70- m.Apply(ActionMoveWindowToWorkspaceDown)70+ m.Apply(ActionMoveWindowToWorkspaceNext)
71 if !slices.Equal(w.windows(), []WindowID{1, 3}) || !slices.Contains(m.Workspaces[1].windows(), 2) {71 if !slices.Equal(w.windows(), []WindowID{1, 3}) || !slices.Contains(m.Workspaces[1].windows(), 2) {
72 t.Fatalf("windows %v", windows(m))72 t.Fatalf("windows %v", windows(m))
73 }73 }
@@ -82,7 +82,7 @@ func TestOverviewMoveSelectedUnderFloat(t *testing.T) {
82 if id == 0 || id == 9 {82 if id == 0 || id == 9 {
83 t.Fatalf("selection %d", id)83 t.Fatalf("selection %d", id)
84 }84 }
85- m.Apply(ActionMoveColumnToWorkspaceDown)85+ m.Apply(ActionMoveColumnToWorkspaceNext)
86 if !slices.Contains(m.Workspaces[1].windows(), id) || m.Workspaces[1].isFloat(9) {86 if !slices.Contains(m.Workspaces[1].windows(), id) || m.Workspaces[1].isFloat(9) {
87 t.Fatalf("moved the wrong window: %v floats %v", windows(m), m.Workspaces[0].Floats)87 t.Fatalf("moved the wrong window: %v floats %v", windows(m), m.Workspaces[0].Floats)
88 }88 }
@@ -107,20 +107,20 @@ func TestOverviewMoveNoop(t *testing.T) {
107 t.Fatal("no stash card selected")107 t.Fatal("no stash card selected")
108 }108 }
109 return m109 return m
110- }, ActionMoveColumnToWorkspaceDown},110+ }, ActionMoveColumnToWorkspaceNext},
111 {"hidden small float", func() *Monitor {111 {"hidden small float", func() *Monitor {
112 m := newMonitor("", "")112 m := newMonitor("", "")
113 m.SetOutput(300, 200)113 m.SetOutput(300, 200)
114 m.AddFloating(9, 50, 50)114 m.AddFloating(9, 50, 50)
115 m.ToggleOverview()115 m.ToggleOverview()
116 return m116 return m
117- }, ActionMoveWindowToWorkspaceDown},117+ }, ActionMoveWindowToWorkspaceNext},
118 {"up from first", func() *Monitor {118 {"up from first", func() *Monitor {
119 m := overviewMonitor()119 m := overviewMonitor()
120 m.ToggleOverview()120 m.ToggleOverview()
121 m.OverviewMove(-1, 0)121 m.OverviewMove(-1, 0)
122 return m122 return m
123- }, ActionMoveColumnToWorkspaceUp},123+ }, ActionMoveColumnToWorkspacePrev},
124 {"to its own row", func() *Monitor {124 {"to its own row", func() *Monitor {
125 m := overviewMonitor()125 m := overviewMonitor()
126 m.ToggleOverview()126 m.ToggleOverview()
@@ -132,7 +132,7 @@ func TestOverviewMoveNoop(t *testing.T) {
132 m.ToggleNamed("game")132 m.ToggleNamed("game")
133 m.ToggleOverview()133 m.ToggleOverview()
134 return m134 return m
135- }, ActionMoveColumnToWorkspaceDown},135+ }, ActionMoveColumnToWorkspaceNext},
136 {"fixed maximize kept", func() *Monitor {136 {"fixed maximize kept", func() *Monitor {
137 m := overviewMonitor()137 m := overviewMonitor()
138 w := m.Current()138 w := m.Current()
@@ -142,7 +142,7 @@ func TestOverviewMoveNoop(t *testing.T) {
142 m.ToggleOverview()142 m.ToggleOverview()
143 m.OverviewMove(0, -1)143 m.OverviewMove(0, -1)
144 return m144 return m
145- }, ActionMoveColumnToWorkspaceUp},145+ }, ActionMoveColumnToWorkspacePrev},
146 }146 }
147 for _, tt := range tests {147 for _, tt := range tests {
148 t.Run(tt.name, func(t *testing.T) {148 t.Run(tt.name, func(t *testing.T) {
@@ -163,7 +163,7 @@ func TestOverviewMoveDestinationKeepsFocus(t *testing.T) {
163 m.OverviewMove(0, 1)163 m.OverviewMove(0, 1)
164 m.OverviewMove(0, -1)164 m.OverviewMove(0, -1)
165 m.OverviewMove(-1, 0)165 m.OverviewMove(-1, 0)
166- m.Apply(ActionMoveColumnToWorkspaceDown)166+ m.Apply(ActionMoveColumnToWorkspaceNext)
167 m.ToggleOverview()167 m.ToggleOverview()
168 if id, _ := m.Workspaces[1].Focused(); id != 2 {168 if id, _ := m.Workspaces[1].Focused(); id != 2 {
169 t.Fatalf("destination focus %d, want 2", id)169 t.Fatalf("destination focus %d, want 2", id)
@@ -179,7 +179,7 @@ func TestOverviewMoveDropsMaximizeHistory(t *testing.T) {
179 w.FocusID(3)179 w.FocusID(3)
180 w.ToggleFullWidth()180 w.ToggleFullWidth()
181 m.ToggleOverview()181 m.ToggleOverview()
182- m.Apply(ActionMoveColumnToWorkspaceDown)182+ m.Apply(ActionMoveColumnToWorkspaceNext)
183 if w.has(3) {183 if w.has(3) {
184 t.Fatal("3 not moved")184 t.Fatal("3 not moved")
185 }185 }
@@ -209,7 +209,7 @@ func TestOverviewMoveFromFullscreenRow(t *testing.T) {
209 if m.overviewTarget() != 2 {209 if m.overviewTarget() != 2 {
210 t.Fatalf("follow %v: selection %d", follow, m.overviewTarget())210 t.Fatalf("follow %v: selection %d", follow, m.overviewTarget())
211 }211 }
212- m.Apply(ActionMoveColumnToWorkspaceDown)212+ m.Apply(ActionMoveColumnToWorkspaceNext)
213 if !slices.Equal(w.windows(), []WindowID{1, 3, 4}) || !slices.Equal(m.Workspaces[1].windows(), []WindowID{2}) {213 if !slices.Equal(w.windows(), []WindowID{1, 3, 4}) || !slices.Equal(m.Workspaces[1].windows(), []WindowID{2}) {
214 t.Fatalf("follow %v: windows %v", follow, windows(m))214 t.Fatalf("follow %v: windows %v", follow, windows(m))
215 }215 }
M internal/core/overview_named_test.go +4 -4
@@ -319,7 +319,7 @@ func TestOverviewNamedNeighborPick(t *testing.T) {
319319 }
320320
321321 func TestOverviewNamedFocusBinds(t *testing.T) {
322- for _, action := range []Action{ActionFocusWindowDown, ActionFocusWorkspaceDown} {
322+ for _, action := range []Action{ActionFocusWindowDown, ActionFocusWorkspaceNext} {
323323 t.Run(string(action), func(t *testing.T) {
324324 m := namedOverviewMonitor()
325325 m.ToggleOverview()
@@ -343,12 +343,12 @@ func TestOverviewNamedFocusBinds(t *testing.T) {
343343
344344 func TestOverviewNamedOutsideNavigationUnchanged(t *testing.T) {
345345 m := namedOverviewMonitor()
346- m.Apply(ActionFocusWorkspaceDown)
346+ m.Apply(ActionFocusWorkspaceNext)
347347 if m.shown != nil || !m.Current().empty() {
348348 t.Fatal("outside overview, down no longer reaches numbered spare")
349349 }
350350 m.ToggleNamed("dev")
351- m.Apply(ActionFocusWorkspaceUp)
351+ m.Apply(ActionFocusWorkspacePrev)
352352 if m.Current().Name != "dev" {
353353 t.Fatal("outside overview, named workspace entered numbered list")
354354 }
@@ -414,7 +414,7 @@ func TestOverviewNamedDividerPublished(t *testing.T) {
414414 func TestOverviewNamedScrollAndSwipe(t *testing.T) {
415415 m := namedOverviewMonitor()
416416 m.ToggleOverview()
417- m.overviewFocus(ActionFocusWorkspaceDown)
417+ m.overviewFocus(ActionFocusWorkspaceNext)
418418 if m.Current().Name != "dev" {
419419 t.Fatal("swipe did not cross groups")
420420 }
@@ -319,7 +319,7 @@ func TestOverviewNamedNeighborPick(t *testing.T) {
319 }319 }
320 320
321 func TestOverviewNamedFocusBinds(t *testing.T) {321 func TestOverviewNamedFocusBinds(t *testing.T) {
322- for _, action := range []Action{ActionFocusWindowDown, ActionFocusWorkspaceDown} {322+ for _, action := range []Action{ActionFocusWindowDown, ActionFocusWorkspaceNext} {
323 t.Run(string(action), func(t *testing.T) {323 t.Run(string(action), func(t *testing.T) {
324 m := namedOverviewMonitor()324 m := namedOverviewMonitor()
325 m.ToggleOverview()325 m.ToggleOverview()
@@ -343,12 +343,12 @@ func TestOverviewNamedFocusBinds(t *testing.T) {
343 343
344 func TestOverviewNamedOutsideNavigationUnchanged(t *testing.T) {344 func TestOverviewNamedOutsideNavigationUnchanged(t *testing.T) {
345 m := namedOverviewMonitor()345 m := namedOverviewMonitor()
346- m.Apply(ActionFocusWorkspaceDown)346+ m.Apply(ActionFocusWorkspaceNext)
347 if m.shown != nil || !m.Current().empty() {347 if m.shown != nil || !m.Current().empty() {
348 t.Fatal("outside overview, down no longer reaches numbered spare")348 t.Fatal("outside overview, down no longer reaches numbered spare")
349 }349 }
350 m.ToggleNamed("dev")350 m.ToggleNamed("dev")
351- m.Apply(ActionFocusWorkspaceUp)351+ m.Apply(ActionFocusWorkspacePrev)
352 if m.Current().Name != "dev" {352 if m.Current().Name != "dev" {
353 t.Fatal("outside overview, named workspace entered numbered list")353 t.Fatal("outside overview, named workspace entered numbered list")
354 }354 }
@@ -414,7 +414,7 @@ func TestOverviewNamedDividerPublished(t *testing.T) {
414 func TestOverviewNamedScrollAndSwipe(t *testing.T) {414 func TestOverviewNamedScrollAndSwipe(t *testing.T) {
415 m := namedOverviewMonitor()415 m := namedOverviewMonitor()
416 m.ToggleOverview()416 m.ToggleOverview()
417- m.overviewFocus(ActionFocusWorkspaceDown)417+ m.overviewFocus(ActionFocusWorkspaceNext)
418 if m.Current().Name != "dev" {418 if m.Current().Name != "dev" {
419 t.Fatal("swipe did not cross groups")419 t.Fatal("swipe did not cross groups")
420 }420 }
M internal/core/overview_stash_input_test.go +2 -2
@@ -34,9 +34,9 @@ func TestOverviewStashInputNavigation(t *testing.T) {
3434 Vertical: ports.ScrollAxis{Set: dy != 0, Value: float64(dy) * 70, V120: int32(dy * 120)}})
3535 c.scrollStop(ports.PointerAxis{Vertical: ports.ScrollAxis{Stop: true}})
3636 case "bind":
37- a := ActionFocusWorkspaceDown
37+ a := ActionFocusWorkspaceNext
3838 if dy < 0 {
39- a = ActionFocusWorkspaceUp
39+ a = ActionFocusWorkspacePrev
4040 } else if dx > 0 {
4141 a = ActionFocusColumnRight
4242 }
@@ -34,9 +34,9 @@ func TestOverviewStashInputNavigation(t *testing.T) {
34 Vertical: ports.ScrollAxis{Set: dy != 0, Value: float64(dy) * 70, V120: int32(dy * 120)}})34 Vertical: ports.ScrollAxis{Set: dy != 0, Value: float64(dy) * 70, V120: int32(dy * 120)}})
35 c.scrollStop(ports.PointerAxis{Vertical: ports.ScrollAxis{Stop: true}})35 c.scrollStop(ports.PointerAxis{Vertical: ports.ScrollAxis{Stop: true}})
36 case "bind":36 case "bind":
37- a := ActionFocusWorkspaceDown37+ a := ActionFocusWorkspaceNext
38 if dy < 0 {38 if dy < 0 {
39- a = ActionFocusWorkspaceUp39+ a = ActionFocusWorkspacePrev
40 } else if dx > 0 {40 } else if dx > 0 {
41 a = ActionFocusColumnRight41 a = ActionFocusColumnRight
42 }42 }
M internal/core/screens_test.go +1 -1
@@ -380,7 +380,7 @@ func TestMonitorActionsFollowGeometry(t *testing.T) {
380380 {Name: "DP-1"},
381381 {Name: "DP-2", Anchor: ports.OutputAnchor{Relation: ports.RelationBelow, To: "DP-1"}},
382382 }
383- // Without a default bind; these replace move-workspace-up/down.
383+ // Without a default bind; these replace move-workspace-prev/next.
384384 c.Binds["Cmd+Ctrl+Shift+Up"] = string(core.ActionMoveWorkspaceToMonitorUp)
385385 c.Binds["Cmd+Ctrl+Shift+Down"] = string(core.ActionMoveWorkspaceToMonitorDown)
386386 }, left, right)
@@ -380,7 +380,7 @@ func TestMonitorActionsFollowGeometry(t *testing.T) {
380 {Name: "DP-1"},380 {Name: "DP-1"},
381 {Name: "DP-2", Anchor: ports.OutputAnchor{Relation: ports.RelationBelow, To: "DP-1"}},381 {Name: "DP-2", Anchor: ports.OutputAnchor{Relation: ports.RelationBelow, To: "DP-1"}},
382 }382 }
383- // Without a default bind; these replace move-workspace-up/down.383+ // Without a default bind; these replace move-workspace-prev/next.
384 c.Binds["Cmd+Ctrl+Shift+Up"] = string(core.ActionMoveWorkspaceToMonitorUp)384 c.Binds["Cmd+Ctrl+Shift+Up"] = string(core.ActionMoveWorkspaceToMonitorUp)
385 c.Binds["Cmd+Ctrl+Shift+Down"] = string(core.ActionMoveWorkspaceToMonitorDown)385 c.Binds["Cmd+Ctrl+Shift+Down"] = string(core.ActionMoveWorkspaceToMonitorDown)
386 }, left, right)386 }, left, right)
M internal/core/transition_chain_internal_test.go +1 -1
@@ -114,7 +114,7 @@ func chainCases() []chainCase {
114114 m.Focus(1)
115115 m.AddWindow(2)
116116 m.Focus(0)
117- }, []Action{ActionFocusWorkspaceDown}, []Action{ActionFocusWorkspaceDown},
117+ }, []Action{ActionFocusWorkspaceNext}, []Action{ActionFocusWorkspaceNext},
118118 func(c *Core) motion { return c.cur().mon.switchView.motion }},
119119 {"rect", func(c *Core) {
120120 m := c.cur().mon
@@ -114,7 +114,7 @@ func chainCases() []chainCase {
114 m.Focus(1)114 m.Focus(1)
115 m.AddWindow(2)115 m.AddWindow(2)
116 m.Focus(0)116 m.Focus(0)
117- }, []Action{ActionFocusWorkspaceDown}, []Action{ActionFocusWorkspaceDown},117+ }, []Action{ActionFocusWorkspaceNext}, []Action{ActionFocusWorkspaceNext},
118 func(c *Core) motion { return c.cur().mon.switchView.motion }},118 func(c *Core) motion { return c.cur().mon.switchView.motion }},
119 {"rect", func(c *Core) {119 {"rect", func(c *Core) {
120 m := c.cur().mon120 m := c.cur().mon
M internal/core/transition_unmap_internal_test.go +1 -1
@@ -339,7 +339,7 @@ func TestUnmapLeavingDroppedByInterruptions(t *testing.T) {
339339 })
340340 t.Run("workspace switch", func(t *testing.T) {
341341 c, ic, sc := leaving(t)
342- act(c, ic, ActionFocusWorkspaceDown)
342+ act(c, ic, ActionFocusWorkspaceNext)
343343 gone(t, c, sc, indicatorScene(t, c))
344344 })
345345 }
@@ -339,7 +339,7 @@ func TestUnmapLeavingDroppedByInterruptions(t *testing.T) {
339 })339 })
340 t.Run("workspace switch", func(t *testing.T) {340 t.Run("workspace switch", func(t *testing.T) {
341 c, ic, sc := leaving(t)341 c, ic, sc := leaving(t)
342- act(c, ic, ActionFocusWorkspaceDown)342+ act(c, ic, ActionFocusWorkspaceNext)
343 gone(t, c, sc, indicatorScene(t, c))343 gone(t, c, sc, indicatorScene(t, c))
344 })344 })
345 }345 }
M internal/core/window_actions_test.go +8 -8
@@ -172,25 +172,25 @@ func TestMoveWorkspace(t *testing.T) {
172172 m.FocusNumber(3)
173173 m.AddWindow(3)
174174 // [1:{1}] [2:{2}] [3:{3}] [4:{}]
175- m.Apply(ActionMoveWorkspaceUp)
175+ m.Apply(ActionMoveWorkspacePrev)
176176 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {3}, {2}, {}}) || m.Active != 1 {
177177 t.Fatal(windows(m), m.Active)
178178 }
179- m.Apply(ActionMoveWorkspaceUp)
180- m.Apply(ActionMoveWorkspaceUp)
179+ m.Apply(ActionMoveWorkspacePrev)
180+ m.Apply(ActionMoveWorkspacePrev)
181181 if !reflect.DeepEqual(windows(m), [][]WindowID{{3}, {1}, {2}, {}}) || m.Active != 0 {
182182 t.Fatal(windows(m), m.Active)
183183 }
184- m.Apply(ActionMoveWorkspaceDown)
185- m.Apply(ActionMoveWorkspaceDown)
184+ m.Apply(ActionMoveWorkspaceNext)
185+ m.Apply(ActionMoveWorkspaceNext)
186186 // Never past the trailing empty workspace.
187- m.Apply(ActionMoveWorkspaceDown)
187+ m.Apply(ActionMoveWorkspaceNext)
188188 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {2}, {3}, {}}) || m.Active != 2 {
189189 t.Fatal(windows(m), m.Active)
190190 }
191191 // The trailing empty workspace does not move.
192192 m.FocusNumber(4)
193- m.Apply(ActionMoveWorkspaceUp)
193+ m.Apply(ActionMoveWorkspacePrev)
194194 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {2}, {3}, {}}) || m.Active != 3 {
195195 t.Fatal(windows(m), m.Active)
196196 }
@@ -202,7 +202,7 @@ func TestMoveWorkspaceHidden(t *testing.T) {
202202 m.FocusNumber(2)
203203 m.AddWindow(2)
204204 m.ToggleNamed("dev")
205- m.Apply(ActionMoveWorkspaceUp)
205+ m.Apply(ActionMoveWorkspacePrev)
206206 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {2}, {}}) {
207207 t.Fatal(windows(m))
208208 }
@@ -172,25 +172,25 @@ func TestMoveWorkspace(t *testing.T) {
172 m.FocusNumber(3)172 m.FocusNumber(3)
173 m.AddWindow(3)173 m.AddWindow(3)
174 // [1:{1}] [2:{2}] [3:{3}] [4:{}]174 // [1:{1}] [2:{2}] [3:{3}] [4:{}]
175- m.Apply(ActionMoveWorkspaceUp)175+ m.Apply(ActionMoveWorkspacePrev)
176 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {3}, {2}, {}}) || m.Active != 1 {176 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {3}, {2}, {}}) || m.Active != 1 {
177 t.Fatal(windows(m), m.Active)177 t.Fatal(windows(m), m.Active)
178 }178 }
179- m.Apply(ActionMoveWorkspaceUp)179+ m.Apply(ActionMoveWorkspacePrev)
180- m.Apply(ActionMoveWorkspaceUp)180+ m.Apply(ActionMoveWorkspacePrev)
181 if !reflect.DeepEqual(windows(m), [][]WindowID{{3}, {1}, {2}, {}}) || m.Active != 0 {181 if !reflect.DeepEqual(windows(m), [][]WindowID{{3}, {1}, {2}, {}}) || m.Active != 0 {
182 t.Fatal(windows(m), m.Active)182 t.Fatal(windows(m), m.Active)
183 }183 }
184- m.Apply(ActionMoveWorkspaceDown)184+ m.Apply(ActionMoveWorkspaceNext)
185- m.Apply(ActionMoveWorkspaceDown)185+ m.Apply(ActionMoveWorkspaceNext)
186 // Never past the trailing empty workspace.186 // Never past the trailing empty workspace.
187- m.Apply(ActionMoveWorkspaceDown)187+ m.Apply(ActionMoveWorkspaceNext)
188 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {2}, {3}, {}}) || m.Active != 2 {188 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {2}, {3}, {}}) || m.Active != 2 {
189 t.Fatal(windows(m), m.Active)189 t.Fatal(windows(m), m.Active)
190 }190 }
191 // The trailing empty workspace does not move.191 // The trailing empty workspace does not move.
192 m.FocusNumber(4)192 m.FocusNumber(4)
193- m.Apply(ActionMoveWorkspaceUp)193+ m.Apply(ActionMoveWorkspacePrev)
194 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {2}, {3}, {}}) || m.Active != 3 {194 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {2}, {3}, {}}) || m.Active != 3 {
195 t.Fatal(windows(m), m.Active)195 t.Fatal(windows(m), m.Active)
196 }196 }
@@ -202,7 +202,7 @@ func TestMoveWorkspaceHidden(t *testing.T) {
202 m.FocusNumber(2)202 m.FocusNumber(2)
203 m.AddWindow(2)203 m.AddWindow(2)
204 m.ToggleNamed("dev")204 m.ToggleNamed("dev")
205- m.Apply(ActionMoveWorkspaceUp)205+ m.Apply(ActionMoveWorkspacePrev)
206 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {2}, {}}) {206 if !reflect.DeepEqual(windows(m), [][]WindowID{{1}, {2}, {}}) {
207 t.Fatal(windows(m))207 t.Fatal(windows(m))
208 }208 }

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 25

Tags 10

↑↓ moveenter openesc close