docs(overview): describe card selection and usable-area separators and pulse
- commit
- 9e14d33614f9d304ef5e27d3f2caf57a3d85928a
- author
- brice · · 2026-10-07 15:54 UTC
- parent
- 7321c7b
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
4 files · +4 -7
M docs/config.md +2 -2
| @@ -47,7 +47,7 @@ NeferWL reads `$XDG_CONFIG_HOME/neferwl/config` (or `~/.config/neferwl/config`). | |||
| 47 | 47 | | `animations` | `off` | **Experimental.** `on` animates changes; `off` makes every change instant and the three-finger swipe no longer follows the fingers: swipe landings, scrolling, workspace switches, window moves and resizes, drag drops, workspaces sent to another monitor, the overview, windows opening and closing, the stash showing and hiding, the focus pulse | | |
| 48 | 48 | | `animations.speed` | `normal` | Speed of every spring (not the focus pulse): `slow`, `normal` or `fast` (a view move lands in about 260, 180 or 130 ms), or a number relative to `normal`, from `0.1` (10× slower) to `10` (10× faster) | | |
| 49 | 49 | | `focus.follow-move` | `off` | Follow a column moved to another workspace | | |
| 50 | - | | `focus.animation` | `pulse` | Focus indicator on a window that keeps the focus for 150 ms: `pulse` (brief rise and fall) or `off`. Skipped for fullscreen windows, a window alone on screen (e.g. a maximized column), the overview and a window focused as it opens. Off while `animations = off` | | |
| 50 | + | | `focus.animation` | `pulse` | Focus indicator on a window that keeps the focus for 150 ms: `pulse` (brief rise and fall) or `off`. Skipped for fullscreen windows, a window alone outside panels (e.g. a maximized column), the overview and a window focused as it opens. Off while `animations = off` | | |
| 51 | 51 | | `focus.effect` | `screen` | What the focus indicator draws: `screen` brightens the window slightly, visible on black too. HDR (PQ) client content is not brightened on HDR outputs | | |
| 52 | 52 | | `focus.strength` | `0.04` | Peak of the focus effect, `0.01` to `0.2`: black reaches about 10/255 at `0.04` | | |
| 53 | 53 | | `workspace.<name>.*` | none | Named workspaces are outside the numbered list; use the overview to show an occupied one, or a `workspace <name>` bind to show it and toggle back | | |
| @@ -196,7 +196,7 @@ Left/right focus follows column order across band boundaries. Up/down visits sta | |||
| 196 | 196 | ||
| 197 | 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 | - | In the [overview](#overview), the selected band is centred at the usual overview zoom, whatever the band count. The other bands of the workspace sit above and below it, dimmed, and may run off screen. Neighbor workspaces sit left and right, fully dimmed, with their selected row level with the centred band. The stash pile stays left of the band, inside the workspace's slot. A maximized column shows the columns it hides as dimmed cards behind it, peeking out on their side of the band: the nearest one on each side, then the next ones stacked at the band's edge. Selecting a card (left/right, Return or a click on a visible card) moves the maximization to it, and Escape gives it back. | |
| 199 | + | In the [overview](#overview), the selected band is centred at the usual overview zoom, whatever the band count. The other bands of the workspace sit above and below it, dimmed, and may run off screen. Neighbor workspaces sit left and right, fully dimmed, with their selected row level with the centred band. The stash pile stays left of the band, inside the workspace's slot. A maximized column shows the columns it hides as dimmed cards behind it, peeking out on their side of the band: the nearest one on each side, then the next ones stacked at the band's edge. Selecting a card (left/right, a three-finger swipe or a click on a visible card) moves the maximization to it; Return keeps it there and Escape gives it back. | |
| 200 | 200 | ||
| 201 | 201 | In the overview, up/down move to the previous or next band and stop at the first and last; with a stash card selected they browse the pile. Left/right move along the band; past its first column they enter the stash, or go to the previous workspace when there is none; past its last column they go to the next workspace (with the overview closed, focus crosses into the next band instead). Covering floats fan left and right of the band: left/right traverse them before entering the stash or changing workspace, and up/down do nothing on a float. `h`/`j`/`k`/`l` and the focus binds follow the arrows; `focus-workspace-prev/next` always change workspace, except over a selected stash card, where they browse the pile. Three-finger swipes follow the fingers: vertical moves one band (or one stash card) and horizontal one workspace per gesture, even over a stash card. Over a maximized column that hides cards, horizontal moves one step per gesture like left/right: the next card, then past the band's edge the stash or a workspace. A vertical wheel or continuous scroll changes workspace, except over a selected stash card, where it browses the pile; a horizontal one moves along the band. | |
| 202 | 202 | ||
| @@ -47,7 +47,7 @@ NeferWL reads `$XDG_CONFIG_HOME/neferwl/config` (or `~/.config/neferwl/config`). | |||||
| 47 | | `animations` | `off` | **Experimental.** `on` animates changes; `off` makes every change instant and the three-finger swipe no longer follows the fingers: swipe landings, scrolling, workspace switches, window moves and resizes, drag drops, workspaces sent to another monitor, the overview, windows opening and closing, the stash showing and hiding, the focus pulse | | 47 | | `animations` | `off` | **Experimental.** `on` animates changes; `off` makes every change instant and the three-finger swipe no longer follows the fingers: swipe landings, scrolling, workspace switches, window moves and resizes, drag drops, workspaces sent to another monitor, the overview, windows opening and closing, the stash showing and hiding, the focus pulse | | ||
| 48 | | `animations.speed` | `normal` | Speed of every spring (not the focus pulse): `slow`, `normal` or `fast` (a view move lands in about 260, 180 or 130 ms), or a number relative to `normal`, from `0.1` (10× slower) to `10` (10× faster) | | 48 | | `animations.speed` | `normal` | Speed of every spring (not the focus pulse): `slow`, `normal` or `fast` (a view move lands in about 260, 180 or 130 ms), or a number relative to `normal`, from `0.1` (10× slower) to `10` (10× faster) | | ||
| 49 | | `focus.follow-move` | `off` | Follow a column moved to another workspace | | 49 | | `focus.follow-move` | `off` | Follow a column moved to another workspace | | ||
| 50 | - | | `focus.animation` | `pulse` | Focus indicator on a window that keeps the focus for 150 ms: `pulse` (brief rise and fall) or `off`. Skipped for fullscreen windows, a window alone on screen (e.g. a maximized column), the overview and a window focused as it opens. Off while `animations = off` | | 50 | + | | `focus.animation` | `pulse` | Focus indicator on a window that keeps the focus for 150 ms: `pulse` (brief rise and fall) or `off`. Skipped for fullscreen windows, a window alone outside panels (e.g. a maximized column), the overview and a window focused as it opens. Off while `animations = off` | |
| 51 | | `focus.effect` | `screen` | What the focus indicator draws: `screen` brightens the window slightly, visible on black too. HDR (PQ) client content is not brightened on HDR outputs | | 51 | | `focus.effect` | `screen` | What the focus indicator draws: `screen` brightens the window slightly, visible on black too. HDR (PQ) client content is not brightened on HDR outputs | | ||
| 52 | | `focus.strength` | `0.04` | Peak of the focus effect, `0.01` to `0.2`: black reaches about 10/255 at `0.04` | | 52 | | `focus.strength` | `0.04` | Peak of the focus effect, `0.01` to `0.2`: black reaches about 10/255 at `0.04` | | ||
| 53 | | `workspace.<name>.*` | none | Named workspaces are outside the numbered list; use the overview to show an occupied one, or a `workspace <name>` bind to show it and toggle back | | 53 | | `workspace.<name>.*` | none | Named workspaces are outside the numbered list; use the overview to show an occupied one, or a `workspace <name>` bind to show it and toggle back | | ||
| @@ -196,7 +196,7 @@ Left/right focus follows column order across band boundaries. Up/down visits sta | |||||
| 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-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. | 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 | - | In the [overview](#overview), the selected band is centred at the usual overview zoom, whatever the band count. The other bands of the workspace sit above and below it, dimmed, and may run off screen. Neighbor workspaces sit left and right, fully dimmed, with their selected row level with the centred band. The stash pile stays left of the band, inside the workspace's slot. A maximized column shows the columns it hides as dimmed cards behind it, peeking out on their side of the band: the nearest one on each side, then the next ones stacked at the band's edge. Selecting a card (left/right, Return or a click on a visible card) moves the maximization to it, and Escape gives it back. | 199 | + | In the [overview](#overview), the selected band is centred at the usual overview zoom, whatever the band count. The other bands of the workspace sit above and below it, dimmed, and may run off screen. Neighbor workspaces sit left and right, fully dimmed, with their selected row level with the centred band. The stash pile stays left of the band, inside the workspace's slot. A maximized column shows the columns it hides as dimmed cards behind it, peeking out on their side of the band: the nearest one on each side, then the next ones stacked at the band's edge. Selecting a card (left/right, a three-finger swipe or a click on a visible card) moves the maximization to it; Return keeps it there and Escape gives it back. |
| 200 | 200 | ||||
| 201 | In the overview, up/down move to the previous or next band and stop at the first and last; with a stash card selected they browse the pile. Left/right move along the band; past its first column they enter the stash, or go to the previous workspace when there is none; past its last column they go to the next workspace (with the overview closed, focus crosses into the next band instead). Covering floats fan left and right of the band: left/right traverse them before entering the stash or changing workspace, and up/down do nothing on a float. `h`/`j`/`k`/`l` and the focus binds follow the arrows; `focus-workspace-prev/next` always change workspace, except over a selected stash card, where they browse the pile. Three-finger swipes follow the fingers: vertical moves one band (or one stash card) and horizontal one workspace per gesture, even over a stash card. Over a maximized column that hides cards, horizontal moves one step per gesture like left/right: the next card, then past the band's edge the stash or a workspace. A vertical wheel or continuous scroll changes workspace, except over a selected stash card, where it browses the pile; a horizontal one moves along the band. | 201 | In the overview, up/down move to the previous or next band and stop at the first and last; with a stash card selected they browse the pile. Left/right move along the band; past its first column they enter the stash, or go to the previous workspace when there is none; past its last column they go to the next workspace (with the overview closed, focus crosses into the next band instead). Covering floats fan left and right of the band: left/right traverse them before entering the stash or changing workspace, and up/down do nothing on a float. `h`/`j`/`k`/`l` and the focus binds follow the arrows; `focus-workspace-prev/next` always change workspace, except over a selected stash card, where they browse the pile. Three-finger swipes follow the fingers: vertical moves one band (or one stash card) and horizontal one workspace per gesture, even over a stash card. Over a maximized column that hides cards, horizontal moves one step per gesture like left/right: the next card, then past the band's edge the stash or a workspace. A vertical wheel or continuous scroll changes workspace, except over a selected stash card, where it browses the pile; a horizontal one moves along the band. | ||
| 202 | 202 | ||||
M internal/core/pulse.go +1 -1
| @@ -15,7 +15,7 @@ import ( | |||
| 15 | 15 | // the window that pulsed last does not pulse again within pulseCooldown | |
| 16 | 16 | // (switching back after another window held the focus is a new change). | |
| 17 | 17 | // Fast switching therefore shows nothing. Fullscreen windows, a window alone | |
| 18 | - | // on screen (e.g. a maximized column), overview previews, a window focused as | |
| 18 | + | // in the usable area (e.g. a maximized column), overview previews, a window focused as | |
| 19 | 19 | // it maps and a protected session never pulse. | |
| 20 | 20 | ||
| 21 | 21 | const ( | |
| @@ -15,7 +15,7 @@ import ( | |||||
| 15 | // the window that pulsed last does not pulse again within pulseCooldown | 15 | // the window that pulsed last does not pulse again within pulseCooldown | ||
| 16 | // (switching back after another window held the focus is a new change). | 16 | // (switching back after another window held the focus is a new change). | ||
| 17 | // Fast switching therefore shows nothing. Fullscreen windows, a window alone | 17 | // Fast switching therefore shows nothing. Fullscreen windows, a window alone | ||
| 18 | - | // on screen (e.g. a maximized column), overview previews, a window focused as | 18 | + | // in the usable area (e.g. a maximized column), overview previews, a window focused as |
| 19 | // it maps and a protected session never pulse. | 19 | // it maps and a protected session never pulse. | ||
| 20 | 20 | ||||
| 21 | const ( | 21 | const ( | ||
M internal/core/separators.go +1 -1
| @@ -10,7 +10,7 @@ import "github.com/bnema/neferwl/internal/ports" | |||
| 10 | 10 | // first). With gaps, each tile owns its neighbor-facing lines and lights | |
| 11 | 11 | // them whole. Hidden, scrolled-off, under-panel, other-workspace and | |
| 12 | 12 | // other-output tiles do not count, nor do tiles that share no line. Lines | |
| 13 | - | // at output edges are omitted. Floating windows differ from tmux tiles: | |
| 13 | + | // at the edges of the usable area (output or panels) are omitted. Floating windows differ from tmux tiles: | |
| 14 | 14 | // each gets its own full border, drawn with that window (Separator.Window), | |
| 15 | 15 | // even when it is the only visible window. Only the | |
| 16 | 16 | // focused output's focused window can light lines; keyboard grabs by popups | |
| @@ -10,7 +10,7 @@ import "github.com/bnema/neferwl/internal/ports" | |||||
| 10 | // first). With gaps, each tile owns its neighbor-facing lines and lights | 10 | // first). With gaps, each tile owns its neighbor-facing lines and lights | ||
| 11 | // them whole. Hidden, scrolled-off, under-panel, other-workspace and | 11 | // them whole. Hidden, scrolled-off, under-panel, other-workspace and | ||
| 12 | // other-output tiles do not count, nor do tiles that share no line. Lines | 12 | // other-output tiles do not count, nor do tiles that share no line. Lines | ||
| 13 | - | // at output edges are omitted. Floating windows differ from tmux tiles: | 13 | + | // at the edges of the usable area (output or panels) are omitted. Floating windows differ from tmux tiles: |
| 14 | // each gets its own full border, drawn with that window (Separator.Window), | 14 | // each gets its own full border, drawn with that window (Separator.Window), | ||
| 15 | // even when it is the only visible window. Only the | 15 | // even when it is the only visible window. Only the | ||
| 16 | // focused output's focused window can light lines; keyboard grabs by popups | 16 | // focused output's focused window can light lines; keyboard grabs by popups | ||
M internal/core/separators_test.go +0 -3
| @@ -173,9 +173,6 @@ func TestSeparatorsCascadeBottomPanel(t *testing.T) { | |||
| 173 | 173 | if got := colorAt(seps, 449, 400); got != "gray" { | |
| 174 | 174 | t.Fatalf("shared line (449,400) = %q; %v", got, seps) | |
| 175 | 175 | } | |
| 176 | - | if n := visibleCount(ps, w.Usable); n != 2 { | |
| 177 | - | t.Fatalf("visible in the usable area: %d, want 2", n) | |
| 178 | - | } | |
| 179 | 176 | } | |
| 180 | 177 | ||
| 181 | 178 | // With gaps each tile has its own line: the focused one lights it whole. | |
| @@ -173,9 +173,6 @@ func TestSeparatorsCascadeBottomPanel(t *testing.T) { | |||||
| 173 | if got := colorAt(seps, 449, 400); got != "gray" { | 173 | if got := colorAt(seps, 449, 400); got != "gray" { | ||
| 174 | t.Fatalf("shared line (449,400) = %q; %v", got, seps) | 174 | t.Fatalf("shared line (449,400) = %q; %v", got, seps) | ||
| 175 | } | 175 | } | ||
| 176 | - | if n := visibleCount(ps, w.Usable); n != 2 { | |||
| 177 | - | t.Fatalf("visible in the usable area: %d, want 2", n) | |||
| 178 | - | } | |||
| 179 | } | 176 | } | ||
| 180 | 177 | ||||
| 181 | // With gaps each tile has its own line: the focused one lights it whole. | 178 | // With gaps each tile has its own line: the focused one lights it whole. | ||