Introduction
Introduction Statistics Contact Development Disclaimer Help
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 */
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.