fix(niri): ultrawide pinned to a 240 Hz mode the EDID never offered -> silent 60 Hz fallback #59
No files matched your search
@@ -7,8 +7,12 @@
|
|||||||
// requires: Lenovo Group Limited 0x40A9 Unknown
|
// requires: Lenovo Group Limited 0x40A9 Unknown
|
||||||
// optional: HDMI-A-1 (PM1601, dock-dependent)
|
// optional: HDMI-A-1 (PM1601, dock-dependent)
|
||||||
|
|
||||||
|
// This panel's EDID tops out at 3440x1440@180 (read live from niri: no 240 Hz mode
|
||||||
|
// exists). Ask for a mode the panel does not offer and niri does not fail — it logs
|
||||||
|
// "could not be found, falling back to preferred" and drops to 60 Hz on every
|
||||||
|
// reconnect. Keep 180 here unless a re-read EDID says otherwise.
|
||||||
output "Sceptre Tech Inc Sceptre M34 Unknown" {
|
output "Sceptre Tech Inc Sceptre M34 Unknown" {
|
||||||
mode "3440x1440@239.999"
|
mode "3440x1440@180.000"
|
||||||
scale 1
|
scale 1
|
||||||
transform "normal"
|
transform "normal"
|
||||||
position x=1581 y=-600
|
position x=1581 y=-600
|
||||||
@@ -47,7 +51,7 @@ output "eDP-1" {
|
|||||||
position x=-339 y=-240
|
position x=-339 y=-240
|
||||||
}
|
}
|
||||||
output "DP-1" {
|
output "DP-1" {
|
||||||
mode "3440x1440@120.000"
|
mode "3440x1440@180.000"
|
||||||
|
|
||||||
scale 1.0
|
scale 1.0
|
||||||
|
|
||||||
|
|||||||
+28
-1
@@ -6,7 +6,7 @@ tags:
|
|||||||
- okf
|
- okf
|
||||||
- maintenance
|
- maintenance
|
||||||
- changelog
|
- changelog
|
||||||
timestamp: 2026-10-19
|
timestamp: 2026-10-21
|
||||||
---
|
---
|
||||||
|
|
||||||
# Bundle Change Log
|
# Bundle Change Log
|
||||||
@@ -20,6 +20,33 @@ This page is the bundle's **only** work log: one file, at the root. Never start
|
|||||||
second one in a subdirectory or under another name — `scripts/kb-lint.sh` reports any
|
second one in a subdirectory or under another name — `scripts/kb-lint.sh` reports any
|
||||||
`log.md` that is not this one.
|
`log.md` that is not this one.
|
||||||
|
|
||||||
|
## 2026-10-21 — a documented mode the panel never had
|
||||||
|
|
||||||
|
The home ultrawide had been running at 60 Hz for weeks while `desk-1-home.kdl`
|
||||||
|
asked for `3440x1440@239.999`. The page that owns that file documented the same
|
||||||
|
phantom mode, so every reader — including tonight's inspection — trusted it.
|
||||||
|
`niri msg outputs` says the Sceptre M34's EDID tops out at 180 Hz; there is no
|
||||||
|
240 Hz mode to ask for.
|
||||||
|
|
||||||
|
Laws, now on [tools/niri/displays](tools/niri/displays.md):
|
||||||
|
|
||||||
|
- **An impossible mode does not fail, it falls back.** niri logs
|
||||||
|
`configured mode … could not be found, falling back to preferred` and drives
|
||||||
|
the EDID preferred mode — 60 Hz here. A config typo therefore looks like a
|
||||||
|
dying monitor, and every connector drop re-enacts it.
|
||||||
|
- **Three layers, three signatures:** config fallback, DP link drops, and
|
||||||
|
amdgpu `DMCUB` errors with `EINVAL` page flips after s2idle. Only the first
|
||||||
|
yields to a file edit; only the last yields to a reboot. Triage table and
|
||||||
|
probes are on the page.
|
||||||
|
- **A number in a page is a claim, not a measurement.** Modes, refresh rates and
|
||||||
|
tool availability were wrong on four pages at once — `wlr-randr` was listed as
|
||||||
|
installed while `pacman -Qs wlr` matches nothing. Read the hardware before
|
||||||
|
writing a mode into a runbook, and destroy the stale copies.
|
||||||
|
|
||||||
|
Fix: `desk-1-home.kdl` 239.999 → 180.000 on the identity block and both legacy
|
||||||
|
connector blocks, applied live with `niri msg output <panel> mode <mode>` — the
|
||||||
|
temporary per-output path, so no config reload and no logged-out session.
|
||||||
|
|
||||||
## 2026-10-20 — one work log per bundle
|
## 2026-10-20 — one work log per bundle
|
||||||
|
|
||||||
The bundle had two: this page and `core/log.md`, created "for tracking core
|
The bundle had two: this page and `core/log.md`, created "for tracking core
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ Applications that ship with or are configured on CachyOS with Niri on the workst
|
|||||||
| **Noctalia Shell** | 4.7.7 | Desktop shell (launcher, wallpaper, session menu) |
|
| **Noctalia Shell** | 4.7.7 | Desktop shell (launcher, wallpaper, session menu) |
|
||||||
| **Shelly Notifications** | — | Notification daemon |
|
| **Shelly Notifications** | — | Notification daemon |
|
||||||
| **pavucontrol** | — | Audio mixer |
|
| **pavucontrol** | — | Audio mixer |
|
||||||
| **wlr-randr** | — | Display management |
|
|
||||||
|
|
||||||
## Screenshot and Recording
|
## Screenshot and Recording
|
||||||
|
|
||||||
|
|||||||
@@ -95,7 +95,6 @@ CachyOS with Niri ships with a curated set of applications:
|
|||||||
- **wf-recorder** — Screen recording
|
- **wf-recorder** — Screen recording
|
||||||
- **hyprpicker** — Color picker
|
- **hyprpicker** — Color picker
|
||||||
- **wl-clipboard** — Clipboard management
|
- **wl-clipboard** — Clipboard management
|
||||||
- **wlr-randr** — Display management
|
|
||||||
- **NetworkManager** — Network management
|
- **NetworkManager** — Network management
|
||||||
- **BlueZ** — Bluetooth
|
- **BlueZ** — Bluetooth
|
||||||
- **pavucontrol** — Audio mixer
|
- **pavucontrol** — Audio mixer
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
---
|
---
|
||||||
type: reference
|
type: reference
|
||||||
title: Display Configuration
|
title: Display Configuration
|
||||||
description: Niri output configuration on blankpad — EDID-identity-keyed desk profiles, hotplug auto-switching, portrait transforms, position pinning, and GPU notes (AMD Cezanne now; Intel Arc render-node pin is dankware-legacy).
|
description: Niri output configuration on blankpad — EDID-identity-keyed desk profiles, hotplug auto-switching, portrait transforms, position pinning, the phantom-mode fallback trap, and GPU notes (AMD Cezanne now; Intel Arc render-node pin is dankware-legacy).
|
||||||
tags:
|
tags:
|
||||||
- niri
|
- niri
|
||||||
- display
|
- display
|
||||||
- monitors
|
- monitors
|
||||||
- rotation
|
- rotation
|
||||||
- desk-profiles
|
- desk-profiles
|
||||||
verified: 2026-10-09
|
verified: 2026-10-21
|
||||||
---
|
---
|
||||||
|
|
||||||
# Display Configuration
|
# Display Configuration
|
||||||
@@ -24,7 +24,11 @@ active profile (`desk-1-home.kdl`, `desk-2-portable.kdl`, …).
|
|||||||
`config.kdl` includes it with `include optional=true` so a missing link is a
|
`config.kdl` includes it with `include optional=true` so a missing link is a
|
||||||
warning, not a parse failure.
|
warning, not a parse failure.
|
||||||
**Probe:** `niri msg outputs` is authoritative (connector, full EDID long
|
**Probe:** `niri msg outputs` is authoritative (connector, full EDID long
|
||||||
name, modes, transform, scale, position, VRR). `wlr-randr` remains available.
|
name, modes, transform, scale, position, VRR). Per-output changes go live with
|
||||||
|
`niri msg output <name> <mode|scale|transform|position|off|on>` and are
|
||||||
|
temporary — never written to the config file. `wlr-randr` is **not installed**
|
||||||
|
on blankpad (`pacman -Qs wlr` matches nothing, verified 2026-10-21); pages that
|
||||||
|
list it as an installed tool are stale.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -33,7 +37,7 @@ name, modes, transform, scale, position, VRR). `wlr-randr` remains available.
|
|||||||
```
|
```
|
||||||
┌──────────────┬──────────────────────────────┬──────────┐
|
┌──────────────┬──────────────────────────────┬──────────┐
|
||||||
│ PM1601 │ Sceptre M34 ultrawide │ eDP-1 │
|
│ PM1601 │ Sceptre M34 ultrawide │ eDP-1 │
|
||||||
│ portrait │ 3440x1440 @ 239.999 │ 1920x1080│
|
│ portrait │ 3440x1440 @ 180.000 │ 1920x1080│
|
||||||
│ 1200x1920 │ landscape, scale 1 │ scale 1 │
|
│ 1200x1920 │ landscape, scale 1 │ scale 1 │
|
||||||
│ rot 90 │ position 1581,-600 │ 5021,-240│
|
│ rot 90 │ position 1581,-600 │ 5021,-240│
|
||||||
└──────────────┴──────────────────────────────┴──────────┘
|
└──────────────┴──────────────────────────────┴──────────┘
|
||||||
@@ -42,7 +46,7 @@ name, modes, transform, scale, position, VRR). `wlr-randr` remains available.
|
|||||||
|
|
||||||
| Panel | EDID long name | Keyed by | Notes |
|
| Panel | EDID long name | Keyed by | Notes |
|
||||||
|-------|----------------|----------|-------|
|
|-------|----------------|----------|-------|
|
||||||
| Sceptre M34 ultrawide | `Sceptre Tech Inc Sceptre M34 Unknown` | identity | `mode "3440x1440@239.999"`, `focus-at-startup` |
|
| Sceptre M34 ultrawide | `Sceptre Tech Inc Sceptre M34 Unknown` | identity | `mode "3440x1440@180.000"` — the EDID maximum; no 240 Hz mode exists — `focus-at-startup` |
|
||||||
| PM1601 portrait | *not captured* | connector `HDMI-A-1` | dock-dependent; run `desk.sh capture` when plugged in, then re-key |
|
| PM1601 portrait | *not captured* | connector `HDMI-A-1` | dock-dependent; run `desk.sh capture` when plugged in, then re-key |
|
||||||
| eDP-1 laptop panel | `Lenovo Group Limited 0x40A9 Unknown` | identity | scale **1.0** (deliberate; Ghostty grid at 1.25 rejected 2026-10-09), second `focus-at-startup` |
|
| eDP-1 laptop panel | `Lenovo Group Limited 0x40A9 Unknown` | identity | scale **1.0** (deliberate; Ghostty grid at 1.25 rejected 2026-10-09), second `focus-at-startup` |
|
||||||
|
|
||||||
@@ -84,7 +88,7 @@ graph LR
|
|||||||
```kdl
|
```kdl
|
||||||
// desk-1-home.kdl — one block per panel, keyed by identity
|
// desk-1-home.kdl — one block per panel, keyed by identity
|
||||||
output "Sceptre Tech Inc Sceptre M34 Unknown" {
|
output "Sceptre Tech Inc Sceptre M34 Unknown" {
|
||||||
mode "3440x1440@239.999"
|
mode "3440x1440@180.000"
|
||||||
scale 1
|
scale 1
|
||||||
transform "normal"
|
transform "normal"
|
||||||
position x=1581 y=-600
|
position x=1581 y=-600
|
||||||
@@ -98,6 +102,10 @@ Four rules learned the hard way:
|
|||||||
name *and* long name) fight over properties — transform reverts are the
|
name *and* long name) fight over properties — transform reverts are the
|
||||||
classic symptom. Desk profiles are self-contained: a panel's identity,
|
classic symptom. Desk profiles are self-contained: a panel's identity,
|
||||||
mode, transform, **and** position live in exactly one block per file.
|
mode, transform, **and** position live in exactly one block per file.
|
||||||
|
`desk-1-home.kdl` still carries legacy connector-keyed `DP-1` / `DP-2`
|
||||||
|
blocks next to the identity block. Their modes were aligned to 180 Hz on
|
||||||
|
2026-10-21 so a connector-named reconnect cannot drop the panel to 120, but
|
||||||
|
they belong folded into the identity block.
|
||||||
2. **Key by EDID identity, not connector.** Connector names swap between
|
2. **Key by EDID identity, not connector.** Connector names swap between
|
||||||
docks; the EDID long name travels with the panel. Serials on these panels
|
docks; the EDID long name travels with the panel. Serials on these panels
|
||||||
read `Unknown`, so the full long name (manufacturer model serial) is the
|
read `Unknown`, so the full long name (manufacturer model serial) is the
|
||||||
@@ -105,8 +113,47 @@ Four rules learned the hard way:
|
|||||||
3. **Positions are absolute, not relational.** A disconnected panel leaves
|
3. **Positions are absolute, not relational.** A disconnected panel leaves
|
||||||
a hole; that is exactly why positions belong to the *desk profile*, not a
|
a hole; that is exactly why positions belong to the *desk profile*, not a
|
||||||
global file.
|
global file.
|
||||||
4. **Modes must match what the panel reports** (`niri msg outputs` →
|
4. **Ask only for modes the panel reports** (`niri msg outputs` → `Mode:` list).
|
||||||
`Mode: current …`). A mode the panel cannot drive leaves the output dark.
|
A mode the panel never offered does **not** leave the output dark: niri logs
|
||||||
|
`configured mode … could not be found, falling back to preferred` and quietly
|
||||||
|
drives the panel at its EDID *preferred* mode — **60 Hz** on the M34. Nothing
|
||||||
|
looks broken except the refresh rate, and every reconnect repeats the
|
||||||
|
fallback. Check Hz, not just resolution, after any "monitor is acting up".
|
||||||
|
|
||||||
|
## "The monitors are broken" — three layers, three signatures
|
||||||
|
|
||||||
|
A display complaint belongs to one of three layers. Sort it before editing
|
||||||
|
config, because the config is usually innocent — and when it is guilty, the
|
||||||
|
guilt may have been copied from this page.
|
||||||
|
|
||||||
|
| Layer | Log signature | Reality | Move |
|
||||||
|
|-------|---------------|---------|------|
|
||||||
|
| Config | `configured mode … could not be found, falling back to preferred` | a mode/scale the panel never offered | re-read the mode list with `niri msg outputs` and correct the file; do **not** trust a documented mode |
|
||||||
|
| Link | `disconnecting connector: "DP-1"` followed seconds later by `new connector: DP-1`, recurring | the DP link itself dropping — cable, dock, the monitor's DP-version/DSC setting, or panel power saving | every drop re-runs mode selection, so a config error is re-enacted in public; swap the cable before blaming the compositor |
|
||||||
|
| Driver | `Page flip commit failed … (Invalid argument)` plus kernel `*ERROR* … DMCUB error` | amdgpu's display engine wedged, typically after an s2idle resume | survives until a reboot; niri keeps running while the panel keeps dropping. No config edit clears it |
|
||||||
|
|
||||||
|
Probes, in this order:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
niri msg outputs # connector, EDID long name, real mode list, current mode
|
||||||
|
journalctl --user -b | grep -E 'disconnecting connector|Page flip commit failed|falling back to preferred'
|
||||||
|
journalctl -k -b | grep -iE 'amdgpu.*(ERROR|DMCUB)|PM: suspend exit'
|
||||||
|
```
|
||||||
|
|
||||||
|
Correlate the drop timestamps against `PM: suspend exit` first. A resume a
|
||||||
|
minute before the first drop is the cause; the config file is not.
|
||||||
|
|
||||||
|
To fix a refresh rate without disturbing the session, use the temporary
|
||||||
|
per-output path — it touches one output, applies no config, reloads nothing:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
niri msg output "Sceptre Tech Inc Sceptre M34 Unknown" mode "3440x1440@180.000"
|
||||||
|
```
|
||||||
|
|
||||||
|
It is temporary by design, so correct the profile too and let the next
|
||||||
|
reconnect or `load-config-file` make it permanent. With the display engine
|
||||||
|
already throwing `EINVAL`, prefer the per-output path over a full config
|
||||||
|
reload; on a healthy machine either is fine.
|
||||||
|
|
||||||
## GPU assignment
|
## GPU assignment
|
||||||
|
|
||||||
@@ -132,4 +179,4 @@ symlink matrix]]).
|
|||||||
- [Niri](/tools/niri/index.md) — compositor overview and config layout
|
- [Niri](/tools/niri/index.md) — compositor overview and config layout
|
||||||
- [[tips|tips]] — reload path, `niri msg layers/casts`, includes
|
- [[tips|tips]] — reload path, `niri msg layers/casts`, includes
|
||||||
- [[noctalia-shell|noctalia-shell]] — notification shown on desk switch
|
- [[noctalia-shell|noctalia-shell]] — notification shown on desk switch
|
||||||
- [[cachyos|cachyos]] — operating system, including `wlr-randr`
|
- [[cachyos|cachyos]] — operating system
|
||||||
Reference in new issue
Block a user