aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSean Dewar <seandewar@users.noreply.github.com>2024-02-04 01:50:49 +0000
committerSean Dewar <6256228+seandewar@users.noreply.github.com>2024-03-08 22:37:32 +0000
commit233649bc757743f7677b2ae414779192a94aa2ae (patch)
tree0e5d9ce3efc872bb528514cf99744ba2b120f371 /src
parentbcb70eeac48040fd6d6bfc20cf7fb6f41374a67c (diff)
downloadrneovim-233649bc757743f7677b2ae414779192a94aa2ae.tar.gz
rneovim-233649bc757743f7677b2ae414779192a94aa2ae.tar.bz2
rneovim-233649bc757743f7677b2ae414779192a94aa2ae.zip
fix(api): win_set_config fires unnecessary autocmds
Problem: win_set_config should have the observable effect of moving an existing window to another place, but instead fires autocommands as if a new window was created and entered (and does not fire autocommands reflecting a "return" to the original window). Solution: do not fire win_enter-related autocommands when splitting the window, but continue to fire them when entering the window that fills the new space when moving a window to a different tabpage, as the new curwin changes. Also, remove "++once" from the WinEnter autocmd in the other test, as omitting it also crashed Nvim before this fix.
Diffstat (limited to 'src')
-rw-r--r--src/nvim/api/win_config.c28
1 files changed, 8 insertions, 20 deletions
diff --git a/src/nvim/api/win_config.c b/src/nvim/api/win_config.c
index bb1117b3fe..e53e13e2a3 100644
--- a/src/nvim/api/win_config.c
+++ b/src/nvim/api/win_config.c
@@ -505,7 +505,7 @@ void nvim_win_set_config(Window window, Dict(win_config) *config, Error *err)
win->w_pos_changed = true;
}
- int flags = win_split_flags(fconfig.split, parent == NULL);
+ int flags = win_split_flags(fconfig.split, parent == NULL) | WSP_NOENTER;
if (parent == NULL) {
if (!win_split_ins(0, flags, win, 0)) {
@@ -514,24 +514,13 @@ void nvim_win_set_config(Window window, Dict(win_config) *config, Error *err)
return;
}
} else {
- win_execute_T args;
-
- tabpage_T *tp = win_find_tabpage(parent);
- if (!win_execute_before(&args, parent, tp)) {
- // TODO(willothy): how should we handle this / what should the message be?
- api_set_error(err, kErrorTypeException, "Failed to switch to tabpage %d", tp->handle);
- win_execute_after(&args);
- return;
- }
- // This should return the same ptr to `win`, but we check for
- // NULL to detect errors.
- win_T *res = win_split_ins(0, flags, win, 0);
- win_execute_after(&args);
- if (!res) {
- // TODO(willothy): What should this error message say?
- api_set_error(err, kErrorTypeException, "Failed to split window");
- return;
- }
+ switchwin_T switchwin;
+ // `parent` is valid in its tabpage, so switch_win should not fail.
+ const int result = switch_win(&switchwin, parent, win_find_tabpage(parent), true);
+ (void)result;
+ assert(result == OK);
+ win_split_ins(0, flags, win, 0);
+ restore_win(&switchwin, true);
}
if (HAS_KEY_X(config, width)) {
win_setwidth_win(fconfig.width, win);
@@ -539,7 +528,6 @@ void nvim_win_set_config(Window window, Dict(win_config) *config, Error *err)
if (HAS_KEY_X(config, height)) {
win_setheight_win(fconfig.height, win);
}
- redraw_later(win, UPD_NOT_VALID);
return;
} else {
win_config_float(win, fconfig);