patch 9.0.1747: screenpos() may cause unnecessary redraw

Commit: 
https://github.com/vim/vim/commit/6235a109c48ff2559eca3b16578c429ffb61eadc
Author: zeertzjq <zeert...@outlook.com>
Date:   Sat Aug 19 14:12:42 2023 +0200

    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 <c...@256bit.org>
    Co-authored-by: zeertzjq <zeert...@outlook.com>

diff --git a/src/drawscreen.c b/src/drawscreen.c
index 90e1984e9..a2f60a64f 100644
--- a/src/drawscreen.c
+++ b/src/drawscreen.c
@@ -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;
diff --git a/src/move.c b/src/move.c
index 96692ba7d..2ba02cf5d 100644
--- a/src/move.c
+++ b/src/move.c
@@ -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
diff --git a/src/proto/move.pro b/src/proto/move.pro
index 75f15444d..b96b86d0f 100644
--- a/src/proto/move.pro
+++ b/src/proto/move.pro
@@ -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);
diff --git a/src/version.c b/src/version.c
index 8f0db9824..3bea7ac6b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1747,
 /**/
     1746,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1qXL5e-0090if-UX%40256bit.org.

Raspunde prin e-mail lui