|
|
|
@@ -8,7 +8,7 @@ tags:
|
|
|
|
|
- monitors
|
|
|
|
|
- rotation
|
|
|
|
|
- desk-profiles
|
|
|
|
|
verified: 2026-10-21
|
|
|
|
|
verified: 2026-10-30
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
# Display Configuration
|
|
|
|
@@ -49,7 +49,7 @@ the dock and the cable, which is why the config keys on the EDID long name inste
|
|
|
|
|
| Panel | EDID long name | Keyed by | Notes |
|
|
|
|
|
|-------|----------------|----------|-------|
|
|
|
|
|
| Sceptre M34 ultrawide | `Sceptre Tech Inc Sceptre M34 Unknown` | identity | `mode "3440x1440@180.000"`, **deliberate** — the panel also offers `3440x1440@239.998`, `144.001` and `120.000`; 180 is driven while the link is degraded (see the law below) — `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 | captured 2026-10-30 — the two panels are `PNP(XYM) PM1601 0000000000000` and `PNP(XYM) PM1601 demoset-1` | connector `HDMI-A-1` in *this* profile; identity on the portable desk | dock-dependent; the identity key is known now, so re-key the block when the panel next rotates through a dock |
|
|
|
|
|
| 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` |
|
|
|
|
|
|
|
|
|
|
VRR: the M34 supports it (its connector today is `DP-1`); **left disabled by
|
|
|
|
@@ -58,6 +58,48 @@ decision** (2026-10-09). Add `variable-refresh-rate` per output if that ever cha
|
|
|
|
|
`focus-at-startup` on both M34 and eDP-1: niri focuses in config order, so
|
|
|
|
|
the ultrawide wins when present and the laptop panel is the fallback.
|
|
|
|
|
|
|
|
|
|
## The desk-2 rig (portable)
|
|
|
|
|
|
|
|
|
|
Laptop flanked by the two 16" PM1601 panels, all three landscape. Profile:
|
|
|
|
|
`cfg/desk-2-portable.kdl` (`display.kdl` symlinks to it).
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌──────────┬──────────────┬──────────┐
|
|
|
|
|
│ PM1601 │ │ PM1601 │ HDMI-A-1 1920x1200 normal x=0,y=0
|
|
|
|
|
│ 1920x1200│ eDP-1 │ 1920x1200│ eDP-1 1920x1080 normal x=1920,y=60
|
|
|
|
|
│(HDMI-A-1)│ 1920x1080 │ (DP-2) │ DP-2 1920x1200 normal x=3840,y=0
|
|
|
|
|
│ │ │ │
|
|
|
|
|
└──────────┴──────────────┴──────────┘ The laptop is 60 px down so it is
|
|
|
|
|
x=0,y=0 x=1920,y=60 x=3840,y=0 centred against the taller panels.
|
|
|
|
|
|
|
|
|
|
HDMI-A-1 sits to the LEFT of the laptop by request (2026-10-30); DP-2 keeps the
|
|
|
|
|
right. Earlier the same rig ran both panels in portrait (rot 90, 1200x1920) with
|
|
|
|
|
the laptop and both panels to its right — the rotation is `normal` now, so the
|
|
|
|
|
panels are 1920 wide and every x moved.
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Positions are absolute in logical space, so rotating a panel changes its logical
|
|
|
|
|
width (1200 → 1920) and every x to its right; recompute the whole row, never just
|
|
|
|
|
the rotated block.
|
|
|
|
|
|
|
|
|
|
All three blocks are identity-keyed and pin their mode string verbatim. The
|
|
|
|
|
`requires:` list names all three panels, so the matcher only claims this profile
|
|
|
|
|
when the whole rig is present — unplug one 16" panel and the watcher leaves the
|
|
|
|
|
current layout alone rather than shuffling the survivors.
|
|
|
|
|
|
|
|
|
|
**The stale-profile trap this fixed (2026-10-30).** Before this profile existed,
|
|
|
|
|
the portable rig ran with `display.kdl` → `desk-1-home.kdl`, whose identity
|
|
|
|
|
blocks belong to the Sceptre ultrawide that is *not* connected and whose
|
|
|
|
|
connector-keyed fallbacks carried `mode "3440x1440@180.000"`. niri found no such
|
|
|
|
|
mode on a 1920x1200 panel, logged the fallback, and drove it at preferred — so
|
|
|
|
|
the panels looked fine while every position and refresh value in force had been
|
|
|
|
|
written for a different desk. `desk.sh match` reported "no desk profile matches
|
|
|
|
|
connected outputs" and `blankpad-desk-autoswitch.service` therefore died at its
|
|
|
|
|
initial match, leaving the laptop pinned to the wrong profile indefinitely.
|
|
|
|
|
Law: **a desk with no matching profile is not "unchanged", it is silently
|
|
|
|
|
misconfigured** — `desk.sh match` saying "no match" is a defect to fix before
|
|
|
|
|
anything else on that desk behaves strangely.
|
|
|
|
|
|
|
|
|
|
## Desk switching
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
@@ -80,8 +122,13 @@ graph LR
|
|
|
|
|
- **Manual override:** `Mod+Shift+D` cycles profiles (wrong auto-pick, or
|
|
|
|
|
same panels, new layout).
|
|
|
|
|
- **New desk:** `desk.sh capture` prints connected long names → copy into a
|
|
|
|
|
new `desk-N-<name>.kdl` (see `desk-2-portable.kdl` skeleton, portable
|
|
|
|
|
monitor EDID pending first capture).
|
|
|
|
|
new `desk-N-<name>.kdl` with one identity block per panel (template:
|
|
|
|
|
[the desk-2 rig](#the-desk-2-rig-portable)).
|
|
|
|
|
- **A dead watcher is a signal, not a crash to ignore:** the unit exits at
|
|
|
|
|
startup when `desk.sh match` finds no eligible profile, so "no match" on a
|
|
|
|
|
desk that clearly has panels means a missing profile, not an idle daemon.
|
|
|
|
|
Check `systemctl --user is-active blankpad-desk-autoswitch` after touching
|
|
|
|
|
desk profiles.
|
|
|
|
|
- Unit: `blankpad-desk-autoswitch.service` (systemd user,
|
|
|
|
|
`ConditionHost=blankpad`).
|
|
|
|
|
|
|
|
|
|