Obey line length while scrolling - scroll - scrollbackbuffer program for st | |
git clone git://git.suckless.org/scroll | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 247a9b042655291ab64aa9c43f9e89d820e932ee | |
parent 6d1a3bbbb870a303b47f790ba76146e61a4c7b6a | |
Author: Jochen Sprickerhof <[email protected]> | |
Date: Wed, 29 Apr 2020 23:46:11 +0200 | |
Obey line length while scrolling | |
Diffstat: | |
M scroll.c | 23 +++++++++++++++-------- | |
1 file changed, 15 insertions(+), 8 deletions(-) | |
--- | |
diff --git a/scroll.c b/scroll.c | |
@@ -295,7 +295,7 @@ redraw() | |
void | |
scrollup(int n) | |
{ | |
- int rows = 2, x, y; | |
+ int rows = 2, x, y, extra = 0; | |
struct line *scrollend = bottom; | |
if (bottom == NULL) | |
@@ -306,18 +306,24 @@ scrollup(int n) | |
if (n < 0) /* scroll by fraction of ws.ws_row, but at least one line */ | |
n = ws.ws_row > (-n) ? ws.ws_row / (-n) : 1; | |
- /* wind back scrollend pointer by one page plus n */ | |
- for (; TAILQ_NEXT(scrollend, entries) != NULL && | |
- rows < y + n; rows++) | |
+ /* wind back scrollend pointer by the current screen */ | |
+ while (rows < y && TAILQ_NEXT(scrollend, entries) != NULL) { | |
scrollend = TAILQ_NEXT(scrollend, entries); | |
- | |
- rows -= y; | |
+ rows += (scrollend->len - 1) / ws.ws_col + 1; | |
+ } | |
if (rows <= 0) | |
return; | |
+ /* wind back scrollend pointer n lines */ | |
+ for (rows = 0; rows + extra < n && | |
+ TAILQ_NEXT(scrollend, entries) != NULL; rows++) { | |
+ scrollend = TAILQ_NEXT(scrollend, entries); | |
+ extra += (scrollend->len - 1) / ws.ws_col; | |
+ } | |
+ | |
/* move the text in terminal rows lines down */ | |
- dprintf(STDOUT_FILENO, "\033[%dT", rows); | |
+ dprintf(STDOUT_FILENO, "\033[%dT", n); | |
/* set cursor position to upper left corner */ | |
write(STDOUT_FILENO, "\033[0;0H", 6); | |
/* hide cursor */ | |
@@ -357,9 +363,10 @@ scrolldown(char *buf, size_t size, int n) | |
bottom = TAILQ_PREV(bottom, tailhead, entries); | |
/* print n lines */ | |
- for (; n > 0 && bottom != NULL && bottom != TAILQ_FIRST(&head); n--) { | |
+ while (n > 0 && bottom != NULL && bottom != TAILQ_FIRST(&head)) { | |
bottom = TAILQ_PREV(bottom, tailhead, entries); | |
write(STDOUT_FILENO, bottom->buf, bottom->size); | |
+ n -= (bottom->len - 1) / ws.ws_col + 1; | |
} | |
if (n > 0 && bottom == TAILQ_FIRST(&head)) { | |
write(STDOUT_FILENO, "\033[?25h", 6); /* show cursor */ |