# HG changeset patch # User Bram Moolenaar # Date 1648405804 -7200 # Node ID c99005ffa8c38bbbbe9511d57ada3959f048702c # Parent 3832fda7305ad23f3b8efe331a6de7671a8160e1 patch 8.2.4638: superfluous check if a redraw is needed for 'cursorline' Commit: https://github.com/vim/vim/commit/3e559cd88486ffab6b6fb4e0921b4600d137a617 Author: zeertzjq Date: Sun Mar 27 19:26:55 2022 +0100 patch 8.2.4638: superfluous check if a redraw is needed for 'cursorline' Problem: Superfluous check if a redraw is needed for 'cursorline'. Solution: Remove check_redraw_cursorline(). (closes https://github.com/vim/vim/issues/10030, closes https://github.com/vim/vim/issues/10029) diff --git a/src/drawscreen.c b/src/drawscreen.c --- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -3032,23 +3032,6 @@ redraw_asap(int type) } #endif -#if defined(FEAT_SYN_HL) || defined(PROTO) -/* - * Check if the cursor moved and 'cursorline' is set. Mark for a VALID redraw - * if needed. - */ - void -check_redraw_cursorline(void) -{ - // When 'cursorlineopt' is "screenline" need to redraw always. - if (curwin->w_p_cul - && (curwin->w_last_cursorline != curwin->w_cursor.lnum - || (curwin->w_p_culopt_flags & CULOPT_SCRLINE)) - && !char_avail()) - redraw_later(VALID); -} -#endif - /* * Invoked after an asynchronous callback is called. * If an echo command was used the cursor needs to be put back where @@ -3093,10 +3076,9 @@ redraw_after_callback(int call_update_sc } else if (State & (NORMAL | INSERT | TERMINAL)) { -#ifdef FEAT_SYN_HL - // might need to update for 'cursorline' - check_redraw_cursorline(); -#endif + update_topline(); + validate_cursor(); + // keep the command line if possible update_screen(VALID_NO_UPDATE); setcursor(); diff --git a/src/edit.c b/src/edit.c --- a/src/edit.c +++ b/src/edit.c @@ -1058,10 +1058,6 @@ doESCkey: case K_COMMAND: // command case K_SCRIPT_COMMAND: // command do_cmdkey_command(c, 0); -#ifdef FEAT_SYN_HL - // Might need to update for 'cursorline'. - check_redraw_cursorline(); -#endif #ifdef FEAT_TERMINAL if (term_use_loop()) // Started a terminal that gets the input, exit Insert mode. diff --git a/src/main.c b/src/main.c --- a/src/main.c +++ b/src/main.c @@ -1384,10 +1384,6 @@ main_loop( update_topline(); validate_cursor(); -#ifdef FEAT_SYN_HL - // Might need to update for 'cursorline'. - check_redraw_cursorline(); -#endif if (VIsual_active) update_curbuf(INVERTED); // update inverted part else if (must_redraw) diff --git a/src/move.c b/src/move.c --- a/src/move.c +++ b/src/move.c @@ -135,6 +135,26 @@ redraw_for_cursorline(win_T *wp) } } +#ifdef FEAT_SYN_HL +/* + * Redraw when w_virtcol changes and 'cursorcolumn' is set or 'cursorlineopt' + * contains "screenline". + */ + static void +redraw_for_cursorcolumn(win_T *wp) +{ + if ((wp->w_valid & VALID_VIRTCOL) == 0 && !pum_visible()) + { + // When 'cursorcolumn' is set need to redraw with SOME_VALID. + if (wp->w_p_cuc) + redraw_later(SOME_VALID); + // When 'cursorlineopt' contains "screenline" need to redraw with VALID. + else if (wp->w_p_cul && (wp->w_p_culopt_flags & CULOPT_SCRLINE)) + redraw_later(VALID); + } +} +#endif + /* * Update curwin->w_topline and redraw if necessary. * Used to update the screen before printing a message. @@ -798,11 +818,10 @@ validate_virtcol_win(win_T *wp) if (!(wp->w_valid & VALID_VIRTCOL)) { getvvcol(wp, &wp->w_cursor, NULL, &(wp->w_virtcol), NULL); +#ifdef FEAT_SYN_HL + redraw_for_cursorcolumn(wp); +#endif wp->w_valid |= VALID_VIRTCOL; -#ifdef FEAT_SYN_HL - if (wp->w_p_cuc && !pum_visible()) - redraw_win_later(wp, SOME_VALID); -#endif } } @@ -1169,10 +1188,7 @@ curs_columns( redraw_later(NOT_VALID); #ifdef FEAT_SYN_HL - // Redraw when w_virtcol changes and 'cursorcolumn' is set - if (curwin->w_p_cuc && (curwin->w_valid & VALID_VIRTCOL) == 0 - && !pum_visible()) - redraw_later(SOME_VALID); + redraw_for_cursorcolumn(curwin); #endif #if defined(FEAT_PROP_POPUP) && defined(FEAT_TERMINAL) if (popup_is_popup(curwin) && curbuf->b_term != NULL) diff --git a/src/normal.c b/src/normal.c --- a/src/normal.c +++ b/src/normal.c @@ -6971,10 +6971,6 @@ nv_edit(cmdarg_T *cap) coladvance(getviscol()); State = save_State; } -#ifdef FEAT_SYN_HL - // Might need to update for 'cursorline'. - check_redraw_cursorline(); -#endif invoke_edit(cap, FALSE, cap->cmdchar, FALSE); } diff --git a/src/proto/drawscreen.pro b/src/proto/drawscreen.pro --- a/src/proto/drawscreen.pro +++ b/src/proto/drawscreen.pro @@ -8,7 +8,6 @@ void update_curbuf(int type); void update_debug_sign(buf_T *buf, linenr_T lnum); void updateWindow(win_T *wp); int redraw_asap(int type); -void check_redraw_cursorline(void); void redraw_after_callback(int call_update_screen, int do_message); void redraw_later(int type); void redraw_win_later(win_T *wp, int type); diff --git a/src/testdir/dumps/Test_cursorcolumn_callback_1.dump b/src/testdir/dumps/Test_cursorcolumn_callback_1.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_cursorcolumn_callback_1.dump @@ -0,0 +1,8 @@ +>a+0&#ffffff0@4| @69 +|b+0&#e0e0e08|b+0&#ffffff0@3| @69 +|c+0&#e0e0e08|c+0&#ffffff0@3| @69 +|d+0&#e0e0e08|d+0&#ffffff0@3| @69 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|4|,|5| @10|A|l@1| diff --git a/src/testdir/dumps/Test_relativenumber_callback_1.dump b/src/testdir/dumps/Test_relativenumber_callback_1.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_relativenumber_callback_1.dump @@ -0,0 +1,8 @@ +| +0#af5f00255#ffffff0@1|0| >a+0#0000000&@4| @65 +| +0#af5f00255&@1|1| |b+0#0000000&@4| @65 +| +0#af5f00255&@1|2| |c+0#0000000&@4| @65 +| +0#af5f00255&@1|3| |d+0#0000000&@4| @65 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|4|,|1| @10|A|l@1| diff --git a/src/testdir/test_highlight.vim b/src/testdir/test_highlight.vim --- a/src/testdir/test_highlight.vim +++ b/src/testdir/test_highlight.vim @@ -592,6 +592,31 @@ func Test_cursorline_with_visualmode() call delete('Xtest_cursorline_with_visualmode') endfunc +func Test_cursorcolumn_callback() + CheckScreendump + CheckFeature timers + + let lines =<< trim END + call setline(1, ['aaaaa', 'bbbbb', 'ccccc', 'ddddd']) + set cursorcolumn + call cursor(4, 5) + + func Func(timer) + call cursor(1, 1) + endfunc + + call timer_start(300, 'Func') + END + call writefile(lines, 'Xcuc_timer') + + let buf = RunVimInTerminal('-S Xcuc_timer', #{rows: 8}) + call TermWait(buf, 310) + call VerifyScreenDump(buf, 'Test_cursorcolumn_callback_1', {}) + + call StopVimInTerminal(buf) + call delete('Xcuc_timer') +endfunc + func Test_wincolor() CheckScreendump " make sure the width is enough for the test diff --git a/src/testdir/test_number.vim b/src/testdir/test_number.vim --- a/src/testdir/test_number.vim +++ b/src/testdir/test_number.vim @@ -298,6 +298,31 @@ func Test_relativenumber_colors() call delete('XTest_relnr') endfunc +func Test_relativenumber_callback() + CheckScreendump + CheckFeature timers + + let lines =<< trim END + call setline(1, ['aaaaa', 'bbbbb', 'ccccc', 'ddddd']) + set relativenumber + call cursor(4, 1) + + func Func(timer) + call cursor(1, 1) + endfunc + + call timer_start(300, 'Func') + END + call writefile(lines, 'Xrnu_timer') + + let buf = RunVimInTerminal('-S Xrnu_timer', #{rows: 8}) + call TermWait(buf, 310) + call VerifyScreenDump(buf, 'Test_relativenumber_callback_1', {}) + + call StopVimInTerminal(buf) + call delete('Xrnu_timer') +endfunc + " Test for displaying line numbers with 'rightleft' func Test_number_rightleft() CheckFeature rightleft diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4638, +/**/ 4637, /**/ 4636,