Magnetic redraw behaviour - scroll - scrollbackbuffer program for st
 (HTM) git clone git://git.suckless.org/scroll
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 8afdc10fd50174fc2f567d371401834277bf1c40
 (DIR) parent d65e29260f83ac1d9d5fe128540f0079638b4e1a
 (HTM) Author: Jochen Sprickerhof <git@jochen.sprickerhof.de>
       Date:   Sat, 25 Apr 2020 22:33:46 +0200
       
       Magnetic redraw behaviour
       
       Diffstat:
         M scroll.c                            |      21 ++++++++++++++-------
       
       1 file changed, 14 insertions(+), 7 deletions(-)
       ---
 (DIR) diff --git a/scroll.c b/scroll.c
       @@ -254,16 +254,19 @@ redraw()
        {
                int rows = 0, x, y;
        
       +        if (bottom == NULL)
       +                return;
       +
                getcursorposition(&x, &y);
        
       +        if (y < ws.ws_row-1)
       +          y--;
       +
                /* wind back bottom pointer by shown history */
                for (; bottom != NULL && TAILQ_NEXT(bottom, entries) != NULL &&
       -            rows < y - 2; rows++)
       +            rows < y - 1; rows++)
                        bottom = TAILQ_NEXT(bottom, entries);
        
       -        if (rows == 0)
       -                return;
       -
                /* clear screen */
                dprintf(STDOUT_FILENO, "\033[2J");
                /* set cursor position to upper left corner */
       @@ -275,12 +278,16 @@ redraw()
                else
                        write(STDOUT_FILENO, bottom->buf, bottom->size);
        
       -        for (; rows > 0; rows--) {
       +        for (rows = ws.ws_row; rows > 0 &&
       +            TAILQ_PREV(bottom, tailhead, entries) != NULL; rows--) {
                        bottom = TAILQ_PREV(bottom, tailhead, entries);
                        write(STDOUT_FILENO, bottom->buf, bottom->size);
                }
       -        /* add new line in front of the shell prompt */
       -        write(STDOUT_FILENO, "\n", 1);
       +
       +        if (bottom == TAILQ_FIRST(&head))
       +                write(STDOUT_FILENO, "\n", 1);
       +        else
       +                bottom = TAILQ_NEXT(bottom, entries);
        }
        
        void