sites

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

commit edaed36c6cd90d5c992ff3507d2bbb0f5c653775
parent 2b5fbd71749ecc5c1b3e6050dfc90602b6d373b4
Author: Alex Pilon <alp@alexpilon.ca>
Date:   Wed, 18 Mar 2015 10:54:01 -0400

Scrollback patch whitespace fixes and prevent scroll past beginning.

Diffstat:
Mst.suckless.org/patches/st-scrollback.diff | 85+++++++++++++++++++++++++++++++++++++++++--------------------------------------
1 file changed, 44 insertions(+), 41 deletions(-)

diff --git a/st.suckless.org/patches/st-scrollback.diff b/st.suckless.org/patches/st-scrollback.diff @@ -1,14 +1,3 @@ -From 50a21cfd1474dc113fa5c36aaf82c8e758165d9c Mon Sep 17 00:00:00 2001 -From: Alexander Huemer <alexander.huemer@xx.vu> -Date: Tue, 17 Mar 2015 22:26:33 +0100 -Subject: [PATCH] Add scrollback buffer - ---- - FAQ | 7 +--- - config.def.h | 3 ++ - st.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++------------- - 3 files changed, 98 insertions(+), 30 deletions(-) - diff --git a/FAQ b/FAQ index 3502c60..62a0a6c 100644 --- a/FAQ @@ -29,7 +18,7 @@ index 3502c60..62a0a6c 100644 ## Why doesn't the Del key work in some programs? diff --git a/config.def.h b/config.def.h -index 56bae2d..9c6f759 100644 +index 56bae2d..9005fe7 100644 --- a/config.def.h +++ b/config.def.h @@ -7,6 +7,7 @@ @@ -44,13 +33,13 @@ index 56bae2d..9c6f759 100644 { MODKEY|ShiftMask, XK_C, clipcopy, {.i = 0} }, { MODKEY|ShiftMask, XK_V, clippaste, {.i = 0} }, { MODKEY, XK_Num_Lock, numlock, {.i = 0} }, -+ { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, -+ { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, ++ { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, ++ { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, }; /* diff --git a/st.c b/st.c -index 836ae21..6104b89 100644 +index 836ae21..22ca1e1 100644 --- a/st.c +++ b/st.c @@ -83,6 +83,8 @@ char *argv0; @@ -92,7 +81,24 @@ index 836ae21..6104b89 100644 static void tsetattr(int *, int); static void tsetchar(char *, Glyph *, int, int); static void tsetscroll(int, int); -@@ -671,10 +678,10 @@ y2row(int y) { +@@ -566,6 +573,16 @@ xrealloc(void *p, size_t len) { + return p; + } + ++void * ++xcalloc(size_t n, size_t l) { ++ void *p; ++ ++ if ((p = calloc(n, l)) == NULL) ++ die("Out of memory\n"); ++ ++ return p; ++} ++ + char * + xstrdup(char *s) { + if((s = strdup(s)) == NULL) +@@ -671,10 +688,10 @@ y2row(int y) { static int tlinelen(int y) { int i = term.col; @@ -105,7 +111,7 @@ index 836ae21..6104b89 100644 --i; return i; -@@ -730,7 +737,7 @@ selsnap(int mode, int *x, int *y, int direction) { +@@ -730,7 +747,7 @@ selsnap(int mode, int *x, int *y, int direction) { * Snap around if the word wraps around at the end or * beginning of a line. */ @@ -114,7 +120,7 @@ index 836ae21..6104b89 100644 prevdelim = strchr(worddelimiters, prevgp->c[0]) != NULL; for(;;) { newx = *x + direction; -@@ -745,14 +752,14 @@ selsnap(int mode, int *x, int *y, int direction) { +@@ -745,14 +762,14 @@ selsnap(int mode, int *x, int *y, int direction) { yt = *y, xt = *x; else yt = newy, xt = newx; @@ -131,7 +137,7 @@ index 836ae21..6104b89 100644 delim = strchr(worddelimiters, gp->c[0]) != NULL; if(!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim || (delim && gp->c[0] != prevgp->c[0]))) -@@ -773,14 +780,14 @@ selsnap(int mode, int *x, int *y, int direction) { +@@ -773,14 +790,14 @@ selsnap(int mode, int *x, int *y, int direction) { *x = (direction < 0) ? 0 : term.col - 1; if(direction < 0 && *y > 0) { for(; *y > 0; *y += direction) { @@ -148,7 +154,7 @@ index 836ae21..6104b89 100644 & ATTR_WRAP)) { break; } -@@ -945,13 +952,13 @@ getsel(void) { +@@ -945,13 +962,13 @@ getsel(void) { linelen = tlinelen(y); if(sel.type == SEL_RECTANGULAR) { @@ -165,7 +171,7 @@ index 836ae21..6104b89 100644 while(last >= gp && last->c[0] == ' ') --last; -@@ -1313,10 +1320,16 @@ ttyread(void) { +@@ -1313,10 +1330,16 @@ ttyread(void) { /* keep any uncomplete utf8 char for the next call */ memmove(buf, ptr, buflen); @@ -182,7 +188,7 @@ index 836ae21..6104b89 100644 if(xwrite(cmdfd, s, n) == -1) die("write error on tty: %s\n", strerror(errno)); } -@@ -1444,13 +1457,51 @@ tswapscreen(void) { +@@ -1444,13 +1467,53 @@ tswapscreen(void) { } void @@ -212,6 +218,8 @@ index 836ae21..6104b89 100644 + + if(term.scr <= histsize - n) { + term.scr += n; ++ if (term.scr > term.histi) ++ term.scr = term.histi; + selscroll(0, n); + tfulldirt(); + } @@ -235,7 +243,7 @@ index 836ae21..6104b89 100644 tclearregion(0, term.bot-n+1, term.col-1, term.bot); for(i = term.bot; i >= orig+n; i--) { -@@ -1463,12 +1514,19 @@ tscrolldown(int orig, int n) { +@@ -1463,12 +1526,19 @@ tscrolldown(int orig, int n) { } void @@ -256,7 +264,7 @@ index 836ae21..6104b89 100644 tclearregion(0, orig, term.col-1, orig+n-1); tsetdirt(orig+n, term.bot); -@@ -1515,7 +1573,7 @@ tnewline(int first_col) { +@@ -1515,7 +1585,7 @@ tnewline(int first_col) { int y = term.c.y; if(y == term.bot) { @@ -265,7 +273,7 @@ index 836ae21..6104b89 100644 } else { y++; } -@@ -1675,13 +1733,13 @@ tinsertblank(int n) { +@@ -1675,13 +1745,13 @@ tinsertblank(int n) { void tinsertblankline(int n) { if(BETWEEN(term.c.y, term.top, term.bot)) @@ -281,7 +289,7 @@ index 836ae21..6104b89 100644 } int32_t -@@ -2110,11 +2168,11 @@ csihandle(void) { +@@ -2110,11 +2180,11 @@ csihandle(void) { break; case 'S': /* SU -- Scroll <n> line up */ DEFAULT(csiescseq.arg[0], 1); @@ -295,7 +303,7 @@ index 836ae21..6104b89 100644 break; case 'L': /* IL -- Insert <n> blank lines */ DEFAULT(csiescseq.arg[0], 1); -@@ -2555,7 +2613,7 @@ eschandle(uchar ascii) { +@@ -2555,7 +2625,7 @@ eschandle(uchar ascii) { return 0; case 'D': /* IND -- Linefeed */ if(term.c.y == term.bot) { @@ -304,7 +312,7 @@ index 836ae21..6104b89 100644 } else { tmoveto(term.c.x, term.c.y+1); } -@@ -2568,7 +2626,7 @@ eschandle(uchar ascii) { +@@ -2568,7 +2638,7 @@ eschandle(uchar ascii) { break; case 'M': /* RI -- Reverse index */ if(term.c.y == term.top) { @@ -313,7 +321,7 @@ index 836ae21..6104b89 100644 } else { tmoveto(term.c.x, term.c.y-1); } -@@ -2739,7 +2797,7 @@ tputc(char *c, int len) { +@@ -2739,7 +2809,7 @@ tputc(char *c, int len) { void tresize(int col, int row) { @@ -322,14 +330,13 @@ index 836ae21..6104b89 100644 int minrow = MIN(row, term.row); int mincol = MIN(col, term.col); int slide = term.c.y - row + 1; -@@ -2775,9 +2833,18 @@ tresize(int col, int row) { - /* resize to new height */ - term.line = xrealloc(term.line, row * sizeof(Line)); +@@ -2777,6 +2847,16 @@ tresize(int col, int row) { term.alt = xrealloc(term.alt, row * sizeof(Line)); -+ term.hist = xrealloc(term.hist, histsize * sizeof(Line)); term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); - ++ if(!term.hist) ++ term.hist = xcalloc(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++) { @@ -337,11 +344,10 @@ index 836ae21..6104b89 100644 + memcpy(term.hist[i][j].c, " ", 2); + } + } -+ + /* resize each row to new width, zero-pad if needed */ for(i = 0; i < minrow; i++) { - term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); -@@ -3634,10 +3701,10 @@ drawregion(int x1, int y1, int x2, int y2) { +@@ -3634,10 +3714,10 @@ drawregion(int x1, int y1, int x2, int y2) { xtermclear(0, y, term.col, y); term.dirty[y] = 0; @@ -354,7 +360,7 @@ index 836ae21..6104b89 100644 if(new.mode == ATTR_WDUMMY) continue; if(ena_sel && selected(x, y)) -@@ -3660,7 +3727,8 @@ drawregion(int x1, int y1, int x2, int y2) { +@@ -3660,7 +3740,8 @@ drawregion(int x1, int y1, int x2, int y2) { if(ib > 0) xdraws(buf, base, ox, y, ic, ib); } @@ -364,6 +370,3 @@ index 836ae21..6104b89 100644 } void --- -2.1.4 -