`[[page|Label]]` is Obsidian syntax, not OKF. `kb-lint` resolves it Obsidian-style — by filename, anywhere in the bundle — so it has never tripped the link gate, while every other consumer of the bundle (an OKF renderer, a Gitea wiki export, `grep` for reachability) sees bracketed text where a link should be. That is how two generated pages ended up with no inbound link at all and nobody noticed: the my-first link census of the bundle reported them as orphans because their only inbound edges were wikilinks. Mechanical conversion, 52 links across 17 pages, each resolved against the same page set `kb-lint` uses: an explicit `|Label` is kept verbatim, an unlabelled link takes the target's frontmatter `title`. Targets are emitted bundle-absolute (`/tools/niri/tips.md`), the form the spec recommends and the form 99 existing links in this bundle already use. Two links were `[[index]]`, which resolves by filename to 21 pages — the ambiguity that filename-resolution invites. Both meant their own directory's index, so both are now written out in full: `/tools/gitea/index.md`, `/tools/niri/index.md`. The linter still tolerates wikilinks; whether it should reject them outright is an open question on #64, because that would replace the two tests pinning today's tolerance. Refs #64
81 lines
3.5 KiB
Markdown
81 lines
3.5 KiB
Markdown
---
|
|
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](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.md](/tools/niri/displays.md) — desk profiles: 1 output portable vs 2 docked
|
|
- [keybindings.md](/tools/niri/keybindings.md) — generated cheat sheet (source of the binds)
|
|
- [noctalia-shell](/tools/noctalia-shell.md) — shell settings on Mod+Shift+O
|