commit c7fd0c17b12fa209d936d032bf126ee542b4e235
parent fec02ae8e411658a5f97291ac9d7cf7426f1fcbf
Author: luukvbaal <luukvbaal@gmail.com>
Date: Sun, 12 Oct 2025 04:41:09 +0200
fix(window): don't make hidden/unfocusable previous window current #36142
Problem: Previous window is made current while it is unfocusable/hidden.
Solution: Treat hidden/unfocusable window as an invalid previous window.
Diffstat:
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/nvim/window.c b/src/nvim/window.c
@@ -462,7 +462,7 @@ newwindow:
// cursor to last accessed (previous) window
case 'p':
case Ctrl_P:
- if (!win_valid(prevwin)) {
+ if (!win_valid(prevwin) || prevwin->w_config.hide || !prevwin->w_config.focusable) {
beep_flush();
} else {
win_goto(prevwin);
diff --git a/test/functional/ui/float_spec.lua b/test/functional/ui/float_spec.lua
@@ -962,6 +962,19 @@ describe('float window', function()
eq(1, fn.tabpagewinnr(2))
end)
+ it('non-visible/focusable is not a valid previous window', function()
+ local win = api.nvim_open_win(0, true, { relative = 'editor', width = 2, height = 2, row = 2, col = 2, focusable = false })
+ command('wincmd p')
+ command('wincmd p')
+ neq(win, api.nvim_get_current_win())
+ api.nvim_win_set_config(win, { focusable = true, hide = true })
+ command('wincmd p')
+ neq(win, api.nvim_get_current_win())
+ api.nvim_win_set_config(win, { hide = false })
+ command('wincmd p')
+ eq(win, api.nvim_get_current_win())
+ end)
+
it('no crash for unallocated relative window grid', function()
local win = api.nvim_open_win(0, false, { relative = 'editor', row = 0, col = 0, height = 1, width = 1 })
exec_lua(function()