fix(api): nvim_open_win respects requested split window size (#35601)

Problem: requested window size passed to nvim_open_win for splits may be ignored
by win_split_ins if it decides to forcefully equalize window sizes instead (e.g:
in an attempt to make room for the new window).

Solution: try to set the size again if it differs from what was requested.

Co-authored-by: Sean Dewar <6256228+seandewar@users.noreply.github.com>
This commit is contained in:
glepnir
2025-10-04 16:07:27 +08:00
committed by Sean Dewar
parent 675fc52183
commit 479bb9cbab
2 changed files with 22 additions and 0 deletions

View File

@@ -279,6 +279,13 @@ Window nvim_open_win(Buffer buffer, Boolean enter, Dict(win_config) *config, Err
}); });
if (wp) { if (wp) {
wp->w_config = fconfig; wp->w_config = fconfig;
// Without room for the requested size, window sizes may have been equalized instead.
// If the size differs from what was requested, try to set it again now.
if ((flags & WSP_VERT) && wp->w_width != fconfig.width) {
win_setwidth_win(fconfig.width, wp);
} else if (!(flags & WSP_VERT) && wp->w_height != fconfig.height) {
win_setheight_win(fconfig.height, wp);
}
} }
} else { } else {
wp = win_new_float(NULL, false, fconfig, err); wp = win_new_float(NULL, false, fconfig, err);

View File

@@ -1930,6 +1930,21 @@ describe('API/win', function()
}) })
) )
end) end)
it('respects requested size for large splits', function()
command('vsplit')
local win = api.nvim_open_win(0, false, { win = -1, split = 'right', width = 38 })
eq(38, api.nvim_win_get_width(win))
-- No zero-sized windows (e.g: from skipping forced equalization in win_split_ins) if
-- requesting a chonky window; that could lead to crashes!
api.nvim_open_win(0, false, { win = -1, split = 'right', width = 9999 })
eq({ 1, 1, 1, 74 }, eval("range(1, winnr('$'))->map({_, nr -> winwidth(nr)})"))
command('split')
win = api.nvim_open_win(0, false, { win = 0, split = 'below', height = 10 })
eq(10, api.nvim_win_get_height(win))
end)
end) end)
describe('set_config', function() describe('set_config', function()