mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +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
 | 
					  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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user