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>
diff --git a/src/move.c b/src/move.c
index 96692ba..2ba02cf 100644
--- a/src/move.c
+++ b/src/move.c
@@ -36,29 +36,19 @@
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 @@
#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 @@
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 @@
#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 @@
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