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:
luukvbaal
2024-11-18 15:35:21 +01:00
committed by GitHub
parent 1763eddede
commit 40347f6e27
3 changed files with 18 additions and 6 deletions

View File

@@ -65,7 +65,7 @@ function M.on_inlayhint(err, result, ctx)
if num_unprocessed == 0 then if num_unprocessed == 0 then
client_hints[client_id] = {} client_hints[client_id] = {}
bufstate.version = ctx.version bufstate.version = ctx.version
api.nvim__redraw({ buf = bufnr, valid = true }) api.nvim__redraw({ buf = bufnr, valid = true, flush = false })
return return
end end
@@ -81,7 +81,7 @@ function M.on_inlayhint(err, result, ctx)
client_hints[client_id] = new_lnum_hints client_hints[client_id] = new_lnum_hints
bufstate.version = ctx.version bufstate.version = ctx.version
api.nvim__redraw({ buf = bufnr, valid = true }) api.nvim__redraw({ buf = bufnr, valid = true, flush = false })
end end
--- |lsp-handler| for the method `workspace/inlayHint/refresh` --- |lsp-handler| for the method `workspace/inlayHint/refresh`
@@ -215,7 +215,7 @@ local function clear(bufnr)
end end
end end
api.nvim_buf_clear_namespace(bufnr, namespace, 0, -1) 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 end
--- Disable inlay hints for a buffer --- Disable inlay hints for a buffer

View File

@@ -219,8 +219,8 @@ end
---@package ---@package
---@param changes Range6[] ---@param changes Range6[]
function TSHighlighter:on_changedtree(changes) function TSHighlighter:on_changedtree(changes)
for i, ch in ipairs(changes) do for _, ch in ipairs(changes) do
api.nvim__redraw({ buf = self.bufnr, range = { ch[1], ch[4] + 1 }, flush = i == #changes }) api.nvim__redraw({ buf = self.bufnr, range = { ch[1], ch[4] + 1 }, flush = false })
end end
end end

View File

@@ -2396,9 +2396,16 @@ void nvim__redraw(Dict(redraw) *opts, Error *err)
last = rbuf->b_ml.ml_line_count; last = rbuf->b_ml.ml_line_count;
} }
redraw_buf_range_later(rbuf, first, last); 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; 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) { if (opts->tabline) {
// Flush later in case tabline was just hidden or shown for the first time. // Flush later in case tabline was just hidden or shown for the first time.
if (redraw_tabline && firstwin->w_lines_valid == 0) { if (redraw_tabline && firstwin->w_lines_valid == 0) {
@@ -2406,6 +2413,7 @@ void nvim__redraw(Dict(redraw) *opts, Error *err)
} else { } else {
draw_tabline(); draw_tabline();
} }
flush_ui = true;
} }
bool save_lz = p_lz; bool save_lz = p_lz;
@@ -2422,6 +2430,7 @@ void nvim__redraw(Dict(redraw) *opts, Error *err)
} else { } else {
redraw_status(win, opts, &opts->flush); redraw_status(win, opts, &opts->flush);
} }
flush_ui = true;
} }
win_T *cwin = win ? win : curwin; win_T *cwin = win ? win : curwin;
@@ -2438,9 +2447,12 @@ void nvim__redraw(Dict(redraw) *opts, Error *err)
if (opts->cursor) { if (opts->cursor) {
setcursor_mayforce(cwin, true); setcursor_mayforce(cwin, true);
flush_ui = true;
} }
if (flush_ui) {
ui_flush(); ui_flush();
}
RedrawingDisabled = save_rd; RedrawingDisabled = save_rd;
p_lz = save_lz; p_lz = save_lz;