--- 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 … .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](https://github.com/niri-wm/niri/issues/4313) (closed duplicate, unfixed in 26.04/8ed0da4), [flameshot#4449](https://github.com/flameshot-org/flameshot/issues/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 ```bash 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|displays.md]] — desk profiles: 1 output portable vs 2 docked - [[keybindings|keybindings.md]] — generated cheat sheet (source of the binds) - [[noctalia-shell|noctalia-shell]] — shell settings on Mod+Shift+O