aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2019-01-10 23:34:13 +0100
committerBjörn Linse <bjorn.linse@gmail.com>2019-01-11 10:55:43 +0100
commit889f73e8618458ed46050e26cac0dee30a19b4f4 (patch)
tree596385945c7a0050189d7f0f89880fdee5a4b8a7 /src
parent3f10c5b5338fc7efec53a23427e1c0e2dea56be4 (diff)
downloadrneovim-889f73e8618458ed46050e26cac0dee30a19b4f4.tar.gz
rneovim-889f73e8618458ed46050e26cac0dee30a19b4f4.tar.bz2
rneovim-889f73e8618458ed46050e26cac0dee30a19b4f4.zip
screen: make update_screen() the only entry point for redrawing
update_single_line() was only used for 'concealcursor'. But 'cursorline' has very similiar characteristics (redraw both lines on move cursor between lines) and works without its own special entry point to the redraw subsystem. Later on 'concealcursor' and 'cursorline' could share more logic, but for now make the former use standard redrawWinline(). Make sure it is called before update_screen(), so that it is immediately visible. Get rid of update_prepare() and update_finish(), and all issues from them and their callsites not being in sync with changes to update_screen()
Diffstat (limited to 'src')
-rw-r--r--src/nvim/edit.c21
-rw-r--r--src/nvim/normal.c37
-rw-r--r--src/nvim/screen.c52
-rw-r--r--src/nvim/window.c12
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;
+ }
}