detached 5324ffe

docs(config): show output placement with diagrams and a commented example

commit
5324ffe41b3aada3a9e851ef97a031dc45d2692e
author
brice · · 2026-10-03 14:31 UTC
parent
f23fedf
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
refs
feat/output-placement
1 file · +37 -10
M docs/config.md +37 -10
@@ -57,7 +57,7 @@ NeferWL reads `$XDG_CONFIG_HOME/neferwl/config` (or `~/.config/neferwl/config`).
5757 | `output.<name>.scale` | `1` | 1 to 4, e.g. `1.5` or `4/3` |
5858 | `output.<name>.primary` | `off` | Gets focus and pointer at startup |
5959 | `output.<name>.right-of` / `.left-of` / `.above` / `.below` | automatic | Connector to place the output against, e.g. `DP-1` |
60-| `output.<name>.offset` | `0` | Logical px along the shared edge: down for `right-of`/`left-of`, right for `above`/`below`. Negative allowed, −65536 to 65536. Ignored without a relation, with a warning |
60+| `output.<name>.offset` | `0` | Logical px along the shared edge, −65536 to 65536; see [Output placement](#output-placement) |
6161 | `output.<name>.hdr` | `off` | Turns on HDR10 on capable outputs; otherwise falls back to SDR (reason in the log) |
6262 | `output.<name>.sdr-brightness` | `203` | How bright SDR desktop content appears in HDR, in nits (80–1000) |
6363 | `render.direct-scanout` | `on` | Fullscreen buffers straight to the display |
@@ -69,30 +69,57 @@ NeferWL reads `$XDG_CONFIG_HOME/neferwl/config` (or `~/.config/neferwl/config`).
6969
7070 ## Output placement
7171
72-An output with no relation is placed automatically, left to right after the others, at y=0. An output whose reference is not connected is placed automatically too, and returns to its relation when the reference connects. Relation cycles are ignored with a warning. Positions set by an output-management client (kanshi, wdisplays, wlr-randr) take precedence over relations until the next config reload. The pointer crosses any touching edge. Monitor navigation and column edge crossings follow output geometry; stacked outputs are reached with focus-monitor-up/down.
72+Without relations, outputs sit left to right in config order, top-aligned. A relation places an output against another one; `offset` slides it along the shared edge so the pointer crosses where the screens really meet.
73+
74+```ini
75+output.DP-2.right-of = DP-1
76+output.DP-2.offset = 360 # DP-2 starts 360 px lower than DP-1's top
77+```
78+
79+```
80+┌────────────┐
81+│ │┌─────────┐
82+│ DP-1 ││ DP-2 │
83+│ 2560x1440 ││1920x1080│
84+│ │└─────────┘
85+└────────────┘
86+```
87+
88+Rules:
89+
90+- `offset` moves down for `right-of`/`left-of` and right for `above`/`below`; negative moves the other way.
91+- Sizes are logical: the layout follows scale changes on its own.
92+- An output whose reference is not connected is placed automatically until the reference returns.
93+- Cycles and invalid values are ignored with a warning in the log.
94+- Positions set by kanshi, wdisplays or wlr-randr win until the next config reload.
95+- `focus-monitor-*`, `move-workspace-to-monitor-*` and column moves past the edge go to the output on that side.
7396
7497 Two rows of three, with DP-1 as the base:
7598
7699 ```
77-output.DP-1 = 2560x1440
78-output.DP-2 = 1920x1080
100+┌────────┐┌────────────┐┌────────┐
101+│ DP-4 ││ HDMI-1 ││ DP-5 │
102+└────────┘└────────────┘└────────┘
103+┌────────┐┌────────────┐┌────────┐
104+│ DP-2 ││ DP-1 ││ DP-3 │
105+└────────┘└────────────┘└────────┘
106+```
107+
108+```ini
109+# Bottom row: 1080p sides, bottoms aligned with DP-1 (1440 - 1080 = 360)
79110 output.DP-2.left-of = DP-1
80111 output.DP-2.offset = 360
81-output.DP-3 = 1920x1080
82112 output.DP-3.right-of = DP-1
83113 output.DP-3.offset = 360
84-output.HDMI-1 = 2560x1440
114+
115+# Top row: 1200p sides, bottoms aligned with HDMI-1 (1440 - 1200 = 240)
85116 output.HDMI-1.above = DP-1
86-output.DP-4 = 1920x1200
87117 output.DP-4.left-of = HDMI-1
88118 output.DP-4.offset = 240
89-output.DP-5 = 1920x1200
90119 output.DP-5.right-of = HDMI-1
91120 output.DP-5.offset = 240
92121 ```
93122
94-The bottom row is DP-2 | DP-1 | DP-3 and the top row DP-4 | HDMI-1 | DP-5.
95-
96123 ## Workspace size
97124
98125 A workspace inherits its monitor size unless `workspace.<name>.size` sets a logical `WxH`. Its viewport is centered, and columns, maximization, floating windows and fullscreen use that real layout size—not scaled overview previews. Oversized dimensions are limited to the monitor; reserved layer zones still reduce usable space. Monitor mode and scale stay unchanged. Omit `size` or use `inherit` to restore the default. Workspace transitions involving a smaller viewport switch without the vertical slide, keeping scrolling columns inside their frame. Fullscreen inside a smaller viewport uses composition rather than output-covering direct scanout, so fullscreen-game VRR/tearing eligibility does not apply.
@@ -57,7 +57,7 @@ NeferWL reads `$XDG_CONFIG_HOME/neferwl/config` (or `~/.config/neferwl/config`).
57 | `output.<name>.scale` | `1` | 1 to 4, e.g. `1.5` or `4/3` |57 | `output.<name>.scale` | `1` | 1 to 4, e.g. `1.5` or `4/3` |
58 | `output.<name>.primary` | `off` | Gets focus and pointer at startup |58 | `output.<name>.primary` | `off` | Gets focus and pointer at startup |
59 | `output.<name>.right-of` / `.left-of` / `.above` / `.below` | automatic | Connector to place the output against, e.g. `DP-1` |59 | `output.<name>.right-of` / `.left-of` / `.above` / `.below` | automatic | Connector to place the output against, e.g. `DP-1` |
60-| `output.<name>.offset` | `0` | Logical px along the shared edge: down for `right-of`/`left-of`, right for `above`/`below`. Negative allowed, −65536 to 65536. Ignored without a relation, with a warning |60+| `output.<name>.offset` | `0` | Logical px along the shared edge, −65536 to 65536; see [Output placement](#output-placement) |
61 | `output.<name>.hdr` | `off` | Turns on HDR10 on capable outputs; otherwise falls back to SDR (reason in the log) |61 | `output.<name>.hdr` | `off` | Turns on HDR10 on capable outputs; otherwise falls back to SDR (reason in the log) |
62 | `output.<name>.sdr-brightness` | `203` | How bright SDR desktop content appears in HDR, in nits (80–1000) |62 | `output.<name>.sdr-brightness` | `203` | How bright SDR desktop content appears in HDR, in nits (80–1000) |
63 | `render.direct-scanout` | `on` | Fullscreen buffers straight to the display |63 | `render.direct-scanout` | `on` | Fullscreen buffers straight to the display |
@@ -69,30 +69,57 @@ NeferWL reads `$XDG_CONFIG_HOME/neferwl/config` (or `~/.config/neferwl/config`).
69 69
70 ## Output placement70 ## Output placement
71 71
72-An output with no relation is placed automatically, left to right after the others, at y=0. An output whose reference is not connected is placed automatically too, and returns to its relation when the reference connects. Relation cycles are ignored with a warning. Positions set by an output-management client (kanshi, wdisplays, wlr-randr) take precedence over relations until the next config reload. The pointer crosses any touching edge. Monitor navigation and column edge crossings follow output geometry; stacked outputs are reached with focus-monitor-up/down.72+Without relations, outputs sit left to right in config order, top-aligned. A relation places an output against another one; `offset` slides it along the shared edge so the pointer crosses where the screens really meet.
73+
74+```ini
75+output.DP-2.right-of = DP-1
76+output.DP-2.offset = 360 # DP-2 starts 360 px lower than DP-1's top
77+```
78+
79+```
80+┌────────────┐
81+│ │┌─────────┐
82+│ DP-1 ││ DP-2 │
83+│ 2560x1440 ││1920x1080│
84+│ │└─────────┘
85+└────────────┘
86+```
87+
88+Rules:
89+
90+- `offset` moves down for `right-of`/`left-of` and right for `above`/`below`; negative moves the other way.
91+- Sizes are logical: the layout follows scale changes on its own.
92+- An output whose reference is not connected is placed automatically until the reference returns.
93+- Cycles and invalid values are ignored with a warning in the log.
94+- Positions set by kanshi, wdisplays or wlr-randr win until the next config reload.
95+- `focus-monitor-*`, `move-workspace-to-monitor-*` and column moves past the edge go to the output on that side.
73 96
74 Two rows of three, with DP-1 as the base:97 Two rows of three, with DP-1 as the base:
75 98
76 ```99 ```
77-output.DP-1 = 2560x1440100+┌────────┐┌────────────┐┌────────┐
78-output.DP-2 = 1920x1080101+│ DP-4 ││ HDMI-1 ││ DP-5 │
102+└────────┘└────────────┘└────────┘
103+┌────────┐┌────────────┐┌────────┐
104+│ DP-2 ││ DP-1 ││ DP-3 │
105+└────────┘└────────────┘└────────┘
106+```
107+
108+```ini
109+# Bottom row: 1080p sides, bottoms aligned with DP-1 (1440 - 1080 = 360)
79 output.DP-2.left-of = DP-1110 output.DP-2.left-of = DP-1
80 output.DP-2.offset = 360111 output.DP-2.offset = 360
81-output.DP-3 = 1920x1080
82 output.DP-3.right-of = DP-1112 output.DP-3.right-of = DP-1
83 output.DP-3.offset = 360113 output.DP-3.offset = 360
84-output.HDMI-1 = 2560x1440114+
115+# Top row: 1200p sides, bottoms aligned with HDMI-1 (1440 - 1200 = 240)
85 output.HDMI-1.above = DP-1116 output.HDMI-1.above = DP-1
86-output.DP-4 = 1920x1200
87 output.DP-4.left-of = HDMI-1117 output.DP-4.left-of = HDMI-1
88 output.DP-4.offset = 240118 output.DP-4.offset = 240
89-output.DP-5 = 1920x1200
90 output.DP-5.right-of = HDMI-1119 output.DP-5.right-of = HDMI-1
91 output.DP-5.offset = 240120 output.DP-5.offset = 240
92 ```121 ```
93 122
94-The bottom row is DP-2 | DP-1 | DP-3 and the top row DP-4 | HDMI-1 | DP-5.
95-
96 ## Workspace size123 ## Workspace size
97 124
98 A workspace inherits its monitor size unless `workspace.<name>.size` sets a logical `WxH`. Its viewport is centered, and columns, maximization, floating windows and fullscreen use that real layout size—not scaled overview previews. Oversized dimensions are limited to the monitor; reserved layer zones still reduce usable space. Monitor mode and scale stay unchanged. Omit `size` or use `inherit` to restore the default. Workspace transitions involving a smaller viewport switch without the vertical slide, keeping scrolling columns inside their frame. Fullscreen inside a smaller viewport uses composition rather than output-covering direct scanout, so fullscreen-game VRR/tearing eligibility does not apply.125 A workspace inherits its monitor size unless `workspace.<name>.size` sets a logical `WxH`. Its viewport is centered, and columns, maximization, floating windows and fullscreen use that real layout size—not scaled overview previews. Oversized dimensions are limited to the monitor; reserved layer zones still reduce usable space. Monitor mode and scale stay unchanged. Omit `size` or use `inherit` to restore the default. Workspace transitions involving a smaller viewport switch without the vertical slide, keeping scrolling columns inside their frame. Fullscreen inside a smaller viewport uses composition rather than output-covering direct scanout, so fullscreen-game VRR/tearing eligibility does not apply.

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