aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/api/win_config.c33
-rw-r--r--src/nvim/api/window.c2
-rw-r--r--src/nvim/popupmenu.c9
-rw-r--r--src/nvim/window.c8
4 files changed, 31 insertions, 21 deletions
diff --git a/src/nvim/api/win_config.c b/src/nvim/api/win_config.c
index feb4271b5f..11b6b17516 100644
--- a/src/nvim/api/win_config.c
+++ b/src/nvim/api/win_config.c
@@ -199,9 +199,8 @@
/// - footer_pos: Footer position. Must be set with `footer` option.
/// Value can be one of "left", "center", or "right".
/// Default is `"left"`.
-/// - noautocmd: If true then autocommands triggered from setting the
-/// `buffer` to display are blocked (e.g: |BufEnter|, |BufLeave|,
-/// |BufWinEnter|).
+/// - noautocmd: If true then all autocommands are blocked for the duration of
+/// the call.
/// - fixed: If true when anchor is NW or SW, the float window
/// would be kept fixed even if the window would be truncated.
/// - hide: If true the floating window will be hidden.
@@ -230,6 +229,10 @@ Window nvim_open_win(Buffer buffer, Boolean enter, Dict(win_config) *config, Err
}
bool is_split = HAS_KEY_X(config, split) || HAS_KEY_X(config, vertical);
+ Window rv = 0;
+ if (fconfig.noautocmd) {
+ block_autocmds();
+ }
win_T *wp = NULL;
tabpage_T *tp = curtab;
@@ -239,15 +242,15 @@ Window nvim_open_win(Buffer buffer, Boolean enter, Dict(win_config) *config, Err
parent = find_window_by_handle(fconfig.window, err);
if (!parent) {
// find_window_by_handle has already set the error
- return 0;
+ goto cleanup;
} else if (parent->w_floating) {
api_set_error(err, kErrorTypeException, "Cannot split a floating window");
- return 0;
+ goto cleanup;
}
}
if (!check_split_disallowed_err(parent ? parent : curwin, err)) {
- return 0; // error already set
+ goto cleanup; // error already set
}
if (HAS_KEY_X(config, vertical) && !HAS_KEY_X(config, split)) {
@@ -283,7 +286,7 @@ Window nvim_open_win(Buffer buffer, Boolean enter, Dict(win_config) *config, Err
if (!ERROR_SET(err)) {
api_set_error(err, kErrorTypeException, "Failed to create window");
}
- return 0;
+ goto cleanup;
}
// Autocommands may close `wp` or move it to another tabpage, so update and check `tp` after each
@@ -291,8 +294,8 @@ Window nvim_open_win(Buffer buffer, Boolean enter, Dict(win_config) *config, Err
// Also, autocommands may free the `buf` to switch to, so store a bufref to check.
bufref_T bufref;
set_bufref(&bufref, buf);
- switchwin_T switchwin;
- {
+ if (!fconfig.noautocmd) {
+ switchwin_T switchwin;
const int result = switch_win_noblock(&switchwin, wp, tp, true);
assert(result == OK);
(void)result;
@@ -313,7 +316,7 @@ Window nvim_open_win(Buffer buffer, Boolean enter, Dict(win_config) *config, Err
autocmd_no_enter++;
autocmd_no_leave++;
}
- win_set_buf(wp, buf, fconfig.noautocmd, err);
+ win_set_buf(wp, buf, err);
if (!fconfig.noautocmd) {
tp = win_find_tabpage(wp);
}
@@ -324,14 +327,20 @@ Window nvim_open_win(Buffer buffer, Boolean enter, Dict(win_config) *config, Err
}
if (!tp) {
api_set_error(err, kErrorTypeException, "Window was closed immediately");
- return 0;
+ goto cleanup;
}
if (fconfig.style == kWinStyleMinimal) {
win_set_minimal_style(wp);
didset_window_options(wp, true);
}
- return wp->handle;
+ rv = wp->handle;
+
+cleanup:
+ if (fconfig.noautocmd) {
+ unblock_autocmds();
+ }
+ return rv;
#undef HAS_KEY_X
}
diff --git a/src/nvim/api/window.c b/src/nvim/api/window.c
index 30f77c7248..08ecca1380 100644
--- a/src/nvim/api/window.c
+++ b/src/nvim/api/window.c
@@ -71,7 +71,7 @@ void nvim_win_set_buf(Window window, Buffer buffer, Error *err)
api_set_error(err, kErrorTypeException, "%s", e_cmdwin);
return;
}
- win_set_buf(win, buf, false, err);
+ win_set_buf(win, buf, err);
}
/// Gets the (1,0)-indexed, buffer-relative cursor position for a given window
diff --git a/src/nvim/popupmenu.c b/src/nvim/popupmenu.c
index bed0a8df4a..73e019bc50 100644
--- a/src/nvim/popupmenu.c
+++ b/src/nvim/popupmenu.c
@@ -666,6 +666,7 @@ void pum_redraw(void)
}
/// create a floating preview window for info
+/// Autocommands are blocked for the duration of the call.
/// @return NULL when no enough room to show
static win_T *pum_create_float_preview(bool enter)
{
@@ -690,6 +691,9 @@ static win_T *pum_create_float_preview(bool enter)
config.height = pum_height;
config.style = kWinStyleMinimal;
config.hide = true;
+
+ block_autocmds();
+
Error err = ERROR_INIT;
win_T *wp = win_new_float(NULL, true, config, &err);
// TODO(glepnir): remove win_enter usage
@@ -701,6 +705,7 @@ static win_T *pum_create_float_preview(bool enter)
Buffer b = nvim_create_buf(false, true, &err);
if (!b) {
win_free(wp, NULL);
+ unblock_autocmds();
return NULL;
}
buf_T *buf = find_buffer_by_handle(b, &err);
@@ -709,7 +714,9 @@ static win_T *pum_create_float_preview(bool enter)
wp->w_float_is_info = true;
wp->w_p_diff = false;
buf->b_p_bl = false;
- win_set_buf(wp, buf, true, &err);
+ win_set_buf(wp, buf, &err);
+
+ unblock_autocmds();
return wp;
}
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 9f030d2bab..d86584e9ce 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -735,16 +735,13 @@ static void cmd_with_count(char *cmd, char *bufp, size_t bufsize, int64_t Prenum
}
}
-void win_set_buf(win_T *win, buf_T *buf, bool noautocmd, Error *err)
+void win_set_buf(win_T *win, buf_T *buf, Error *err)
FUNC_ATTR_NONNULL_ALL
{
tabpage_T *tab = win_find_tabpage(win);
// no redrawing and don't set the window title
RedrawingDisabled++;
- if (noautocmd) {
- block_autocmds();
- }
switchwin_T switchwin;
if (switch_win_noblock(&switchwin, win, tab, true) == FAIL) {
@@ -770,9 +767,6 @@ void win_set_buf(win_T *win, buf_T *buf, bool noautocmd, Error *err)
cleanup:
restore_win_noblock(&switchwin, true);
- if (noautocmd) {
- unblock_autocmds();
- }
RedrawingDisabled--;
}