diff --git a/src/nvim/api/win_config.c b/src/nvim/api/win_config.c index f92502e6c9..65e25a20b4 100644 --- a/src/nvim/api/win_config.c +++ b/src/nvim/api/win_config.c @@ -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); } diff --git a/test/functional/ui/float_spec.lua b/test/functional/ui/float_spec.lua index 8978ccd783..59ee0eb0e5 100644 --- a/test/functional/ui/float_spec.lua +++ b/test/functional/ui/float_spec.lua @@ -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()