aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/api/vim.c19
-rw-r--r--test/functional/api/vim_spec.lua25
2 files changed, 35 insertions, 9 deletions
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index 26dc223948..7a4aefc620 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -2393,10 +2393,6 @@ void nvim__redraw(Dict(redraw) *opts, Error *err)
redraw_buf_range_later(rbuf, first, last);
}
- if (opts->cursor) {
- setcursor_mayforce(win ? win : curwin, true);
- }
-
bool flush = opts->flush;
if (opts->tabline) {
// Flush later in case tabline was just hidden or shown for the first time.
@@ -2423,11 +2419,22 @@ void nvim__redraw(Dict(redraw) *opts, Error *err)
}
}
- // Flush pending screen updates if "flush" or "clear" is true, or when
- // redrawing a status component may have changed the grid dimensions.
+ win_T *cwin = win ? win : curwin;
+ // Allow moving cursor to recently opened window and make sure it is drawn #28868.
+ if (opts->cursor && (!cwin->w_grid.target || !cwin->w_grid.target->valid)) {
+ flush = true;
+ }
+
+ // Redraw pending screen updates when explicitly requested or when determined
+ // that it is necessary to properly draw other requested components.
if (flush && !cmdpreview) {
update_screen();
}
+
+ if (opts->cursor) {
+ setcursor_mayforce(cwin, true);
+ }
+
ui_flush();
RedrawingDisabled = save_rd;
diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua
index bd16f0785b..035c8f70de 100644
--- a/test/functional/api/vim_spec.lua
+++ b/test/functional/api/vim_spec.lua
@@ -4969,12 +4969,29 @@ describe('API', function()
it('nvim__redraw', function()
local screen = Screen.new(60, 5)
screen:attach()
- local win = api.nvim_get_current_win()
eq('at least one action required', pcall_err(api.nvim__redraw, {}))
eq('at least one action required', pcall_err(api.nvim__redraw, { buf = 0 }))
eq('at least one action required', pcall_err(api.nvim__redraw, { win = 0 }))
eq("cannot use both 'buf' and 'win'", pcall_err(api.nvim__redraw, { buf = 0, win = 0 }))
+ local win = api.nvim_get_current_win()
+ -- Can move cursor to recently opened window and window is flushed #28868
feed(':echo getchar()<CR>')
+ local newwin = api.nvim_open_win(0, false, {
+ relative = 'editor',
+ width = 1,
+ height = 1,
+ row = 1,
+ col = 10,
+ })
+ api.nvim__redraw({ win = newwin, cursor = true })
+ screen:expect({
+ grid = [[
+ |
+ {1:~ }{4:^ }{1: }|
+ {1:~ }|*2
+ :echo getchar() |
+ ]],
+ })
fn.setline(1, 'foobar')
command('vnew')
fn.setline(1, 'foobaz')
@@ -4983,11 +5000,13 @@ describe('API', function()
screen:expect({
grid = [[
foobaz │foobar |
- {1:~ }│{1:~ }|*2
+ {1:~ }{4:^f}{1: }│{1:~ }|
+ {1:~ }│{1:~ }|
{3:[No Name] [+] }{2:[No Name] [+] }|
- ^:echo getchar() |
+ :echo getchar() |
]],
})
+ api.nvim_win_close(newwin, true)
-- Can update the grid cursor position #20793
api.nvim__redraw({ cursor = true })
screen:expect({