Frank's call: no per-host graveyard. The four /system/dankware/ pages carried two pieces of knowledge that outlive the box, and one that does not. Distilled: - omp-docs/system/network.md (new) — LAN topology plus the multi-link resolver law: a client with two +DefaultRoute links flaps its DNS, and the fix is a static per-connection resolver, not resolved.conf. Keeps the flush-caches-loop verification, because one successful dig proves nothing. - omp-docs/tools/niri/displays.md (new) — the multi-monitor rig: portrait transforms, absolute positions, auto-placed third panel, the iGPU render-node pin, and the three failure modes (duplicate output blocks, positions that do not reflow, a mode the panel cannot drive). Dropped: the machine's own spec sheet (CPU/GPU/PCI/NVMe inventory for a box Frank sold) and its quick-facts table. The OS and userspace facts it repeated already live in tools/cachyos.md. omp-docs/system/dankware/ moved to .AGENTTRASH/20260928-retired-workstation/ (not deleted; git history holds it too). system/index.md and the niri index repoint; niri's [[displays]] wikilink now resolves to the new page instead of the trashed one. kb-lint: 0 violations.
127 lines
4.2 KiB
Markdown
127 lines
4.2 KiB
Markdown
---
|
|
type: reference
|
|
title: Display Configuration
|
|
description: Niri output configuration for a multi-monitor desk rig — portrait transforms, position pinning, scale, and iGPU display ownership.
|
|
tags:
|
|
- niri
|
|
- display
|
|
- monitors
|
|
- rotation
|
|
verified: 2026-08-28
|
|
---
|
|
|
|
# Display Configuration
|
|
|
|
How a multi-monitor desk rig is configured in niri: portrait external panels
|
|
flanking a laptop panel, positions pinned by hand, and the integrated GPU kept
|
|
as the display owner.
|
|
|
|
**Config:** `~/.config/niri/cfg/display.kdl`
|
|
**Probe:** `wlr-randr` (installed by CachyOS) reports what the compositor
|
|
actually committed — connectors, preferred modes, transforms, scale, positions.
|
|
|
|
---
|
|
|
|
## The rig
|
|
|
|
Three outputs in a row: two external monitors rotated to portrait, one
|
|
internal laptop panel in landscape at the right.
|
|
|
|
```
|
|
┌──────────────┬──────────────┬──────────────┐
|
|
│ │ │ │
|
|
│ DP-1 │ DP-3 │ eDP-1 │
|
|
│ external │ external │ internal │
|
|
│ 1920x1200 │ 1920x1200 │ 2560x1600 │
|
|
│ Portrait │ Portrait │ Landscape │
|
|
│ 90° rotate │ 270° rotate │ 1.5x scale │
|
|
│ │ │ │
|
|
└──────────────┴──────────────┴──────────────┘
|
|
x=0,0 x=1200,0 auto-placed
|
|
```
|
|
|
|
| Output | Role | Transform | Position | Scale |
|
|
|--------|------|-----------|----------|-------|
|
|
| `DP-1` | External, left | `90` (portrait) | `x=0 y=0` | 1.0 |
|
|
| `DP-3` | External, center | `270` (portrait) | `x=1200 y=0` | 1.0 |
|
|
| `eDP-1` | Internal panel | none (landscape) | auto-placed | 1.5 |
|
|
|
|
The two portrait panels are 1200 px wide after rotation, which is why the
|
|
second one starts at `x=1200`. The internal panel declares no position at
|
|
all — niri auto-places it to the right of the explicitly positioned outputs.
|
|
That is the only reliable way to keep a third panel from landing on top of
|
|
the rig when a cable is re-seated.
|
|
|
|
---
|
|
|
|
## The config pattern
|
|
|
|
```kdl
|
|
output "DP-1" {
|
|
transform "90"
|
|
position x=0 y=0
|
|
}
|
|
|
|
output "DP-3" {
|
|
transform "270"
|
|
position x=1200 y=0
|
|
}
|
|
|
|
output "eDP-1" {
|
|
// no position — auto-placed to the right of the DP-* outputs
|
|
scale 1.5
|
|
}
|
|
```
|
|
|
|
Three rules learned the hard way:
|
|
|
|
1. **One output, one block.** A second block keyed by the make/model string
|
|
(`output "Samsung Electric Company …"`) that also sets `transform` fights
|
|
the connector-keyed block. Use the make/model form only to pin a `mode`
|
|
for an output whose connector name is unstable across boots, and never
|
|
set a transform in both places.
|
|
2. **Positions are absolute, not relational.** Niri does not reflow the rig
|
|
when one panel is disconnected — a missing output leaves a hole at its
|
|
coordinates. Verify with `wlr-randr` after any cable or dock change.
|
|
3. **Re-assert rotation after a config reload, then confirm.** A transform
|
|
silently reverting to landscape is the usual symptom of a duplicate
|
|
output block, not of a failed reload.
|
|
|
|
Modes must match what the panel reports. Check `wlr-randr` for the preferred
|
|
mode before writing a `mode` line; a `mode` the panel cannot drive leaves the
|
|
output dark or drops it.
|
|
|
|
---
|
|
|
|
## GPU assignment
|
|
|
|
The integrated GPU drives all display output; the discrete GPU is available
|
|
for compute but must not take the outputs. Pin the render node explicitly in
|
|
`~/.config/niri/cfg/misc.kdl`:
|
|
|
|
```kdl
|
|
environment {
|
|
render-node "/dev/dri/renderD129"
|
|
}
|
|
```
|
|
|
|
Without the pin, the session's render node follows probe order and can land
|
|
on the discrete GPU — which costs display-linked copies and, on hybrid
|
|
graphics laptops, is a common trigger of the suspend/resume deadlock covered
|
|
in the sleep-wake investigation report.
|
|
|
|
---
|
|
|
|
## Reload
|
|
|
|
`niri msg action load-config-file` reloads live. Never `SIGHUP` the process
|
|
— see [[tips]].
|
|
|
|
---
|
|
|
|
## See Also
|
|
|
|
- [Niri](/tools/niri/index.md) — compositor overview and config layout
|
|
- [[tips|tips]] — reload path and other gotchas
|
|
- [[cachyos|cachyos]] — operating system, including `wlr-randr`
|