The picker blocks on user input for however long they take. In that
window niri can destroy a dynamic workspace (its last window closed)
and renumber every later one down, so the pre-pick current["idx"] can
point at the wrong workspace by the time move-window-to-workspace
runs — restoring to the wrong place. The stashed window itself can
also have closed in the meantime, in which case the move/focus calls
would silently no-op. main() now re-reads workspaces/windows after
pick() returns, recomputes the current workspace, and confirms the
chosen window still exists before acting; each bails with a notify
and the documented exit code otherwise. Adds window_exists() as a
pure, tested helper alongside the existing pure functions.
Also: clarify the focus=false comment in niri/config.kdl (it read as
if focus=false caused the problem it actually prevents), and note in
the design doc's Out of scope section that the stash's index-1
pinning is per-output, so a second monitor would need its own
analysis of the Mod+1..9 offset.
Two effects were hiding the volume slider:
- gamemode-session turns on mako's do-not-disturb mode, whose invisible=1
suppressed every notification, the OSD included.
- niri draws fullscreen windows above the top layer, mako's default, so the
OSD rendered underneath fullscreen windows even outside gamemode.
Tag the OSD with its own app name so mako can match it, then exempt just that
name: invisible=0 to survive DND, layer=overlay to clear fullscreen. The block
is listed after [mode=do-not-disturb] because later criteria win in mako.
Verified with DND active and a fullscreen window: the OSD shows, while another
app's notification under the same conditions stays suppressed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Prevents a manually-launched watcher and the spawn-at-startup one from
racing the same winwatch source; the second instance exits immediately.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add scripts/gamemode-watch.py, launched at niri startup, which subscribes
to niri's event stream and toggles gamemode whenever a game window
(steam_app_*, RuneLite, gamescope) is open — so Steam games trigger
gamemode with zero per-game setup instead of needing gamemoderun %command%.
'winwatch' is a third reference-counted source alongside feral + manual.
Pure Watcher class is unit-tested; SIGTERM/finally guarantee cleanup so
the watcher stopping never leaves gamemode stuck on.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
makoctl/fw-fanctrl echo confirmations to stdout that leaked into add/del
output during integration. run() now discards stdout, keeps stderr.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds /etc/pam.d/greetd to the TARGETS array so re-running
enable-fingerprint.sh extends fprintd auth to the regreet login
screen. Cold-boot timing and silent-touch UX caveats documented
in the spec are accepted as-is — fingerprint failure falls back to
password, no risk of lockout.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Aligns the third sleep path (power menu) with the lid handler and
the swayidle 30-min timer — all three now suspend immediately and
hibernate after HibernateDelaySec (30 min).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
If `findmnt -no PARTUUID /` returns nothing (root on LVM, no GPT,
unusual mount state) the script would silently write a broken
resume=PARTUUID= line to /etc/kernel/cmdline. Bail with an error
message instead.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Flameshot's portal-based capture path on niri triggers an
xdg-desktop-portal access prompt on every invocation, blocking
the screenshot itself. grim talks to wlr-screencopy directly and
never touches the portal, so no prompt.
Pipeline: slurp (region) → grim (capture) → satty (annotate +
copy + save). satty replaces the wofi action menu by being the
post-capture surface itself.
- scripts/screenshot.sh added
- install.sh symlinks it; flameshot.ini generator removed
- niri Mod+Print → "screenshot"
- packages.txt drops flameshot
- docs tables updated
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
map_profile_to_strategy never writes to stderr — the suppression was
silencing nothing real and would mislead a future reader.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
scripts/autostart.sh was never symlinked or referenced — niri's
spawn-at-startup directives cover everything it launched.
mako/config is gitignored (install.sh generates it from
theme/colors.json) but was still tracked from the initial commit.
The stale ~/.config/mako/config symlink that pointed at the repo
caused install.sh's writes to land back in the repo. Removed both
so install.sh now correctly produces a real generated file in
~/.config/mako/.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
scripts/waybar-restart.sh: kills waybar, waits for it to exit, then
relaunches detached via setsid. Symlinked into ~/.local/bin and bound
to Mod+Shift+B in niri.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Add scripts/powermenu.sh with logout, restart, sleep, shutdown options
- Create wofi/style.css with Tomorrow Night colors
- Apply Tomorrow Night theme to niri, waybar, mako, alacritty, and wofi