Files
command-center/omp-docs/tools/niri/screenshots.md
Frank d767348cfd niri: retire flameshot binds, absolute script paths in spawn-sh
Live census 2026-10-14: every flameshot mode on this box captures via
xdg-desktop-portal-gnome → niri's single-output API (niri#4313) — full
AND screen hang ~15 s and error docked (verified: exit 124, no file).
Replace all six flameshot binds with niri-native equivalents:
all-monitors script (Print/Ctrl+Shift+1/Mod+Shift+S), screenshot-screen
(Alt+Print/Ctrl+Shift+2), interactive screenshot UI (Ctrl+Print/
Ctrl+Shift+3). Absolute script paths everywhere: niri's spawn-sh PATH
is system-only, ~/.local/bin absent — the bare screenshot-desk.sh and
desk.sh binds were silently dead. bats 27/27.
2026-10-14 17:53:09 -07:00

3.4 KiB


type: reference title: Screenshot Matrix description: Screenshot setup on blankpad — flameshot retired (all modes hang via portal on 2+ outputs, niri#4313); niri-native binds: all-monitors script, focused-screen capture, interactive UI. Includes the niri spawn-sh PATH trap. tags:

  • niri
  • flameshot
  • screenshots
  • multi-monitor
  • portal verified: 2026-10-14

Screenshot Matrix

Flameshot is retired on this box (2026-10-14). Every flameshot mode on Wayland captures through xdg-desktop-portal → xdg-desktop-portal-gnome → niri's GNOME-Screenshot compatibility API, which is hard-limited to one output. All binds are niri-native now.

Live binds

Bind Action Output
Print / Ctrl+Shift+1 / Mod+Shift+S screenshot-desk.sh — one PNG per monitor ~/Pictures/Screenshots/Screenshot from … <connector>.png
Alt+Print / Ctrl+Shift+2 screenshot-screen — focused monitor same dir (niri screenshot-path) + clipboard
Ctrl+Print / Ctrl+Shift+3 screenshot UI — interactive region/window/screen, Space saves, Esc cancels same dir + clipboard; single-output selection by design

Noctalia settings lives on Mod+Shift+O (moved off Mod+Shift+S).

Why flameshot died (and not just full)

  • Portal chain: flameshot 14 → xdg-desktop-portal-gnome → niri D-Bus API → screenshot_all_outputs → ensure!(outputs.len() == 1) (FIXME upstream).
  • flameshot full on 2 outputs: each press emits 3 refusals (composited screen + per-output) — WARN niri::niri: error taking a screenshot: Condition failed: outputs.len() == 1 (2 vs 1) in journalctl --user -u niri; bubbles arrive after the portal round-trip ("bunch of errors after a delay").
  • flameshot screen is NOT exempt: live test docked, 2026-10-14 — flameshot full and flameshot screen both hang ~15 s, exit 124 under timeout, no file written.
  • Upstream: niri#4313 (closed duplicate, unfixed in 26.04/8ed0da4), flameshot#4449.
  • Portable desk (1 output): flameshot would work again — that is the portal's only supported shape.

The all-monitor path: scripts/screenshot-desk.sh

  • Per active output (niri msg --json outputs): focus-monitor → screenshot-screen --path (absolute) → restore prior focus.
  • All niri-native; no grim, no portal. SCREENSHOT_DIR overrides the output dir.

The spawn-sh PATH trap (why "it works in the shell" lies)

niri's environment PATH is the system path — ~/.local/bin is absent (tr '\0' '\n' < /proc/$(pidof niri | awk '{print $1}')/environ). spawn-sh "some-user-script" fails silently. Rules:

  • Keybinds use absolute script paths (/home/blank/.omp/scripts/…). Applies to desk.sh too — its bare bind was dead for the same reason.
  • A bare script name in a keybind is a bug on this box.

Census commands

niri msg outputs                                     # how many outputs live
journalctl --user -u niri --since today | grep -i screenshot   # WARN vs DEBUG saves
tr '\0' '\n' < /proc/$(pgrep -x niri | head -1)/environ | grep ^PATH   # spawn-sh environment

See Also

  • displays — desk profiles: 1 output portable vs 2 docked
  • keybindings — generated cheat sheet (source of the binds)
  • noctalia-shell — shell settings on Mod+Shift+O