summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-11-17 11:34:38 +0000
committerBram Moolenaar <Bram@vim.org>2022-11-17 11:34:38 +0000
commitf32fb93e431e4db95a8663d86dfeb6bffa5896f6 (patch)
tree0a87094dbced6a22a56f90e272662374a35f6ff7
parentfc1b2d0961ad963e6337c25efe082f4c526aca5e (diff)
patch 9.0.0892: may redraw when not neededv9.0.0892
Problem: May redraw when not needed, causing slow scrolling. Solution: Do not redraw when w_skipcol doesn't change. When w_skipcol changes only redraw from the top. (issue #11559)
-rw-r--r--src/ex_getln.c2
-rw-r--r--src/move.c42
-rw-r--r--src/testdir/Make_all.mak1
-rw-r--r--src/testdir/test_alot.vim1
-rw-r--r--src/version.c2
5 files changed, 29 insertions, 19 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c
index d3119baf25..72f2a3aabf 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -393,6 +393,7 @@ finish_incsearch_highlighting(
magic_overruled = is_state->magic_overruled_save;
validate_cursor(); // needed for TAB
+ status_redraw_all();
redraw_all_later(UPD_SOME_VALID);
if (call_update_screen)
update_screen(UPD_SOME_VALID);
@@ -559,6 +560,7 @@ may_do_incsearch_highlighting(
}
validate_cursor();
+
// May redraw the status line to show the cursor position.
if (p_ru && curwin->w_status_height > 0)
curwin->w_redr_status = TRUE;
diff --git a/src/move.c b/src/move.c
index e255bd68e3..3a5f806b5d 100644
--- a/src/move.c
+++ b/src/move.c
@@ -202,6 +202,23 @@ redraw_for_cursorcolumn(win_T *wp)
#endif
/*
+ * Set curwin->s_skipcol to zero and redraw later if needed.
+ */
+ static void
+reset_skipcol(void)
+{
+ if (curwin->w_skipcol != 0)
+ {
+ curwin->w_skipcol = 0;
+
+ // Should use the least expensive way that displays all that changed.
+ // UPD_NOT_VALID is too expensive, UPD_REDRAW_TOP does not redraw
+ // enough when the top line gets another screen line.
+ redraw_later(UPD_SOME_VALID);
+ }
+}
+
+/*
* Update curwin->w_topline and redraw if necessary.
* Used to update the screen before printing a message.
*/
@@ -458,13 +475,9 @@ update_topline(void)
)
{
dollar_vcol = -1;
- if (curwin->w_skipcol != 0)
- {
- curwin->w_skipcol = 0;
- redraw_later(UPD_NOT_VALID);
- }
- else
- redraw_later(UPD_VALID);
+ redraw_later(UPD_VALID);
+ reset_skipcol();
+
// May need to set w_skipcol when cursor in w_topline.
if (curwin->w_cursor.lnum == curwin->w_topline)
validate_cursor();
@@ -1319,7 +1332,7 @@ curs_columns(
else if (!curwin->w_p_sms)
curwin->w_skipcol = 0;
if (prev_skipcol != curwin->w_skipcol)
- redraw_later(UPD_NOT_VALID);
+ redraw_later(UPD_SOME_VALID);
#ifdef FEAT_SYN_HL
redraw_for_cursorcolumn(curwin);
@@ -1849,11 +1862,7 @@ adjust_skipcol(void)
if (curwin->w_cline_height == curwin->w_height)
{
// the line just fits in the window, don't scroll
- if (curwin->w_skipcol != 0)
- {
- curwin->w_skipcol = 0;
- redraw_later(UPD_NOT_VALID);
- }
+ reset_skipcol();
return;
}
@@ -2302,10 +2311,7 @@ scroll_cursor_top(int min_scroll, int always)
#endif
// TODO: if the line doesn't fit may optimize w_skipcol
if (curwin->w_topline == curwin->w_cursor.lnum)
- {
- curwin->w_skipcol = 0;
- redraw_later(UPD_NOT_VALID);
- }
+ reset_skipcol();
if (curwin->w_topline != old_topline
|| curwin->w_skipcol != old_skipcol
#ifdef FEAT_DIFF
@@ -2737,7 +2743,7 @@ cursor_correct(void)
if (curwin->w_cline_height == curwin->w_height)
{
// The cursor line just fits in the window, don't scroll.
- curwin->w_skipcol = 0;
+ reset_skipcol();
return;
}
// TODO: If the cursor line doesn't fit in the window then only adjust
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 04ccb4804e..1ac29b1b6a 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -484,6 +484,7 @@ NEW_TESTS_RES = \
test_retab.res \
test_ruby.res \
test_scriptnames.res \
+ test_scroll_opt.res \
test_scrollbind.res \
test_search.res \
test_search_stat.res \
diff --git a/src/testdir/test_alot.vim b/src/testdir/test_alot.vim
index b7b7eadb31..592ca65672 100644
--- a/src/testdir/test_alot.vim
+++ b/src/testdir/test_alot.vim
@@ -19,7 +19,6 @@ source test_global.vim
source test_move.vim
source test_put.vim
source test_reltime.vim
-source test_scroll_opt.vim
source test_searchpos.vim
source test_set.vim
source test_shift.vim
diff --git a/src/version.c b/src/version.c
index 0423d0d643..b526652de3 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 892,
+/**/
891,
/**/
890,