softwrap: iterate through softwrapped chunks in adjust_viewport()

Use go_back_chunks() to adjust edittop, instead of special casing
the computation of goal when softwrapping.  Now softwrap mode and
non-softwrap mode will behave the same way when edittop can be
partially scrolled off the screen, which is forthcoming.

(Note that the top line of the screen can't be partially scrolled
yet, so we have to work around that for now.)
master
David Lawrence Ramsey 2017-01-19 19:24:51 -06:00 committed by Benno Schulenberg
parent ba4858de83
commit 2abf7b755b
1 changed files with 11 additions and 15 deletions

View File

@ -3072,6 +3072,10 @@ void adjust_viewport(update_type manner)
{ {
int goal = 0; int goal = 0;
/* FIXME: This should be replaced with openfile->firstcolumn when the
* latter is added. */
size_t firstcolumn = 0;
/* If manner is CENTERING, move edittop half the number of window rows /* If manner is CENTERING, move edittop half the number of window rows
* back from current. If manner is FLOWING, move edittop back 0 rows * back from current. If manner is FLOWING, move edittop back 0 rows
* or (editwinrows - 1) rows, depending on where current has moved. * or (editwinrows - 1) rows, depending on where current has moved.
@ -3083,13 +3087,8 @@ void adjust_viewport(update_type manner)
if (manner == CENTERING) if (manner == CENTERING)
goal = editwinrows / 2; goal = editwinrows / 2;
else if (manner == FLOWING) { else if (manner == FLOWING) {
if (!current_is_above_screen()) { if (!current_is_above_screen())
goal = editwinrows - 1; goal = editwinrows - 1;
#ifndef NANO_TINY
if (ISSET(SOFTWRAP))
goal -= strlenpt(openfile->current->data) / editwincols;
#endif
}
} else { } else {
goal = openfile->current_y; goal = openfile->current_y;
@ -3100,17 +3099,14 @@ void adjust_viewport(update_type manner)
openfile->edittop = openfile->current; openfile->edittop = openfile->current;
while (goal > 0 && openfile->edittop->prev != NULL) {
openfile->edittop = openfile->edittop->prev;
goal--;
#ifndef NANO_TINY #ifndef NANO_TINY
if (ISSET(SOFTWRAP)) { if (ISSET(SOFTWRAP))
goal -= strlenpt(openfile->edittop->data) / editwincols; firstcolumn = (xplustabs() / editwincols) * editwincols;
if (goal < 0)
openfile->edittop = openfile->edittop->next;
}
#endif #endif
}
/* Move edittop back goal rows, starting at current[current_x]. */
go_back_chunks(goal, &openfile->edittop, &firstcolumn);
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "adjust_viewport(): setting edittop to lineno %ld\n", (long)openfile->edittop->lineno); fprintf(stderr, "adjust_viewport(): setting edittop to lineno %ld\n", (long)openfile->edittop->lineno);
#endif #endif