aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api/win_config.c
diff options
context:
space:
mode:
authorSean Dewar <6256228+seandewar@users.noreply.github.com>2024-02-25 01:03:26 +0000
committerSean Dewar <6256228+seandewar@users.noreply.github.com>2024-03-08 23:24:04 +0000
commit1c6b693ec1592f9d193fc9cc1bb03e738fb2bef6 (patch)
tree9771486507e8955b3e1f906c4a150c938040ca0f /src/nvim/api/win_config.c
parent24dfa47e4f4ca41d0c5f8c1c0f851602362c81d3 (diff)
downloadrneovim-1c6b693ec1592f9d193fc9cc1bb03e738fb2bef6.tar.gz
rneovim-1c6b693ec1592f9d193fc9cc1bb03e738fb2bef6.tar.bz2
rneovim-1c6b693ec1592f9d193fc9cc1bb03e738fb2bef6.zip
vim-patch:9.1.0118: Use different restoration strategy in win_splitmove
Problem: saving and restoring all frames to split-move is overkill now that WinNewPre is not fired when split-moving. Solution: defer the flattening of frames until win_split_ins begins reorganising them, and attempt to restore the layout by undoing our changes. (Sean Dewar) https://github.com/vim/vim/commit/704966c2545897dfcf426dd9ef946aeb6fa80c38 Adjust winframe_restore to account for Nvim's horizontal separators when the global statusline is in use. Add a test.
Diffstat (limited to 'src/nvim/api/win_config.c')
-rw-r--r--src/nvim/api/win_config.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/nvim/api/win_config.c b/src/nvim/api/win_config.c
index c308cadb7c..978d8515c8 100644
--- a/src/nvim/api/win_config.c
+++ b/src/nvim/api/win_config.c
@@ -260,7 +260,7 @@ Window nvim_open_win(Buffer buffer, Boolean enter, Dict(win_config) *config, Err
int flags = win_split_flags(fconfig.split, parent == NULL) | WSP_NOENTER;
if (parent == NULL) {
- wp = win_split_ins(0, flags, NULL, 0);
+ wp = win_split_ins(0, flags, NULL, 0, NULL);
} else {
tp = win_find_tabpage(parent);
switchwin_T switchwin;
@@ -268,7 +268,7 @@ Window nvim_open_win(Buffer buffer, Boolean enter, Dict(win_config) *config, Err
const int result = switch_win(&switchwin, parent, tp, true);
assert(result == OK);
(void)result;
- wp = win_split_ins(0, flags, NULL, 0);
+ wp = win_split_ins(0, flags, NULL, 0, NULL);
restore_win(&switchwin, true);
}
if (wp) {
@@ -495,11 +495,11 @@ void nvim_win_set_config(Window window, Dict(win_config) *config, Error *err)
// If the frame doesn't have a parent, the old frame
// was the root frame and we need to create a top-level split.
int dir;
- new_curwin = winframe_remove(win, &dir, win_tp == curtab ? NULL : win_tp);
+ new_curwin = winframe_remove(win, &dir, win_tp == curtab ? NULL : win_tp, NULL);
} else if (n_frames == 2) {
// There are two windows in the frame, we can just rotate it.
int dir;
- neighbor = winframe_remove(win, &dir, win_tp == curtab ? NULL : win_tp);
+ neighbor = winframe_remove(win, &dir, win_tp == curtab ? NULL : win_tp, NULL);
new_curwin = neighbor;
} else {
// There is only one window in the frame, we can't split it.
@@ -511,7 +511,7 @@ void nvim_win_set_config(Window window, Dict(win_config) *config, Error *err)
parent = neighbor;
} else {
int dir;
- new_curwin = winframe_remove(win, &dir, win_tp == curtab ? NULL : win_tp);
+ new_curwin = winframe_remove(win, &dir, win_tp == curtab ? NULL : win_tp, NULL);
}
win_remove(win, win_tp == curtab ? NULL : win_tp);
// move to neighboring window if we're moving the current window to a new tabpage
@@ -531,7 +531,7 @@ void nvim_win_set_config(Window window, Dict(win_config) *config, Error *err)
int flags = win_split_flags(fconfig.split, parent == NULL) | WSP_NOENTER;
if (parent == NULL) {
- if (!win_split_ins(0, flags, win, 0)) {
+ if (!win_split_ins(0, flags, win, 0, NULL)) {
// TODO(willothy): What should this error message say?
api_set_error(err, kErrorTypeException, "Failed to split window");
return;
@@ -542,7 +542,7 @@ void nvim_win_set_config(Window window, Dict(win_config) *config, Error *err)
const int result = switch_win(&switchwin, parent, win_find_tabpage(parent), true);
(void)result;
assert(result == OK);
- win_split_ins(0, flags, win, 0);
+ win_split_ins(0, flags, win, 0, NULL);
restore_win(&switchwin, true);
}
if (HAS_KEY_X(config, width)) {