summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-11-18 14:07:20 +0000
committerBram Moolenaar <Bram@vim.org>2022-11-18 14:07:20 +0000
commit0c34d562647f029faca40f7733ccfb7b5377672b (patch)
treee9487c56c78625dc5047d67607caea7e3f6189d0
parent81ba26e9de24ca6b1c05b6ec03e53b21793f1a4b (diff)
downloadvim-git-9.0.0901.tar.gz
patch 9.0.0901: setting w_leftcol and handling side effects is confusingv9.0.0901
Problem: Setting w_leftcol and handling side effects is confusing. Solution: Use a function to set w_leftcol() and handle side effects.
-rw-r--r--src/misc2.c31
-rw-r--r--src/mouse.c6
-rw-r--r--src/normal.c28
-rw-r--r--src/proto/misc2.pro2
-rw-r--r--src/version.c2
5 files changed, 29 insertions, 40 deletions
diff --git a/src/misc2.c b/src/misc2.c
index d16fb46b6..30674142c 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -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)
{
diff --git a/src/mouse.c b/src/mouse.c
index 5ebf125dc..8348ba195 100644
--- a/src/mouse.c
+++ b/src/mouse.c
@@ -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)
{
diff --git a/src/normal.c b/src/normal.c
index 79f168617..5000f53e5 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -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
diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro
index 3d3a5a604..f596ffafa 100644
--- a/src/proto/misc2.pro
+++ b/src/proto/misc2.pro
@@ -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);
diff --git a/src/version.c b/src/version.c
index fdcd5ba6d..fc4df4854 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 */
/**/
+ 901,
+/**/
900,
/**/
899,