diff options
-rw-r--r-- | src/nvim/edit.c | 21 | ||||
-rw-r--r-- | src/nvim/normal.c | 37 | ||||
-rw-r--r-- | src/nvim/screen.c | 52 | ||||
-rw-r--r-- | src/nvim/window.c | 12 |
4 files changed, 39 insertions, 83 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 50c28dbaad..5e559462bc 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -1452,21 +1452,24 @@ ins_redraw ( } } - if (must_redraw) - update_screen(0); - else if (clear_cmdline || redraw_cmdline) - showmode(); /* clear cmdline and show mode */ if ((conceal_update_lines && (conceal_old_cursor_line != conceal_new_cursor_line || conceal_cursor_line(curwin))) || need_cursor_line_redraw) { - if (conceal_old_cursor_line != conceal_new_cursor_line) - update_single_line(curwin, conceal_old_cursor_line); - update_single_line(curwin, conceal_new_cursor_line == 0 - ? curwin->w_cursor.lnum : conceal_new_cursor_line); + if (conceal_old_cursor_line != conceal_new_cursor_line) { + redrawWinline(curwin, conceal_old_cursor_line); + } + redrawWinline(curwin, conceal_new_cursor_line == 0 + ? curwin->w_cursor.lnum : conceal_new_cursor_line); curwin->w_valid &= ~VALID_CROW; } - showruler(FALSE); + + if (must_redraw) { + update_screen(0); + } else if (clear_cmdline || redraw_cmdline) { + showmode(); // clear cmdline and show mode + } + showruler(false); setcursor(); emsg_on_display = FALSE; /* may remove error message now */ } diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 29c5d27258..9b2543cb8f 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -1246,6 +1246,25 @@ static void normal_redraw(NormalState *s) update_topline(); validate_cursor(); + // TODO(bfredl): this logic is only used for 'concealcursor', not + // 'cursorline'. Maybe we can eliminate this check (and in edit.c) by + // checking for 'concealcursor' wherever we check for 'cursorline' + if (s->conceal_update_lines + && (s->conceal_old_cursor_line != + s->conceal_new_cursor_line + || conceal_cursor_line(curwin) + || need_cursor_line_redraw)) { + if (s->conceal_old_cursor_line != + s->conceal_new_cursor_line + && s->conceal_old_cursor_line <= + curbuf->b_ml.ml_line_count) { + redrawWinline(curwin, s->conceal_old_cursor_line); + } + + redrawWinline(curwin, s->conceal_new_cursor_line); + curwin->w_valid &= ~VALID_CROW; + } + if (VIsual_active) { update_curbuf(INVERTED); // update inverted part } else if (must_redraw) { @@ -1281,22 +1300,6 @@ static void normal_redraw(NormalState *s) may_clear_sb_text(); // clear scroll-back text on next msg showruler(false); - if (s->conceal_update_lines - && (s->conceal_old_cursor_line != - s->conceal_new_cursor_line - || conceal_cursor_line(curwin) - || need_cursor_line_redraw)) { - if (s->conceal_old_cursor_line != - s->conceal_new_cursor_line - && s->conceal_old_cursor_line <= - curbuf->b_ml.ml_line_count) { - update_single_line(curwin, s->conceal_old_cursor_line); - } - - update_single_line(curwin, s->conceal_new_cursor_line); - curwin->w_valid &= ~VALID_CROW; - } - setcursor(); } @@ -7089,7 +7092,7 @@ static void n_opencmd(cmdarg_T *cap) ? OPENLINE_DO_COM : 0, 0)) { if (curwin->w_p_cole > 0 && oldline != curwin->w_cursor.lnum) { - update_single_line(curwin, oldline); + redrawWinline(curwin, oldline); } if (curwin->w_p_cul) { // force redraw of cursorline diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 27d72ffbf7..485071d11c 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -482,25 +482,6 @@ void update_screen(int type) } -// Prepare for updating one or more windows. -// Caller must check for "updating_screen" already set to avoid recursiveness. -static void update_prepare(void) -{ - updating_screen = true; - start_search_hl(); -} - -// Finish updating one or more windows. -static void update_finish(void) -{ - if (redraw_cmdline) { - showmode(); - } - - end_search_hl(); - updating_screen = false; -} - /* * Return TRUE if the cursor line in window "wp" may be concealed, according * to the 'concealcursor' option. @@ -537,39 +518,6 @@ void conceal_check_cursor_line(void) } } -void update_single_line(win_T *wp, linenr_T lnum) -{ - int row; - int j; - - // Don't do anything if the screen structures are (not yet) valid. - if (linebuf_char == NULL || updating_screen) { - return; - } - - if (lnum >= wp->w_topline && lnum < wp->w_botline - && foldedCount(wp, lnum, &win_foldinfo) == 0) { - update_prepare(); - - row = 0; - for (j = 0; j < wp->w_lines_valid; ++j) { - if (lnum == wp->w_lines[j].wl_lnum) { - init_search_hl(wp); - prepare_search_hl(wp, lnum); - update_window_hl(wp, false); - // allocate window grid if not already - win_grid_alloc(wp); - win_line(wp, lnum, row, row + wp->w_lines[j].wl_size, false, false); - break; - } - row += wp->w_lines[j].wl_size; - } - - update_finish(); - } - need_cursor_line_redraw = false; -} - /* * Update a single window. diff --git a/src/nvim/window.c b/src/nvim/window.c index 97c708ed20..35ca5c61e8 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -3542,11 +3542,13 @@ void win_goto(win_T *wp) win_enter(wp, true); - /* Conceal cursor line in previous window, unconceal in current window. */ - if (win_valid(owp) && owp->w_p_cole > 0 && !msg_scrolled) - update_single_line(owp, owp->w_cursor.lnum); - if (curwin->w_p_cole > 0 && !msg_scrolled) - need_cursor_line_redraw = TRUE; + // Conceal cursor line in previous window, unconceal in current window. + if (win_valid(owp) && owp->w_p_cole > 0 && !msg_scrolled) { + redrawWinline(owp, owp->w_cursor.lnum); + } + if (curwin->w_p_cole > 0 && !msg_scrolled) { + need_cursor_line_redraw = true; + } } |