sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

commit 275b78e02c01d6ae2d98473e2af60ee211e16aa2
parent 61bee804319949311e98114433bd138bdf3641e1
Author: Jochen Sprickerhof <git@jochen.sprickerhof.de>
Date:   Wed,  4 Jan 2017 18:20:23 +0100

[st] clean up scrollback patch

Please have a look into the history before changing the implementation
details of this patch. For example 916e9e7 for how to put term.hist on
the heap and ccd3815 why it's on the stack.

Diffstat:
Mst.suckless.org/patches/scrollback.md | 2+-
Dst.suckless.org/patches/st-scrollback-20170102-a719e36.diff | 379-------------------------------------------------------------------------------
Rst.suckless.org/patches/st-scrollback-20160924-f739843.diff -> st.suckless.org/patches/st-scrollback-20170104-c63a87c.diff | 0
3 files changed, 1 insertion(+), 380 deletions(-)

diff --git a/st.suckless.org/patches/scrollback.md b/st.suckless.org/patches/scrollback.md @@ -10,7 +10,7 @@ Download -------- * [st-scrollback-0.7.diff](st-scrollback-0.7.diff) -* [st-scrollback-20170102-a719e36.diff](st-scrollback-20170102-a719e36.diff) +* [st-scrollback-20170104-c63a87c.diff](st-scrollback-20170104-c63a87c.diff) Apply the following patch on top of the previous to allow scrolling using `Shift+MouseWheel`. diff --git a/st.suckless.org/patches/st-scrollback-20170102-a719e36.diff b/st.suckless.org/patches/st-scrollback-20170102-a719e36.diff @@ -1,379 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index a719e36..a070a3b 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,6 +7,7 @@ - */ - static char font[] = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; - static int borderpx = 2; -+static unsigned int histsize = 2000; - - /* - * What program is execed by st depends of these precedence rules: -@@ -178,6 +179,8 @@ static Shortcut shortcuts[] = { - { MODKEY|ShiftMask, XK_V, clippaste, {.i = 0} }, - { MODKEY, XK_Num_Lock, numlock, {.i = 0} }, - { MODKEY, XK_Control_L, iso14755, {.i = 0} }, -+ { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, -+ { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, - }; - - /* -diff --git a/st.c b/st.c -index fbcd9e0..38256d1 100644 ---- a/st.c -+++ b/st.c -@@ -87,6 +87,9 @@ char *argv0; - #define TRUERED(x) (((x) & 0xff0000) >> 8) - #define TRUEGREEN(x) (((x) & 0xff00)) - #define TRUEBLUE(x) (((x) & 0xff) << 8) -+#define TLINE(y) ((y) < term.scr ? term.hist[((y) + term.histi \ -+ - term.scr + histsize + 1) % histsize] : term.line[(y) \ -+ - term.scr]) - - /* constants */ - #define ISO14755CMD "dmenu -w %lu -p codepoint: </dev/null" -@@ -241,7 +244,10 @@ typedef struct { - int col; /* nb col */ - Line *line; /* screen */ - Line *alt; /* alternate screen */ -- int *dirty; /* dirtyness of lines */ -+ Line *hist; /* history buffer */ -+ int histi; /* history index */ -+ int scr; /* scroll back */ -+ int *dirty; /* dirtyness of lines */ - XftGlyphFontSpec *specbuf; /* font spec buffer used for rendering */ - TCursor c; /* cursor */ - int top; /* top scroll limit */ -@@ -251,7 +257,7 @@ typedef struct { - char trantbl[4]; /* charset table translation */ - int charset; /* current charset */ - int icharset; /* selected charset for sequence */ -- int numlock; /* lock numbers in keyboard */ -+ int numlock; /* lock numbers in keyboard */ - int *tabs; - } Term; - -@@ -334,6 +340,8 @@ typedef struct { - /* function definitions used in config.h */ - static void clipcopy(const Arg *); - static void clippaste(const Arg *); -+static void kscrolldown(const Arg *); -+static void kscrollup(const Arg *); - static void numlock(const Arg *); - static void selpaste(const Arg *); - static void xzoom(const Arg *); -@@ -409,8 +417,8 @@ static void tputtab(int); - static void tputc(Rune); - static void treset(void); - static void tresize(int, int); --static void tscrollup(int, int); --static void tscrolldown(int, int); -+static void tscrollup(int, int, int); -+static void tscrolldown(int, int, int); - static void tsetattr(int *, int); - static void tsetchar(Rune, Glyph *, int, int); - static void tsetscroll(int, int); -@@ -742,10 +750,10 @@ tlinelen(int y) - { - int i = term.col; - -- if (term.line[y][i - 1].mode & ATTR_WRAP) -+ if (TLINE(y)[i - 1].mode & ATTR_WRAP) - return i; - -- while (i > 0 && term.line[y][i - 1].u == ' ') -+ while (i > 0 && TLINE(y)[i - 1].u == ' ') - --i; - - return i; -@@ -807,7 +815,7 @@ selsnap(int *x, int *y, int direction) - * Snap around if the word wraps around at the end or - * beginning of a line. - */ -- prevgp = &term.line[*y][*x]; -+ prevgp = &TLINE(*y)[*x]; - prevdelim = ISDELIM(prevgp->u); - for (;;) { - newx = *x + direction; -@@ -822,14 +830,14 @@ selsnap(int *x, int *y, int direction) - yt = *y, xt = *x; - else - yt = newy, xt = newx; -- if (!(term.line[yt][xt].mode & ATTR_WRAP)) -+ if (!(TLINE(yt)[xt].mode & ATTR_WRAP)) - break; - } - - if (newx >= tlinelen(newy)) - break; - -- gp = &term.line[newy][newx]; -+ gp = &TLINE(newy)[newx]; - delim = ISDELIM(gp->u); - if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim - || (delim && gp->u != prevgp->u))) -@@ -850,14 +858,14 @@ selsnap(int *x, int *y, int direction) - *x = (direction < 0) ? 0 : term.col - 1; - if (direction < 0) { - for (; *y > 0; *y += direction) { -- if (!(term.line[*y-1][term.col-1].mode -+ if (!(TLINE(*y-1)[term.col-1].mode - & ATTR_WRAP)) { - break; - } - } - } else if (direction > 0) { - for (; *y < term.row-1; *y += direction) { -- if (!(term.line[*y][term.col-1].mode -+ if (!(TLINE(*y)[term.col-1].mode - & ATTR_WRAP)) { - break; - } -@@ -1023,13 +1031,13 @@ getsel(void) - } - - if (sel.type == SEL_RECTANGULAR) { -- gp = &term.line[y][sel.nb.x]; -+ gp = &TLINE(y)[sel.nb.x]; - lastx = sel.ne.x; - } else { -- gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0]; -+ gp = &TLINE(y)[sel.nb.y == y ? sel.nb.x : 0]; - lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1; - } -- last = &term.line[y][MIN(lastx, linelen-1)]; -+ last = &TLINE(y)[MIN(lastx, linelen-1)]; - while (last >= gp && last->u == ' ') - --last; - -@@ -1513,6 +1521,9 @@ ttyread(void) - if (buflen > 0) - memmove(buf, ptr, buflen); - -+ if (term.scr > 0 && term.scr < histsize - 1) -+ term.scr++; -+ - return ret; - } - -@@ -1522,6 +1533,9 @@ ttywrite(const char *s, size_t n) - fd_set wfd, rfd; - ssize_t r; - size_t lim = 256; -+ Arg arg = (Arg) { .i = term.scr }; -+ -+ kscrolldown(&arg); - - /* - * Remember that we are using a pty, which might be a modem line. -@@ -1724,40 +1738,87 @@ tswapscreen(void) - } - - void --tscrolldown(int orig, int n) -+kscrolldown(const Arg* a) -+{ -+ int n = a->i; -+ -+ if (n < 0) -+ n = term.row + n; -+ -+ if (n > term.scr) -+ n = term.scr; -+ -+ if (term.scr > 0) { -+ term.scr -= n; -+ selscroll(0, -n); -+ tfulldirt(); -+ } -+} -+ -+void -+kscrollup(const Arg* a) -+{ -+ int n = a->i; -+ -+ if (n < 0) -+ n = term.row + n; -+ -+ if (term.scr <= histsize - n) { -+ term.scr += n; -+ selscroll(0, n); -+ tfulldirt(); -+ } -+} -+ -+void -+tscrolldown(int orig, int n, int copyhist) - { - int i; - Line temp; - -- LIMIT(n, 0, term.bot-orig+1); -+ LIMIT(n, 0, term.bot - orig + 1); - -- tsetdirt(orig, term.bot-n); -- tclearregion(0, term.bot-n+1, term.col-1, term.bot); -+ if (copyhist) { -+ term.histi = (term.histi - 1 + histsize) % histsize; -+ temp = term.hist[term.histi]; -+ term.hist[term.histi] = term.line[term.bot]; -+ term.line[term.bot] = temp; -+ } - -- for (i = term.bot; i >= orig+n; i--) { -+ tsetdirt(orig, term.bot - n); -+ tclearregion(0, term.bot - n + 1, term.col - 1, term.bot); -+ -+ for (i = term.bot; i >= orig + n; i--) { - temp = term.line[i]; -- term.line[i] = term.line[i-n]; -- term.line[i-n] = temp; -+ term.line[i] = term.line[i - n]; -+ term.line[i - n] = temp; - } - - selscroll(orig, n); - } - - void --tscrollup(int orig, int n) -+tscrollup(int orig, int n, int copyhist) - { - int i; - Line temp; - -- LIMIT(n, 0, term.bot-orig+1); -+ LIMIT(n, 0, term.bot - orig + 1); -+ -+ if (copyhist) { -+ term.histi = (term.histi + 1) % histsize; -+ temp = term.hist[term.histi]; -+ term.hist[term.histi] = term.line[orig]; -+ term.line[orig] = temp; -+ } - -- tclearregion(0, orig, term.col-1, orig+n-1); -- tsetdirt(orig+n, term.bot); -+ tclearregion(0, orig, term.col - 1, orig + n - 1); -+ tsetdirt(orig + n, term.bot); - -- for (i = orig; i <= term.bot-n; i++) { -+ for (i = orig; i <= term.bot - n; i++) { - temp = term.line[i]; -- term.line[i] = term.line[i+n]; -- term.line[i+n] = temp; -+ term.line[i] = term.line[i + n]; -+ term.line[i + n] = temp; - } - - selscroll(orig, -n); -@@ -1799,7 +1860,7 @@ tnewline(int first_col) - int y = term.c.y; - - if (y == term.bot) { -- tscrollup(term.top, 1); -+ tscrollup(term.top, 1, 1); - } else { - y++; - } -@@ -1964,14 +2025,14 @@ void - tinsertblankline(int n) - { - if (BETWEEN(term.c.y, term.top, term.bot)) -- tscrolldown(term.c.y, n); -+ tscrolldown(term.c.y, n, 0); - } - - void - tdeleteline(int n) - { - if (BETWEEN(term.c.y, term.top, term.bot)) -- tscrollup(term.c.y, n); -+ tscrollup(term.c.y, n, 0); - } - - int32_t -@@ -2405,11 +2466,11 @@ csihandle(void) - break; - case 'S': /* SU -- Scroll <n> line up */ - DEFAULT(csiescseq.arg[0], 1); -- tscrollup(term.top, csiescseq.arg[0]); -+ tscrollup(term.top, csiescseq.arg[0], 0); - break; - case 'T': /* SD -- Scroll <n> line down */ - DEFAULT(csiescseq.arg[0], 1); -- tscrolldown(term.top, csiescseq.arg[0]); -+ tscrolldown(term.top, csiescseq.arg[0], 0); - break; - case 'L': /* IL -- Insert <n> blank lines */ - DEFAULT(csiescseq.arg[0], 1); -@@ -2945,7 +3006,7 @@ eschandle(uchar ascii) - return 0; - case 'D': /* IND -- Linefeed */ - if (term.c.y == term.bot) { -- tscrollup(term.top, 1); -+ tscrollup(term.top, 1, 1); - } else { - tmoveto(term.c.x, term.c.y+1); - } -@@ -2958,7 +3019,7 @@ eschandle(uchar ascii) - break; - case 'M': /* RI -- Reverse index */ - if (term.c.y == term.top) { -- tscrolldown(term.top, 1); -+ tscrolldown(term.top, 1, 1); - } else { - tmoveto(term.c.x, term.c.y-1); - } -@@ -3145,7 +3206,7 @@ check_control_code: - void - tresize(int col, int row) - { -- int i; -+ int i, j; - int minrow = MIN(row, term.row); - int mincol = MIN(col, term.col); - int *bp; -@@ -3184,6 +3245,15 @@ tresize(int col, int row) - term.alt = xrealloc(term.alt, row * sizeof(Line)); - term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); - term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); -+ term.hist = xrealloc(term.hist, histsize * sizeof(Line)); -+ -+ for (i = 0; i < histsize; i++) { -+ term.hist[i] = xrealloc(term.hist[i], col * sizeof(Glyph)); -+ for (j = mincol; j < col; j++) { -+ term.hist[i][j] = term.c.attr; -+ term.hist[i][j].u = ' '; -+ } -+ } - - /* resize each row to new width, zero-pad if needed */ - for (i = 0; i < minrow; i++) { -@@ -4112,11 +4182,11 @@ drawregion(int x1, int y1, int x2, int y2) - term.dirty[y] = 0; - - specs = term.specbuf; -- numspecs = xmakeglyphfontspecs(specs, &term.line[y][x1], x2 - x1, x1, y); -+ numspecs = xmakeglyphfontspecs(specs, &TLINE(y)[x1], x2 - x1, x1, y); - - i = ox = 0; - for (x = x1; x < x2 && i < numspecs; x++) { -- new = term.line[y][x]; -+ new = TLINE(y)[x]; - if (new.mode == ATTR_WDUMMY) - continue; - if (ena_sel && selected(x, y)) -@@ -4136,7 +4206,9 @@ drawregion(int x1, int y1, int x2, int y2) - if (i > 0) - xdrawglyphfontspecs(specs, base, i, ox, y); - } -- xdrawcursor(); -+ -+ if (term.scr == 0) -+ xdrawcursor(); - } - - void diff --git a/st.suckless.org/patches/st-scrollback-20160924-f739843.diff b/st.suckless.org/patches/st-scrollback-20170104-c63a87c.diff