fix(float): validate conflicts for nvim_win_set_config()

Problem:  nvim_win_set_config() does not error on flags not allowed for
          non-floating windows.
          `hide` should not be allowed for non-floating windows.
Solution: Check that a window is a split when reconfiguring.
          Error when trying to hide a split window.
This commit is contained in:
Luuk van Baal
2026-05-31 15:48:58 +02:00
parent 1ca65faca6
commit 9cf684ed7d
2 changed files with 19 additions and 8 deletions

View File

@@ -211,12 +211,12 @@ Window nvim_open_win(Buffer buf, Boolean enter, Dict(win_config) *config, Error
return 0;
}
bool is_split = HAS_KEY_X(config, split) || HAS_KEY_X(config, vertical);
WinConfig fconfig = WIN_CONFIG_INIT;
if (!parse_win_config(NULL, config, &fconfig, false, err)) {
if (!parse_win_config(NULL, config, &fconfig, false, !is_split, err)) {
return 0;
}
bool is_split = HAS_KEY_X(config, split) || HAS_KEY_X(config, vertical);
Window rv = 0;
if (fconfig.noautocmd) {
block_autocmds();
@@ -771,8 +771,9 @@ void nvim_win_set_config(Window win, Dict(win_config) *config, Error *err)
bool to_split = config->relative.size == 0
&& !(HAS_KEY_X(config, external) && config->external)
&& (has_split || has_vertical || was_split);
bool will_float = (!was_split && !to_split) || config->relative.size > 0 || config->external;
if (!parse_win_config(w, config, &fconfig, !was_split || to_split, err)) {
if (!parse_win_config(w, config, &fconfig, !was_split || to_split, will_float, err)) {
return;
}
@@ -1258,7 +1259,7 @@ bool parse_winborder(WinConfig *fconfig, char *border_opt, Error *err)
}
static bool parse_win_config(win_T *wp, Dict(win_config) *config, WinConfig *fconfig, bool reconf,
Error *err)
bool will_float, Error *err)
{
bool has_relative = false, relative_is_win = false, is_split = false;
if (config->relative.size > 0) {
@@ -1423,7 +1424,7 @@ static bool parse_win_config(win_T *wp, Dict(win_config) *config, WinConfig *fco
}
if (HAS_KEY_X(config, zindex)) {
VALIDATE_CON(!is_split, "zindex", "non-float window", {
VALIDATE_CON(will_float, "zindex", "non-float window", {
goto fail;
});
VALIDATE_EXP((config->zindex > 0), "zindex", "positive Integer", NULL, {
@@ -1433,7 +1434,7 @@ static bool parse_win_config(win_T *wp, Dict(win_config) *config, WinConfig *fco
}
if (HAS_KEY_X(config, title)) {
VALIDATE_CON(!is_split, "title", "non-float window", {
VALIDATE_CON(will_float, "title", "non-float window", {
goto fail;
});
@@ -1453,7 +1454,7 @@ static bool parse_win_config(win_T *wp, Dict(win_config) *config, WinConfig *fco
}
if (HAS_KEY_X(config, footer)) {
VALIDATE_CON(!is_split, "footer", "non-float window", {
VALIDATE_CON(will_float, "footer", "non-float window", {
goto fail;
});
@@ -1474,7 +1475,7 @@ static bool parse_win_config(win_T *wp, Dict(win_config) *config, WinConfig *fco
Object border_style = OBJECT_INIT;
if (HAS_KEY_X(config, border)) {
VALIDATE_CON(!is_split, "border", "non-float window", {
VALIDATE_CON(will_float, "border", "non-float window", {
goto fail;
});
border_style = config->border;
@@ -1514,6 +1515,9 @@ static bool parse_win_config(win_T *wp, Dict(win_config) *config, WinConfig *fco
}
if (HAS_KEY_X(config, hide)) {
VALIDATE_CON(will_float || !config->hide, "hide", "non-float window", {
goto fail;
});
if (fconfig->hide && !config->hide) {
redraw_later(wp, UPD_NOT_VALID);
}

View File

@@ -205,6 +205,13 @@ describe('float window', function()
"Conflict: 'bufpos' not allowed with non-float window",
pcall_err(api.nvim_win_set_config, winid, { split = 'right', bufpos = { 0, 0 } })
)
-- Reconfiguring split
local not_allowed = { hide = true, zindex = 1, title = '', footer = '', border = 'single' }
for k, v in pairs(not_allowed) do
local err = ("Conflict: '%s' not allowed with non-float window"):format(k)
eq(err, pcall_err(api.nvim_win_set_config, winid, { [k] = v }))
end
end)
it('win_execute() should work', function()