]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.0901: setting w_leftcol and handling side effects is confusing v9.0.0901
authorBram Moolenaar <Bram@vim.org>
Fri, 18 Nov 2022 14:07:20 +0000 (14:07 +0000)
committerBram Moolenaar <Bram@vim.org>
Fri, 18 Nov 2022 14:07:20 +0000 (14:07 +0000)
Problem:    Setting w_leftcol and handling side effects is confusing.
Solution:   Use a function to set w_leftcol() and handle side effects.

src/misc2.c
src/mouse.c
src/normal.c
src/proto/misc2.pro
src/version.c

index d16fb46b6fbf94e18179fc006b0ccd65a11785d1..30674142c008cea12f0f8f04b9103eb51af2f6a1 100644 (file)
@@ -673,25 +673,27 @@ adjust_cursor_col(void)
 }
 
 /*
- * When curwin->w_leftcol has changed, adjust the cursor position.
+ * Set "curwin->w_leftcol" to "leftcol".
+ * Adjust the cursor position if needed.
  * Return TRUE if the cursor was moved.
  */
     int
-leftcol_changed(void)
+set_leftcol(colnr_T leftcol)
 {
-    long       lastcol;
-    colnr_T    s, e;
     int                retval = FALSE;
-    long       siso = get_sidescrolloff_value();
+
+    // Return quickly when there is no change.
+    if (curwin->w_leftcol == leftcol)
+       return FALSE;
+    curwin->w_leftcol = leftcol;
 
     changed_cline_bef_curs();
-    lastcol = curwin->w_leftcol + curwin->w_width - curwin_col_off() - 1;
+    long lastcol = curwin->w_leftcol + curwin->w_width - curwin_col_off() - 1;
     validate_virtcol();
 
-    /*
-     * If the cursor is right or left of the screen, move it to last or first
-     * character.
-     */
+    // If the cursor is right or left of the screen, move it to last or first
+    // visible character.
+    long siso = get_sidescrolloff_value();
     if (curwin->w_virtcol > (colnr_T)(lastcol - siso))
     {
        retval = TRUE;
@@ -703,11 +705,10 @@ leftcol_changed(void)
        (void)coladvance((colnr_T)(curwin->w_leftcol + siso));
     }
 
-    /*
-     * If the start of the character under the cursor is not on the screen,
-     * advance the cursor one more char.  If this fails (last char of the
-     * line) adjust the scrolling.
-     */
+    // If the start of the character under the cursor is not on the screen,
+    // advance the cursor one more char.  If this fails (last char of the
+    // line) adjust the scrolling.
+    colnr_T    s, e;
     getvvcol(curwin, &curwin->w_cursor, &s, NULL, &e);
     if (e > (colnr_T)lastcol)
     {
index 5ebf125dcfe3437a1c26b90e6db755c8d672a0ad..8348ba19599f3e656140c543ac181540347a09bf 100644 (file)
@@ -2035,8 +2035,6 @@ do_mousescroll_horiz(long_u leftcol)
     if (curwin->w_leftcol == (colnr_T)leftcol)
        return FALSE;  // already there
 
-    curwin->w_leftcol = (colnr_T)leftcol;
-
     // When the line of the cursor is too short, move the cursor to the
     // longest visible line.
     if (
@@ -2050,7 +2048,7 @@ do_mousescroll_horiz(long_u leftcol)
        curwin->w_cursor.col = 0;
     }
 
-    return leftcol_changed();
+    return set_leftcol((colnr_T)leftcol);
 }
 
 /*
@@ -2098,7 +2096,7 @@ do_mousescroll(int mode, cmdarg_T *cap)
        send_keys_to_term(curbuf->b_term, cap->cmdchar, mod_mask, FALSE);
     else
 # endif
-    // For insert mode, don't scroll the window in which completion is being
+    // For Insert mode, don't scroll the window in which completion is being
     // done.
     if (mode == MODE_NORMAL || !pum_visible() || curwin != old_curwin)
     {
index 79f168617290a3c6112b338612696e1f1933b2d9..5000f53e5d05a1fcfd131d8ad4fa88bcc273c1c1 100644 (file)
@@ -1930,11 +1930,8 @@ check_scrollbind(linenr_T topline_diff, long leftcol_diff)
        }
 
        // do the horizontal scroll
-       if (want_hor && curwin->w_leftcol != tgt_leftcol)
-       {
-           curwin->w_leftcol = tgt_leftcol;
-           leftcol_changed();
-       }
+       if (want_hor)
+           (void)set_leftcol(tgt_leftcol);
     }
 
     // reset current-window
@@ -2458,7 +2455,7 @@ scroll_redraw(int up, long count)
        scrollup(count, TRUE);
     else
        scrolldown(count, TRUE);
-    if (get_scrolloff_value())
+    if (get_scrolloff_value() > 0)
     {
        // Adjust the cursor position for 'scrolloff'.  Mark w_topline as
        // valid, otherwise the screen jumps back at the end of the file.
@@ -2734,28 +2731,19 @@ nv_zet(cmdarg_T *cap)
     case 'h':
     case K_LEFT:
                if (!curwin->w_p_wrap)
-               {
-                   if ((colnr_T)cap->count1 > curwin->w_leftcol)
-                       curwin->w_leftcol = 0;
-                   else
-                       curwin->w_leftcol -= (colnr_T)cap->count1;
-                   leftcol_changed();
-               }
+                   (void)set_leftcol((colnr_T)cap->count1 > curwin->w_leftcol
+                              ? 0 : curwin->w_leftcol - (colnr_T)cap->count1);
                break;
 
-               // "zL" - scroll screen left half-page
+               // "zL" - scroll window left half-page
     case 'L':  cap->count1 *= curwin->w_width / 2;
                // FALLTHROUGH
 
-               // "zl" - scroll screen to the left
+               // "zl" - scroll window to the left if not wrapping
     case 'l':
     case K_RIGHT:
                if (!curwin->w_p_wrap)
-               {
-                   // scroll the window left
-                   curwin->w_leftcol += (colnr_T)cap->count1;
-                   leftcol_changed();
-               }
+                   (void)set_leftcol(curwin->w_leftcol + (colnr_T)cap->count1);
                break;
 
                // "zs" - scroll screen, cursor at the start
index 3d3a5a604a95f3330c5ad37ce874a53b1f4c28f6..f596ffafaf70bc988c59d3e51dd962e7dea08381 100644 (file)
@@ -19,7 +19,7 @@ void check_cursor_col_win(win_T *win);
 void check_cursor(void);
 void check_visual_pos(void);
 void adjust_cursor_col(void);
-int leftcol_changed(void);
+int set_leftcol(colnr_T leftcol);
 int copy_option_part(char_u **option, char_u *buf, int maxlen, char *sep_chars);
 int vim_isspace(int x);
 int simplify_key(int key, int *modifiers);
index fdcd5ba6d28d97191371f352ae2ddaa98e610502..fc4df48540336e3a36d5109a4a12ca43b671d653 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    901,
 /**/
     900,
 /**/