scroll

scrollbackbuffer program for st
git clone git://git.suckless.org/scroll
Log | Files | Refs | README

commit 8afdc10fd50174fc2f567d371401834277bf1c40
parent d65e29260f83ac1d9d5fe128540f0079638b4e1a
Author: Jochen Sprickerhof <git@jochen.sprickerhof.de>
Date:   Sat, 25 Apr 2020 22:33:46 +0200

Magnetic redraw behaviour

Diffstat:
Mscroll.c | 21++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)

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