From c7fd0c17b12fa209d936d032bf126ee542b4e235 Mon Sep 17 00:00:00 2001 From: luukvbaal Date: Sun, 12 Oct 2025 04:41:09 +0200 Subject: [PATCH] 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. --- src/nvim/window.c | 2 +- test/functional/ui/float_spec.lua | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/nvim/window.c b/src/nvim/window.c index de14fd5ee0..8b7f99dba1 100644 --- 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 index 3978e6c16c..089fefbfc0 100644 --- 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()