aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/cursor.c23
-rw-r--r--src/nvim/mouse.c4
-rw-r--r--src/nvim/normal.c23
3 files changed, 23 insertions, 27 deletions
diff --git a/src/nvim/cursor.c b/src/nvim/cursor.c
index cdadc89e31..8ba0b2ffb3 100644
--- a/src/nvim/cursor.c
+++ b/src/nvim/cursor.c
@@ -439,23 +439,27 @@ void 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.
-bool leftcol_changed(void)
+bool set_leftcol(colnr_T leftcol)
{
- // TODO(hinidu): I think it should be colnr_T or int, but p_siso is long.
- // Perhaps we can change p_siso to int.
- int64_t lastcol;
- colnr_T s, e;
- bool retval = false;
+ // 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_inner - curwin_col_off() - 1;
+ // TODO(hinidu): I think it should be colnr_T or int, but p_siso is long.
+ // Perhaps we can change p_siso to int.
+ int64_t lastcol = curwin->w_leftcol + curwin->w_width_inner - curwin_col_off() - 1;
validate_virtcol();
+ bool retval = false;
// If the cursor is right or left of the screen, move it to last or first
- // character.
+ // visible character.
long siso = get_sidescrolloff_value(curwin);
if (curwin->w_virtcol > (colnr_T)(lastcol - siso)) {
retval = true;
@@ -468,6 +472,7 @@ bool leftcol_changed(void)
// 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) {
retval = true;
diff --git a/src/nvim/mouse.c b/src/nvim/mouse.c
index 09352b370e..ead8dc2195 100644
--- a/src/nvim/mouse.c
+++ b/src/nvim/mouse.c
@@ -1648,8 +1648,6 @@ bool mouse_scroll_horiz(int dir)
return false;
}
- curwin->w_leftcol = (colnr_T)leftcol;
-
// When the line of the cursor is too short, move the cursor to the
// longest visible line.
if (!virtual_active()
@@ -1658,7 +1656,7 @@ bool mouse_scroll_horiz(int dir)
curwin->w_cursor.col = 0;
}
- return leftcol_changed();
+ return set_leftcol(leftcol);
}
/// Adjusts the clicked column position when 'conceallevel' > 0
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index 9792f5950e..e39a5e1ab7 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -2158,9 +2158,8 @@ void 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);
}
}
@@ -2643,7 +2642,7 @@ void scroll_redraw(int up, long count)
scrollup(count, true) :
scrolldown(count, true);
- if (get_scrolloff_value(curwin)) {
+ if (get_scrolloff_value(curwin) > 0) {
// Adjust the cursor position for 'scrolloff'. Mark w_topline as
// valid, otherwise the screen jumps back at the end of the file.
cursor_correct();
@@ -2894,27 +2893,21 @@ static void 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_inner / 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;