commit 2d50c4f257e4caf8367916c2390f0bdb80204a8d
parent 6a9e2a4d3ea26b141484909a94359c1a5353b416
Author: Benno Schulenberg <bensberg@justemail.net>
Date: Fri, 15 Apr 2016 14:39:54 +0200
softwrap: adjust for current_x when computing the amount to scroll
The number of lines to scroll is: the y position of the start of the
current line, plus the extra lines that this line occupies, plus the
extra lines that the next line occupies, plus one, minus the y position
of the last window line.
The y position of the start of the current line is current_y -
xplustabs() / COLS, the extra lines are strlenpt(data) / COLS,
and the y position of the last window line is editwinrows - 1.
Note that we first compute the amount to scroll before actually moving
to the next line, because we need the current value of current_x, not
the one that it will have in the next line. The placewewant value is
not good either, because it might be beyond where we actually are.
This fixes https://savannah.gnu.org/bugs/?47665.
Diffstat:
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/src/move.c b/src/move.c
@@ -451,16 +451,12 @@ void do_down(
openfile->current->lineno - openfile->edittop->lineno);
assert(openfile->current->next != NULL);
- /* Move the current line of the edit window down. */
- openfile->current = openfile->current->next;
- openfile->current_x = actual_x(openfile->current->data,
- openfile->placewewant);
-
#ifndef NANO_TINY
if (ISSET(SOFTWRAP)) {
- /* Compute the amount to scroll. */
- amount = (strlenpt(openfile->current->data) / COLS + openfile->current_y + 2
- + strlenpt(openfile->current->prev->data) / COLS - editwinrows);
+ /* Compute the number of lines to scroll. */
+ amount = strlenpt(openfile->current->data) / COLS - xplustabs() / COLS +
+ strlenpt(openfile->current->next->data) / COLS +
+ openfile->current_y - editwinrows + 2;
topline = openfile->edittop;
/* Reduce the amount when there are overlong lines at the top. */
for (enough = 1; enough < amount; enough++) {
@@ -474,6 +470,11 @@ void do_down(
}
#endif
+ /* Move to the next line in the file. */
+ openfile->current = openfile->current->next;
+ openfile->current_x = actual_x(openfile->current->data,
+ openfile->placewewant);
+
/* If scroll_only is FALSE and if we're on the last line of the
* edit window, scroll the edit window down one line if we're in
* smooth scrolling mode, or down half a page if we're not. If