mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	Merge pull request #22590 from bfredl/status2
refactor(redraw): make cursor position use the "redraw later" pattern
This commit is contained in:
		@@ -728,19 +728,15 @@ static void win_redr_border(win_T *wp)
 | 
				
			|||||||
/// Show current cursor info in ruler and various other places
 | 
					/// Show current cursor info in ruler and various other places
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
/// @param always  if false, only show ruler if position has changed.
 | 
					/// @param always  if false, only show ruler if position has changed.
 | 
				
			||||||
void show_cursor_info(bool always)
 | 
					void show_cursor_info_later(bool force)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (!always && !redrawing()) {
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int state = get_real_state();
 | 
					  int state = get_real_state();
 | 
				
			||||||
  int empty_line = (State & MODE_INSERT) == 0
 | 
					  int empty_line = (State & MODE_INSERT) == 0
 | 
				
			||||||
                   && *ml_get_buf(curwin->w_buffer, curwin->w_cursor.lnum, false) == NUL;
 | 
					                   && *ml_get_buf(curwin->w_buffer, curwin->w_cursor.lnum, false) == NUL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Only draw when something changed.
 | 
					  // Only draw when something changed.
 | 
				
			||||||
  validate_virtcol_win(curwin);
 | 
					  validate_virtcol_win(curwin);
 | 
				
			||||||
  if (always
 | 
					  if (force
 | 
				
			||||||
      || curwin->w_cursor.lnum != curwin->w_stl_cursor.lnum
 | 
					      || curwin->w_cursor.lnum != curwin->w_stl_cursor.lnum
 | 
				
			||||||
      || curwin->w_cursor.col != curwin->w_stl_cursor.col
 | 
					      || curwin->w_cursor.col != curwin->w_stl_cursor.col
 | 
				
			||||||
      || curwin->w_virtcol != curwin->w_stl_virtcol
 | 
					      || curwin->w_virtcol != curwin->w_stl_virtcol
 | 
				
			||||||
@@ -750,27 +746,19 @@ void show_cursor_info(bool always)
 | 
				
			|||||||
      || curwin->w_topfill != curwin->w_stl_topfill
 | 
					      || curwin->w_topfill != curwin->w_stl_topfill
 | 
				
			||||||
      || empty_line != curwin->w_stl_empty
 | 
					      || empty_line != curwin->w_stl_empty
 | 
				
			||||||
      || state != curwin->w_stl_state) {
 | 
					      || state != curwin->w_stl_state) {
 | 
				
			||||||
    win_check_ns_hl(curwin);
 | 
					    if ((curwin->w_status_height || global_stl_height())) {
 | 
				
			||||||
    if ((*p_stl != NUL || *curwin->w_p_stl != NUL)
 | 
					      curwin->w_redr_status = true;
 | 
				
			||||||
        && (curwin->w_status_height || global_stl_height())) {
 | 
					 | 
				
			||||||
      redraw_custom_statusline(curwin);
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      win_redr_ruler(curwin);
 | 
					      redraw_cmdline = true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (*p_wbr != NUL || *curwin->w_p_wbr != NUL) {
 | 
					    if (*p_wbr != NUL || *curwin->w_p_wbr != NUL) {
 | 
				
			||||||
      win_redr_winbar(curwin);
 | 
					      curwin->w_redr_status = true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (need_maketitle
 | 
					    if ((p_icon && (stl_syntax & STL_IN_ICON))
 | 
				
			||||||
        || (p_icon && (stl_syntax & STL_IN_ICON))
 | 
					 | 
				
			||||||
        || (p_title && (stl_syntax & STL_IN_TITLE))) {
 | 
					        || (p_title && (stl_syntax & STL_IN_TITLE))) {
 | 
				
			||||||
      maketitle();
 | 
					      need_maketitle = true;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    win_check_ns_hl(NULL);
 | 
					 | 
				
			||||||
    // Redraw the tab pages line if needed.
 | 
					 | 
				
			||||||
    if (redraw_tabline) {
 | 
					 | 
				
			||||||
      draw_tabline();
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2136,7 +2124,7 @@ void status_redraw_all(void)
 | 
				
			|||||||
  bool is_stl_global = global_stl_height() != 0;
 | 
					  bool is_stl_global = global_stl_height() != 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
 | 
					  FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
 | 
				
			||||||
    if ((!is_stl_global && wp->w_status_height) || (is_stl_global && wp == curwin)
 | 
					    if ((!is_stl_global && wp->w_status_height) || wp == curwin
 | 
				
			||||||
        || wp->w_winbar_height) {
 | 
					        || wp->w_winbar_height) {
 | 
				
			||||||
      wp->w_redr_status = true;
 | 
					      wp->w_redr_status = true;
 | 
				
			||||||
      redraw_later(wp, UPD_VALID);
 | 
					      redraw_later(wp, UPD_VALID);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1350,12 +1350,15 @@ void ins_redraw(bool ready)
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pum_check_clear();
 | 
					  pum_check_clear();
 | 
				
			||||||
 | 
					  show_cursor_info_later(false);
 | 
				
			||||||
  if (must_redraw) {
 | 
					  if (must_redraw) {
 | 
				
			||||||
    update_screen();
 | 
					    update_screen();
 | 
				
			||||||
  } else if (clear_cmdline || redraw_cmdline) {
 | 
					  } else {
 | 
				
			||||||
    showmode();  // clear cmdline and show mode
 | 
					    redraw_statuslines();
 | 
				
			||||||
 | 
					    if (clear_cmdline || redraw_cmdline || redraw_mode) {
 | 
				
			||||||
 | 
					      showmode();  // clear cmdline and show mode
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  show_cursor_info(false);
 | 
					 | 
				
			||||||
  setcursor();
 | 
					  setcursor();
 | 
				
			||||||
  emsg_on_display = false;      // may remove error message now
 | 
					  emsg_on_display = false;      // may remove error message now
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3747,6 +3747,7 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T
 | 
				
			|||||||
              update_topline(curwin);
 | 
					              update_topline(curwin);
 | 
				
			||||||
              validate_cursor();
 | 
					              validate_cursor();
 | 
				
			||||||
              redraw_later(curwin, UPD_SOME_VALID);
 | 
					              redraw_later(curwin, UPD_SOME_VALID);
 | 
				
			||||||
 | 
					              show_cursor_info_later(true);
 | 
				
			||||||
              update_screen();
 | 
					              update_screen();
 | 
				
			||||||
              highlight_match = false;
 | 
					              highlight_match = false;
 | 
				
			||||||
              redraw_later(curwin, UPD_SOME_VALID);
 | 
					              redraw_later(curwin, UPD_SOME_VALID);
 | 
				
			||||||
@@ -3765,7 +3766,6 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T
 | 
				
			|||||||
                        _("replace with %s (y/n/a/q/l/^E/^Y)?"), sub);
 | 
					                        _("replace with %s (y/n/a/q/l/^E/^Y)?"), sub);
 | 
				
			||||||
              msg_no_more = false;
 | 
					              msg_no_more = false;
 | 
				
			||||||
              msg_scroll = (int)i;
 | 
					              msg_scroll = (int)i;
 | 
				
			||||||
              show_cursor_info(true);
 | 
					 | 
				
			||||||
              if (!ui_has(kUIMessages)) {
 | 
					              if (!ui_has(kUIMessages)) {
 | 
				
			||||||
                ui_cursor_goto(msg_row, msg_col);
 | 
					                ui_cursor_goto(msg_row, msg_col);
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1306,16 +1306,20 @@ static void normal_redraw(NormalState *s)
 | 
				
			|||||||
  update_topline(curwin);
 | 
					  update_topline(curwin);
 | 
				
			||||||
  validate_cursor();
 | 
					  validate_cursor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  show_cursor_info_later(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (VIsual_active) {
 | 
					  if (VIsual_active) {
 | 
				
			||||||
    redraw_curbuf_later(UPD_INVERTED);  // update inverted part
 | 
					    redraw_curbuf_later(UPD_INVERTED);  // update inverted part
 | 
				
			||||||
    update_screen();
 | 
					 | 
				
			||||||
  } else if (must_redraw) {
 | 
					 | 
				
			||||||
    update_screen();
 | 
					 | 
				
			||||||
  } else if (redraw_cmdline || clear_cmdline || redraw_mode) {
 | 
					 | 
				
			||||||
    showmode();
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  redraw_statuslines();
 | 
					  if (must_redraw) {
 | 
				
			||||||
 | 
					    update_screen();
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    redraw_statuslines();
 | 
				
			||||||
 | 
					    if (redraw_cmdline || clear_cmdline || redraw_mode) {
 | 
				
			||||||
 | 
					      showmode();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (need_maketitle) {
 | 
					  if (need_maketitle) {
 | 
				
			||||||
    maketitle();
 | 
					    maketitle();
 | 
				
			||||||
@@ -1348,7 +1352,6 @@ static void normal_redraw(NormalState *s)
 | 
				
			|||||||
  did_emsg = false;
 | 
					  did_emsg = false;
 | 
				
			||||||
  msg_didany = false;  // reset lines_left in msg_start()
 | 
					  msg_didany = false;  // reset lines_left in msg_start()
 | 
				
			||||||
  may_clear_sb_text();  // clear scroll-back text on next msg
 | 
					  may_clear_sb_text();  // clear scroll-back text on next msg
 | 
				
			||||||
  show_cursor_info(false);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  setcursor();
 | 
					  setcursor();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2255,9 +2255,6 @@ static char *set_bool_option(const int opt_idx, char *const varp, const int valu
 | 
				
			|||||||
  if ((int *)varp == &p_ru || (int *)varp == &p_sc) {
 | 
					  if ((int *)varp == &p_ru || (int *)varp == &p_sc) {
 | 
				
			||||||
    // in case 'ruler' or 'showcmd' changed
 | 
					    // in case 'ruler' or 'showcmd' changed
 | 
				
			||||||
    comp_col();
 | 
					    comp_col();
 | 
				
			||||||
    if ((int *)varp == &p_ru) {
 | 
					 | 
				
			||||||
      win_redr_ruler(curwin);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (curwin->w_curswant != MAXCOL
 | 
					  if (curwin->w_curswant != MAXCOL
 | 
				
			||||||
      && (options[opt_idx].flags & (P_CURSWANT | P_RALL)) != 0) {
 | 
					      && (options[opt_idx].flags & (P_CURSWANT | P_RALL)) != 0) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1221,7 +1221,6 @@ static void did_set_statusline(win_T *win, char **varp, char **gvarp, char **err
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
  if (varp == &p_ruf && *errmsg == NULL) {
 | 
					  if (varp == &p_ruf && *errmsg == NULL) {
 | 
				
			||||||
    comp_col();
 | 
					    comp_col();
 | 
				
			||||||
    win_redr_ruler(curwin);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  // add / remove window bars for 'winbar'
 | 
					  // add / remove window bars for 'winbar'
 | 
				
			||||||
  if (gvarp == &p_wbr) {
 | 
					  if (gvarp == &p_wbr) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2340,7 +2340,6 @@ void showmatch(int c)
 | 
				
			|||||||
    dollar_vcol = -1;
 | 
					    dollar_vcol = -1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  curwin->w_virtcol++;              // do display ')' just before "$"
 | 
					  curwin->w_virtcol++;              // do display ')' just before "$"
 | 
				
			||||||
  update_screen();                  // show the new char first
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  colnr_T save_dollar_vcol = dollar_vcol;
 | 
					  colnr_T save_dollar_vcol = dollar_vcol;
 | 
				
			||||||
  int save_state = State;
 | 
					  int save_state = State;
 | 
				
			||||||
@@ -2349,7 +2348,8 @@ void showmatch(int c)
 | 
				
			|||||||
  curwin->w_cursor = mpos;          // move to matching char
 | 
					  curwin->w_cursor = mpos;          // move to matching char
 | 
				
			||||||
  *so = 0;                          // don't use 'scrolloff' here
 | 
					  *so = 0;                          // don't use 'scrolloff' here
 | 
				
			||||||
  *siso = 0;                        // don't use 'sidescrolloff' here
 | 
					  *siso = 0;                        // don't use 'sidescrolloff' here
 | 
				
			||||||
  show_cursor_info(false);
 | 
					  show_cursor_info_later(false);
 | 
				
			||||||
 | 
					  update_screen();                  // show the new char
 | 
				
			||||||
  setcursor();
 | 
					  setcursor();
 | 
				
			||||||
  ui_flush();
 | 
					  ui_flush();
 | 
				
			||||||
  // Restore dollar_vcol(), because setcursor() may call curs_rows()
 | 
					  // Restore dollar_vcol(), because setcursor() may call curs_rows()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -152,7 +152,7 @@ describe('Screen', function()
 | 
				
			|||||||
      ~                   |
 | 
					      ~                   |
 | 
				
			||||||
      ~                   |
 | 
					      ~                   |
 | 
				
			||||||
      ~                   |
 | 
					      ~                   |
 | 
				
			||||||
      >                   |
 | 
					      -- INSERT --        |
 | 
				
			||||||
    ]])
 | 
					    ]])
 | 
				
			||||||
  end)
 | 
					  end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -474,8 +474,7 @@ describe('ui/ext_messages', function()
 | 
				
			|||||||
    ]], msg_history={{
 | 
					    ]], msg_history={{
 | 
				
			||||||
      content = {{ "stuff" }},
 | 
					      content = {{ "stuff" }},
 | 
				
			||||||
      kind = "echomsg",
 | 
					      kind = "echomsg",
 | 
				
			||||||
    }}, showmode={{ "-- INSERT --", 3 }},
 | 
					    }}, messages={{
 | 
				
			||||||
      messages={{
 | 
					 | 
				
			||||||
        content = {{ "Press ENTER or type command to continue", 4}},
 | 
					        content = {{ "Press ENTER or type command to continue", 4}},
 | 
				
			||||||
        kind = "return_prompt"
 | 
					        kind = "return_prompt"
 | 
				
			||||||
    }}}
 | 
					    }}}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user