]> git.wh0rd.org Git - nano.git/commitdiff
Correctly computing the needed amount to scroll down
authorBenno Schulenberg <bensberg@justemail.net>
Mon, 3 Mar 2014 10:02:13 +0000 (10:02 +0000)
committerBenno Schulenberg <bensberg@justemail.net>
Mon, 3 Mar 2014 10:02:13 +0000 (10:02 +0000)
when softwrap is on and there are overlong lines.

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4632 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/move.c
src/winio.c

index d12d4e55d25bdf6345bb4ba12e069f3c89826550..58de6220bf487c1c99755475b95a85515da2aaca 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,9 @@
 2014-03-03  Benno Schulenberg  <bensberg@justemail.net>
        * src/global.c (add_to_funcs) - Add a newline, for clarity.
        * src/global.c (shortcut_init) - Mark, don't translate yet.
+       * src/move.c (do_down) - Correctly compute the minimum amount
+       to scroll when softwrap is on and there are overlong lines.
+       * src/winio.c (edit_scroll) - Disable amount computation here.
 
 2014-03-01 Chris Allegretta <chrisa@asty.org>
        * global.c (shortcut_init) - fix an issue with the split
index 7bac46b55c92cffb6b79a043cf6ee07a9e7c7c1b..fa4ff2537a9310c239279c1108fc91c9943ab3f4 100644 (file)
@@ -564,7 +564,8 @@ void do_down(
        )
 {
     bool onlastline = FALSE;
-    int extra = 0;
+    int amount, enough = 0;
+    filestruct *topline;
 
     /* If we're at the bottom of the file, get out. */
     if (openfile->current == openfile->filebot)
@@ -581,11 +582,22 @@ void do_down(
     if (ISSET(SOFTWRAP)) {
        if (openfile->current->lineno - openfile->edittop->lineno >= maxrows)
            onlastline = TRUE;
-       /* Compute the extra amount to scroll when the current line is overlong. */
-       extra = (strlenpt(openfile->current->data) / COLS + openfile->current_y + 2 - editwinrows);
+       /* Compute the amount to scroll. */
+       amount = (strlenpt(openfile->current->data) / COLS + openfile->current_y + 2
+                + strlenpt(openfile->current->prev->data) / COLS - editwinrows);
+       topline = openfile->edittop;
+       /* Reduce the amount when there are overlong lines at the top. */
+       for (enough = 1; enough < amount; enough++) {
+           if (amount <= strlenpt(topline->data) / COLS) {
+               amount = enough;
+               break;
+           }
+           amount -= strlenpt(topline->data) / COLS;
+           topline = topline->next;
+       }
     }
 
-    /* If scroll_only is FALSE and if we're on the first line of the
+    /* 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
      * scroll_only is TRUE, scroll the edit window down one line
@@ -597,13 +609,13 @@ void do_down(
        ) {
        edit_scroll(DOWN_DIR,
 #ifndef NANO_TINY
-               (ISSET(SMOOTH_SCROLL) || scroll_only) ? 1 :
+               (ISSET(SMOOTH_SCROLL) || scroll_only) ? (amount ? amount : 1) :
 #endif
                editwinrows / 2 + 1);
 
        edit_refresh_needed = TRUE;
-    } else if (extra > 0) {
-       edit_scroll(DOWN_DIR, extra);
+    } else if (amount > 0) {
+       edit_scroll(DOWN_DIR, amount);
        edit_refresh_needed = TRUE;
     }
     /* If we're above the last line of the edit window, update the line
index 63ee6f3fc58c80aa39625e71f8bbf0b334fd1f33..b5505f28b8d40a8f1408fa5c86eeeb115796e89e 100644 (file)
@@ -2997,7 +2997,9 @@ void edit_scroll(scroll_dir direction, ssize_t nlines)
 
     /* If using soft wrapping, we want to scroll down enough to display the entire next
         line, if possible... */
-    if (ISSET(SOFTWRAP) && direction == DOWN_DIR) {
+
+/* DEFEAT the extracuzsoft computation for now; the amount should be okay already. */
+    if (FALSE && ISSET(SOFTWRAP) && direction == DOWN_DIR) {
 #ifdef DEBUG
           fprintf(stderr, "Softwrap: Entering check for extracuzsoft\n");
 #endif
@@ -3041,7 +3043,7 @@ void edit_scroll(scroll_dir direction, ssize_t nlines)
            openfile->edittop = openfile->edittop->next;
        }
        /* Don't over-scroll on long lines */
-       if (ISSET(SOFTWRAP)) {
+       if (ISSET(SOFTWRAP) && (direction == UP_DIR)) {
            ssize_t len = strlenpt(openfile->edittop->data) / COLS;
            i -=  len;
            if (len > 0)