detached f3346fa

fix(core): show a stash-spawned window over a fullscreen stash member

A fullscreen stash member, current or deferred while the stash was hidden,
hid or replaced the window opened by a stash spawn. The member's fullscreen
now ends first, through the normal path, so the new window is shown,
selected and focused. The docs state that the window must appear within
5 seconds.
commit
f3346fae261f635ae89f2a832a5c344b7871612a
author
brice · · 2026-10-14 20:36 UTC
parent
df18de2
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
2 files · +9 -3
M docs/config.md +1 -1
@@ -259,7 +259,7 @@ Each workspace has a stash: a strip of windows set aside with `toggle-window-sta
259259 bind.cmd+shift+f = stash firefox
260260 ```
261261
262-Apps that hand a launch to an already running instance (single-instance browsers, `footclient`) open their window normally.
262+The window must appear within 5 seconds, otherwise it opens normally. Apps that hand a launch to an already running instance (single-instance browsers, `footclient`) open their window normally.
263263
264264 ### Free floating windows
265265
@@ -259,7 +259,7 @@ Each workspace has a stash: a strip of windows set aside with `toggle-window-sta
259 bind.cmd+shift+f = stash firefox259 bind.cmd+shift+f = stash firefox
260 ```260 ```
261 261
262-Apps that hand a launch to an already running instance (single-instance browsers, `footclient`) open their window normally.262+The window must appear within 5 seconds, otherwise it opens normally. Apps that hand a launch to an already running instance (single-instance browsers, `footclient`) open their window normally.
263 263
264 ### Free floating windows264 ### Free floating windows
265 265
M internal/core/stash.go +8 -2
@@ -83,10 +83,16 @@ func (w *Workspace) captureStash(id WindowID) bool {
8383
8484 // stashSpawned puts a window opened by a stash spawn in the stash, selected
8585 // and focused, with no former column: toggle-window-stash tiles it as a new
86-// column. Under a covering fullscreen window the stash shows over it.
86+// column. A fullscreen stash member, current or waiting for the stash to
87+// show, ends first, so the newcomer is the window on screen. Under a
88+// covering fullscreen window outside the stash, the stash shows over it.
8789 func (w *Workspace) stashSpawned(id WindowID) {
90+ if w.fullscreen != 0 && w.stashIndex(w.fullscreen) >= 0 {
91+ w.endFullscreen()
92+ }
93+ w.hiddenFullscreen = 0
8894 w.addStash(Float{ID: id})
89- if w.cover() != 0 && w.stashIndex(w.cover()) < 0 {
95+ if w.cover() != 0 {
9096 w.showStashOver()
9197 }
9298 }
@@ -83,10 +83,16 @@ func (w *Workspace) captureStash(id WindowID) bool {
83 83
84 // stashSpawned puts a window opened by a stash spawn in the stash, selected84 // stashSpawned puts a window opened by a stash spawn in the stash, selected
85 // and focused, with no former column: toggle-window-stash tiles it as a new85 // and focused, with no former column: toggle-window-stash tiles it as a new
86-// column. Under a covering fullscreen window the stash shows over it.86+// column. A fullscreen stash member, current or waiting for the stash to
87+// show, ends first, so the newcomer is the window on screen. Under a
88+// covering fullscreen window outside the stash, the stash shows over it.
87 func (w *Workspace) stashSpawned(id WindowID) {89 func (w *Workspace) stashSpawned(id WindowID) {
90+ if w.fullscreen != 0 && w.stashIndex(w.fullscreen) >= 0 {
91+ w.endFullscreen()
92+ }
93+ w.hiddenFullscreen = 0
88 w.addStash(Float{ID: id})94 w.addStash(Float{ID: id})
89- if w.cover() != 0 && w.stashIndex(w.cover()) < 0 {95+ if w.cover() != 0 {
90 w.showStashOver()96 w.showStashOver()
91 }97 }
92 }98 }

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 23

Tags 10

↑↓ moveenter openesc close