patch 9.0.1747: screenpos() may cause unnecessary redraw

Problem:  screenpos() may cause unnecessary redraw.
Solution: Don't unnecessarily reset VALID_WROW flag.

VALID_WROW flag is only used by two functions: validate_cursor() and
cursor_valid(), and cursor_valid() is only used once in ex_sleep().
When adjust_plines_for_skipcol() was first added in patch 9.0.0640, it
was called in two functions: comp_botline() and curs_rows().
- comp_botline() is called in two places:
  - onepage(), which resets VALID_WROW flag immediately afterwards.
  - validate_botline_win(), where resetting a VALID_ flag is strange.
- curs_rows() is called in two places:
  - curs_columns(), which sets VALID_WROW flag afterwards.
  - validate_cline_row(), which is only used by GUI mouse focus.

Therefore resetting VALID_WROW there doesn't seem to do anything useful.
Also, a w_skipcol check (which resets VALID_WROW flag) was added to
check_cursor_moved() in patch 9.0.0734, which seems to make more sense
than resetting that flag in the middle of a computation.

While at it make adjust_plines_for_skipcol() and textpos2screenpos() a
bit less confusing:
- Make adjust_plines_for_skipcol() return "off" instead of "n - off".
- Use 0-based "row" in textpos2screenpos() until W_WINROW is added.

closes: #12832

Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
This commit is contained in:
zeertzjq
2023-08-19 14:12:42 +02:00
committed by Christian Brabandt
parent 28ae5a32fd
commit 6235a109c4
4 changed files with 16 additions and 24 deletions

View File

@ -2343,7 +2343,7 @@ win_update(win_T *wp)
{
int n = plines_win_nofill(wp, l, FALSE)
+ wp->w_topfill;
n = adjust_plines_for_skipcol(wp, n);
n -= adjust_plines_for_skipcol(wp);
if (n > wp->w_height)
n = wp->w_height;
new_rows += n;

View File

@ -36,29 +36,19 @@ static void topline_back(lineoff_T *lp);
static void botline_forw(lineoff_T *lp);
/*
* Reduce "n" for the screen lines skipped with "wp->w_skipcol".
* Get the number of screen lines skipped with "wp->w_skipcol".
*/
int
adjust_plines_for_skipcol(win_T *wp, int n)
adjust_plines_for_skipcol(win_T *wp)
{
if (wp->w_skipcol == 0)
return n;
return 0;
int off = 0;
int width = wp->w_width - win_col_off(wp);
if (wp->w_skipcol >= width)
{
++off;
int skip = wp->w_skipcol - width;
width += win_col_off2(wp);
while (skip >= width)
{
++off;
skip -= width;
}
}
wp->w_valid &= ~VALID_WROW;
return n - off;
return (wp->w_skipcol - width) / (width + win_col_off2(wp)) + 1;
return 0;
}
/*
@ -77,7 +67,7 @@ plines_correct_topline(win_T *wp, linenr_T lnum)
#endif
n = plines_win(wp, lnum, FALSE);
if (lnum == wp->w_topline)
n = adjust_plines_for_skipcol(wp, n);
n -= adjust_plines_for_skipcol(wp);
if (n > wp->w_height)
n = wp->w_height;
return n;
@ -1458,10 +1448,10 @@ textpos2screenpos(
is_folded = hasFoldingWin(wp, lnum, &lnum, NULL, TRUE, NULL);
#endif
row = plines_m_win(wp, wp->w_topline, lnum - 1, FALSE) + 1;
row = plines_m_win(wp, wp->w_topline, lnum - 1, FALSE);
// "row" should be the screen line where line "lnum" begins, which can
// be negative if "lnum" is "w_topline" and "w_skipcol" is non-zero.
row = adjust_plines_for_skipcol(wp, row);
row -= adjust_plines_for_skipcol(wp);
#ifdef FEAT_DIFF
// Add filler lines above this buffer line.
@ -1473,7 +1463,7 @@ textpos2screenpos(
#ifdef FEAT_FOLDING
if (is_folded)
{
row += W_WINROW(wp);
row += W_WINROW(wp) + 1;
coloff = wp->w_wincol + 1 + off;
}
else
@ -1499,10 +1489,10 @@ textpos2screenpos(
col -= wp->w_leftcol;
if (col >= wp->w_width)
col = -1;
if (col >= 0 && row > 0 && row <= wp->w_height)
if (col >= 0 && row >= 0 && row < wp->w_height)
{
coloff = col - scol + wp->w_wincol + 1;
row += W_WINROW(wp);
row += W_WINROW(wp) + 1;
}
else
// character is out of the window

View File

@ -1,5 +1,5 @@
/* move.c */
int adjust_plines_for_skipcol(win_T *wp, int n);
int adjust_plines_for_skipcol(win_T *wp);
void redraw_for_cursorline(win_T *wp);
int sms_marker_overlap(win_T *wp, int extra2);
void update_topline_redraw(void);

View File

@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1747,
/**/
1746,
/**/