fix(window-restore): re-read workspace/window state after the wofi pick

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.
This commit is contained in:
funman300
2026-07-16 10:10:40 -07:00
parent 41f0ee88ff
commit 05cc026d75
4 changed files with 42 additions and 2 deletions
@@ -226,3 +226,7 @@ the stash holds index 1).
- Restoring to a window's *original* workspace. Rejected during design: it needs
per-window origin tracking that can go stale.
- A waybar module showing a stash count — the workspace pill already signals it.
- Multi-monitor correctness: the stash is pinned to index 1 only on its own
output, so a second monitor's workspaces would start at 1 with no stash,
throwing off the `Mod+1..9` +1 offset there. Correct on this single-panel
(`eDP-1`) machine; latent if a second output is ever attached.