mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 11:28:22 +00:00
fix(api): only flush nvim__redraw when necessary #31250
Problem: Not possible to only set a "redraw later" type with nvim__redraw, which seems to be desired for the treesitter highlighter. Solution: Do not update the screen when "flush" is explicitly set to false and only redraw later types are present. In that case, do not call ui_flush() either.
This commit is contained in:
@@ -65,7 +65,7 @@ function M.on_inlayhint(err, result, ctx)
|
||||
if num_unprocessed == 0 then
|
||||
client_hints[client_id] = {}
|
||||
bufstate.version = ctx.version
|
||||
api.nvim__redraw({ buf = bufnr, valid = true })
|
||||
api.nvim__redraw({ buf = bufnr, valid = true, flush = false })
|
||||
return
|
||||
end
|
||||
|
||||
@@ -81,7 +81,7 @@ function M.on_inlayhint(err, result, ctx)
|
||||
|
||||
client_hints[client_id] = new_lnum_hints
|
||||
bufstate.version = ctx.version
|
||||
api.nvim__redraw({ buf = bufnr, valid = true })
|
||||
api.nvim__redraw({ buf = bufnr, valid = true, flush = false })
|
||||
end
|
||||
|
||||
--- |lsp-handler| for the method `workspace/inlayHint/refresh`
|
||||
@@ -215,7 +215,7 @@ local function clear(bufnr)
|
||||
end
|
||||
end
|
||||
api.nvim_buf_clear_namespace(bufnr, namespace, 0, -1)
|
||||
api.nvim__redraw({ buf = bufnr, valid = true })
|
||||
api.nvim__redraw({ buf = bufnr, valid = true, flush = false })
|
||||
end
|
||||
|
||||
--- Disable inlay hints for a buffer
|
||||
|
@@ -219,8 +219,8 @@ end
|
||||
---@package
|
||||
---@param changes Range6[]
|
||||
function TSHighlighter:on_changedtree(changes)
|
||||
for i, ch in ipairs(changes) do
|
||||
api.nvim__redraw({ buf = self.bufnr, range = { ch[1], ch[4] + 1 }, flush = i == #changes })
|
||||
for _, ch in ipairs(changes) do
|
||||
api.nvim__redraw({ buf = self.bufnr, range = { ch[1], ch[4] + 1 }, flush = false })
|
||||
end
|
||||
end
|
||||
|
||||
|
@@ -2396,9 +2396,16 @@ void nvim__redraw(Dict(redraw) *opts, Error *err)
|
||||
last = rbuf->b_ml.ml_line_count;
|
||||
}
|
||||
redraw_buf_range_later(rbuf, first, last);
|
||||
}
|
||||
|
||||
// Redraw later types require update_screen() so call implicitly unless set to false.
|
||||
if (HAS_KEY(opts, redraw, valid) || HAS_KEY(opts, redraw, range)) {
|
||||
opts->flush = HAS_KEY(opts, redraw, flush) ? opts->flush : true;
|
||||
}
|
||||
|
||||
// When explicitly set to false and only "redraw later" types are present,
|
||||
// don't call ui_flush() either.
|
||||
bool flush_ui = opts->flush;
|
||||
if (opts->tabline) {
|
||||
// Flush later in case tabline was just hidden or shown for the first time.
|
||||
if (redraw_tabline && firstwin->w_lines_valid == 0) {
|
||||
@@ -2406,6 +2413,7 @@ void nvim__redraw(Dict(redraw) *opts, Error *err)
|
||||
} else {
|
||||
draw_tabline();
|
||||
}
|
||||
flush_ui = true;
|
||||
}
|
||||
|
||||
bool save_lz = p_lz;
|
||||
@@ -2422,6 +2430,7 @@ void nvim__redraw(Dict(redraw) *opts, Error *err)
|
||||
} else {
|
||||
redraw_status(win, opts, &opts->flush);
|
||||
}
|
||||
flush_ui = true;
|
||||
}
|
||||
|
||||
win_T *cwin = win ? win : curwin;
|
||||
@@ -2438,9 +2447,12 @@ void nvim__redraw(Dict(redraw) *opts, Error *err)
|
||||
|
||||
if (opts->cursor) {
|
||||
setcursor_mayforce(cwin, true);
|
||||
flush_ui = true;
|
||||
}
|
||||
|
||||
ui_flush();
|
||||
if (flush_ui) {
|
||||
ui_flush();
|
||||
}
|
||||
|
||||
RedrawingDisabled = save_rd;
|
||||
p_lz = save_lz;
|
||||
|
Reference in New Issue
Block a user