mirror of
https://github.com/neovim/neovim.git
synced 2026-06-15 16:23:48 +00:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user