Introduction
Introduction Statistics Contact Development Disclaimer Help
Support scroll back after clear screen - scroll - scrollbackbuffer program for …
git clone git://git.suckless.org/scroll
Log
Files
Refs
README
LICENSE
---
commit 177976ae00fc60658c6f21739a3fd2462a02917f
parent 4aa27c1b145ae6aec83cecc7fc37b9842854b769
Author: Jochen Sprickerhof <[email protected]>
Date: Wed, 15 Apr 2020 22:38:16 +0200
Support scroll back after clear screen
Diffstat:
M TODO | 1 -
M scroll.c | 28 +++++++++++++++++++++-------
2 files changed, 21 insertions(+), 8 deletions(-)
---
diff --git a/TODO b/TODO
@@ -1,4 +1,3 @@
* strlen function which is aware of unicode
* handle wrapping lines in scrolling line count correctly
* hotkey to dump buffer to file (like screen hardcopy)
- * scroll back if screen was cleared (sh; ls; clear; scrollup())
diff --git a/scroll.c b/scroll.c
@@ -251,6 +251,16 @@ skipesc(char c)
}
void
+getcursorposition(int *x, int *y)
+{
+ char input[BUFSIZ];
+ write(STDOUT_FILENO, "\033[6n", 4);
+ ssize_t n = read(STDIN_FILENO, input, sizeof(input)-1);
+ input[n] = '\0';
+ sscanf(input, "\033[%d;%dR", x, y);
+}
+
+void
addline(char *buf, size_t size)
{
struct line *line = eamalloc(sizeof *line);
@@ -268,11 +278,13 @@ addline(char *buf, size_t size)
void
redraw()
{
- int rows = 0;
+ int rows = 0, x, y;
+
+ getcursorposition(&x, &y);
/* wind back bottom pointer by one page */
for (; bottom != NULL && TAILQ_NEXT(bottom, entries) != NULL &&
- rows < ws.ws_row; rows++)
+ rows < x - 1; rows++)
bottom = TAILQ_NEXT(bottom, entries);
if (rows == 0)
@@ -298,18 +310,20 @@ redraw()
void
scrollup(int n)
{
- int rows = 2;
+ int rows = 2, x, y;
struct line *scrollend = bottom;
+ getcursorposition(&x, &y);
+
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 (; scrollend != NULL && TAILQ_NEXT(scrollend, entries) != NULL &&
- rows < ws.ws_row + n; rows++)
+ rows < x + n; rows++)
scrollend = TAILQ_NEXT(scrollend, entries);
- rows -= ws.ws_row;
+ rows -= x;
if (rows <= 0)
return;
@@ -334,8 +348,8 @@ scrollup(int n)
bottom = TAILQ_NEXT(bottom, entries);
write(STDOUT_FILENO, scrollend->buf, scrollend->size);
}
- /* move cursor from line n to the bottom left corner */
- dprintf(STDOUT_FILENO, "\033[%d;0H", ws.ws_row);
+ /* move cursor from line n to the old bottom position */
+ dprintf(STDOUT_FILENO, "\033[%d;0H", x);
}
void
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.