diff --git a/README.md b/README.md index 2215bb8..248b4cf 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ # Luke's build of st - the simple (suckless) terminal - Forked from [https://github.com/shiva/st](https://github.com/shiva/st) for simplicity's sake, which is the [suckless terminal (st)](https://st.suckless.org/) with some patches added: + transparency -+ copy to clipboard -+ ~~Solarized colors (light and dark toggleable)~~ (Change to your own colors, see no value of toggle) ++ copy to clipboard (alt-shift-c) ++ Solarized colors (light and dark toggleable) + vertcenter + scrollback with keyboard + scrollback with mouse @@ -12,10 +11,11 @@ Forked from [https://github.com/shiva/st](https://github.com/shiva/st) for simpl ## My own additions -+ Default font is system "mono" at 14pt -+ Alt-k and Alt-j scroll back/foward in history one line at a time -+ Alt-u and Alt-d scroll back/foward in history a page at a time -+ Applied colors, insipred by Pop! OS colors. ++ Default font is system "mono" at 14pt, meaning the font will match your system font. ++ Hold alt and press either ↑/↓ or the vim keys k/j to move up/down in the terminal. ++ Alt-u and Alt-d scroll back/foward in history a page at a time. ++ Alt-PageUp and Alt-PageDown scroll back/foward in history a page at a time. ++ Transparency with solarized colors by default. ## Terminal-specific mappings @@ -28,36 +28,27 @@ Forked from [https://github.com/shiva/st](https://github.com/shiva/st) for simpl ## Installation for newbs -### Requirements for build - -Install `base-devel` - compiler and stuff (most distros have). - -Install code depndencies (voidlinux - most distro should have something similar) - -+ `fontconfig-devel` -+ `libX11-devel` -+ `libXft-devel` - - -### Make & install - ``` make sudo make install ``` +Obviously, `make` is required to build. `fontconfig` is required for the default build, since it asks `fontconfig` for your system monospace font. It might be obvious, but `libX11` and `libXft` are required as well. Chances are, you have all of this installed already. + ## Custom changes (`config.def.h` or `config.h`) -### Alpha +By default, the terminal is transparent with a blackish background. There's a patch file `solarized-alpha-toggle.patch` which you can use to remove the transparency and give it a typical deep, dark blue solarized background. Just run: -+ Change `alpha` value (86 LOC), be default set `0xcd`. -+ Less transparent set to `0xdd` or `0xee`. -+ For non transparent terminal set to `0xff`. +``` +patch < solarized-alpha-toggle.patch +``` -### Colorname +Then, run `make` & `sudo make install` again to install the new build. You make reverse the solarized background by running the same command as above, but giving `patch` the `-R` option as well. -+ Change `colorname[]` array values (88 LOC), default colours inspired by colors used in Pop! OS. -+ Numbers of 0 - 15 are usual terminal colors. Changed them to your liking. +## Explore `config.h` + ++ Change `colorname[]` array values (88 LOC), default colours are solarized. ++ Numbers of 0 - 15 are usual terminal colors. Change them to your liking. + Change `bg` to your desired terminal background color. + Change `fg` to your desired terminal foreground color. + Change `cursor` to your desired terminal cursor color. diff --git a/config.def.h b/config.h similarity index 94% rename from config.def.h rename to config.h index 5a3cd53..a38b79a 100644 --- a/config.def.h +++ b/config.h @@ -5,7 +5,7 @@ * * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ -static char *font = "Liberation Mono:pixelsize=14:antialias=true:autohint=true"; +static char *font = "mono:pixelsize=14:antialias=true:autohint=true"; static int borderpx = 2; /* @@ -86,28 +86,22 @@ unsigned int tabspaces = 8; unsigned int alpha = 0xcd; static const char *colorname[] = { - /* 8 normal colors */ - "#666666", /* 0 */ - "#cc0000", /* 1 */ - "#4e9a06", /* 2 */ - "#c4a000", /* 3 */ - "#3465a4", /* 4 */ - "#75507b", /* 5 */ - "#06989a", /* 6 */ - "#d3d7cf", /* 7 */ - - /* 8 bright colors */ - "#88807c", /* 8 */ - "#f15d22", /* 9 */ - "#73c48f", /* 10 */ - "#ffce51", /* 11 */ - "#48b9c7", /* 12 */ - "#ad7fa8", /* 13 */ - "#34e2e2", /* 14 */ - "#eeeeec", /* 15 */ - - [255] = 0, - + "#073642", /* 0: black */ + "#dc322f", /* 1: red */ + "#859900", /* 2: green */ + "#b58900", /* 3: yellow */ + "#268bd2", /* 4: blue */ + "#d33682", /* 5: magenta */ + "#2aa198", /* 6: cyan */ + "#eee8d5", /* 7: white */ + "#002b36", /* 8: brblack */ + "#cb4b16", /* 9: brred */ + "#586e75", /* 10: brgreen */ + "#657b83", /* 11: bryellow */ + "#839496", /* 12: brblue */ + "#6c71c4", /* 13: brmagenta*/ + "#93a1a1", /* 14: brcyan */ + "#fdf6e3", /* 15: brwhite */ /* more colors can be added after 255 to use with DefaultXX */ "black", /* 256 -> bg */ "#00cc00", /* 257 -> fg */ @@ -119,10 +113,10 @@ static const char *colorname[] = { * Default colors (colorname index) * foreground, background, cursor, reverse cursor */ -unsigned int defaultfg = 257; +unsigned int defaultfg = 12; unsigned int defaultbg = 256; -static unsigned int defaultcs = 258; -static unsigned int defaultrcs = 257; +static unsigned int defaultcs = 14; +static unsigned int defaultrcs = 15; /* * Default shape of cursor @@ -190,10 +184,14 @@ static Shortcut shortcuts[] = { { MODKEY, XK_Control_L, iso14755, {.i = 0} }, { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, - { MODKEY, XK_k, kscrollup, {.i = 1} }, - { MODKEY, XK_j, kscrolldown, {.i = 1} }, - { MODKEY, XK_u, kscrollup, {.i = -1} }, - { MODKEY, XK_d, kscrolldown, {.i = -1} }, + { MODKEY, XK_Page_Up, kscrollup, {.i = -1} }, + { MODKEY, XK_Page_Down, kscrolldown, {.i = -1} }, + { MODKEY, XK_k, kscrollup, {.i = 1} }, + { MODKEY, XK_j, kscrolldown, {.i = 1} }, + { MODKEY, XK_Up, kscrollup, {.i = 1} }, + { MODKEY, XK_Down, kscrolldown, {.i = 1} }, + { MODKEY, XK_u, kscrollup, {.i = -1} }, + { MODKEY, XK_d, kscrolldown, {.i = -1} }, }; /* diff --git a/patches/st-alpha-0.8.1.diff b/patches/st-alpha-0.8.1.diff deleted file mode 100644 index 9dd26c3..0000000 --- a/patches/st-alpha-0.8.1.diff +++ /dev/null @@ -1,183 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index feec7e2..e373018 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -82,6 +82,9 @@ char *termname = "st-256color"; - */ - unsigned int tabspaces = 8; - -+/* bg opacity */ -+unsigned int alpha = 0xcd; -+ - /* Terminal colors (16 first used in escape sequence) */ - static const char *colorname[] = { - /* 8 normal colors */ -diff --git a/config.mk b/config.mk -index 039c42c..3b00d7e 100644 ---- a/config.mk -+++ b/config.mk -@@ -14,7 +14,7 @@ X11LIB = /usr/X11R6/lib - INCS = -I$(X11INC) \ - `pkg-config --cflags fontconfig` \ - `pkg-config --cflags freetype2` --LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \ -+LIBS = -L${X11LIB} -lm -lrt -lX11 -lutil -lXft -lXrender \ - `pkg-config --libs fontconfig` \ - `pkg-config --libs freetype2` - -diff --git a/st.h b/st.h -index cdd25ae..850c5f0 100644 ---- a/st.h -+++ b/st.h -@@ -134,6 +134,7 @@ extern char *worddelimiters; - extern int allowaltscreen; - extern char *termname; - extern unsigned int tabspaces; -+extern unsigned int alpha; - extern unsigned int defaultfg; - extern unsigned int defaultbg; - extern MouseKey mkeys[]; -diff --git a/win.h b/win.h -index 31f327d..d277477 100644 ---- a/win.h -+++ b/win.h -@@ -23,6 +23,10 @@ enum win_mode { - |MODE_MOUSEMANY, - }; - -+/* alpha */ -+#define OPAQUE 0Xff -+#define USE_ARGB (alpha != OPAQUE && opt_embed == NULL) -+ - void xbell(void); - void xclipcopy(void); - void xdrawcursor(int, int, Glyph, int, int, Glyph); -diff --git a/x.c b/x.c -index f4a6be7..840d2fa 100644 ---- a/x.c -+++ b/x.c -@@ -99,6 +99,7 @@ typedef struct { - XSetWindowAttributes attrs; - int scr; - int isfixed; /* is fixed geometry? */ -+ int depth; /* bit depth */ - int l, t; /* left and top offset */ - int gm; /* geometry mask */ - } XWindow; -@@ -698,7 +699,7 @@ xresize(int col, int row) - - XFreePixmap(xw.dpy, xw.buf); - xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, -- DefaultDepth(xw.dpy, xw.scr)); -+ xw.depth); - XftDrawChange(xw.draw, xw.buf); - xclear(0, 0, win.w, win.h); - -@@ -758,6 +759,13 @@ xloadcols(void) - else - die("Could not allocate color %d\n", i); - } -+ -+ /* set alpha value of bg color */ -+ if (USE_ARGB) { -+ dc.col[defaultbg].color.alpha = (0xffff * alpha) / OPAQUE; -+ dc.col[defaultbg].pixel &= 0x00111111; -+ dc.col[defaultbg].pixel |= alpha << 24; -+ } - loaded = 1; - } - -@@ -779,6 +787,17 @@ xsetcolorname(int x, const char *name) - return 0; - } - -+void -+xtermclear(int col1, int row1, int col2, int row2) -+{ -+ XftDrawRect(xw.draw, -+ &dc.col[IS_SET(MODE_REVERSE) ? defaultfg : defaultbg], -+ borderpx + col1 * win.cw, -+ borderpx + row1 * win.ch, -+ (col2-col1+1) * win.cw, -+ (row2-row1+1) * win.ch); -+} -+ - /* - * Absolute coordinates. - */ -@@ -1018,7 +1037,40 @@ xinit(int cols, int rows) - if (!(xw.dpy = XOpenDisplay(NULL))) - die("Can't open display\n"); - xw.scr = XDefaultScreen(xw.dpy); -- xw.vis = XDefaultVisual(xw.dpy, xw.scr); -+ xw.depth = (USE_ARGB) ? 32: XDefaultDepth(xw.dpy, xw.scr); -+ if (!USE_ARGB) -+ xw.vis = XDefaultVisual(xw.dpy, xw.scr); -+ else { -+ XVisualInfo *vis; -+ XRenderPictFormat *fmt; -+ int nvi; -+ int i; -+ -+ XVisualInfo tpl = { -+ .screen = xw.scr, -+ .depth = 32, -+ .class = TrueColor -+ }; -+ -+ vis = XGetVisualInfo(xw.dpy, -+ VisualScreenMask | VisualDepthMask | VisualClassMask, -+ &tpl, &nvi); -+ xw.vis = NULL; -+ for (i = 0; i < nvi; i++) { -+ fmt = XRenderFindVisualFormat(xw.dpy, vis[i].visual); -+ if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { -+ xw.vis = vis[i].visual; -+ break; -+ } -+ } -+ -+ XFree(vis); -+ -+ if (!xw.vis) { -+ fprintf(stderr, "Couldn't find ARGB visual.\n"); -+ exit(1); -+ } -+ } - - /* font */ - if (!FcInit()) -@@ -1028,7 +1080,11 @@ xinit(int cols, int rows) - xloadfonts(usedfont, 0); - - /* colors */ -- xw.cmap = XDefaultColormap(xw.dpy, xw.scr); -+ if (!USE_ARGB) -+ xw.cmap = XDefaultColormap(xw.dpy, xw.scr); -+ else -+ xw.cmap = XCreateColormap(xw.dpy, XRootWindow(xw.dpy, xw.scr), -+ xw.vis, None); - xloadcols(); - - /* adjust fixed window geometry */ -@@ -1051,16 +1107,15 @@ xinit(int cols, int rows) - if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) - parent = XRootWindow(xw.dpy, xw.scr); - xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t, -- win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput, -+ win.w, win.h, 0, xw.depth, InputOutput, - xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity - | CWEventMask | CWColormap, &xw.attrs); - - memset(&gcvalues, 0, sizeof(gcvalues)); - gcvalues.graphics_exposures = False; -- dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures, -- &gcvalues); -- xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, -- DefaultDepth(xw.dpy, xw.scr)); -+ xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, xw.depth); -+ dc.gc = XCreateGC(xw.dpy, (USE_ARGB) ? xw.buf: parent, -+ GCGraphicsExposures, &gcvalues); - XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel); - XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h); - diff --git a/patches/st-clipboard-20180309-c5ba9c0.diff b/patches/st-clipboard-20180309-c5ba9c0.diff deleted file mode 100644 index 4a14e2b..0000000 --- a/patches/st-clipboard-20180309-c5ba9c0.diff +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/x.c b/x.c -index 13fa9f4..88fd341 100644 ---- a/x.c -+++ b/x.c -@@ -624,6 +624,8 @@ setsel(char *str, Time t) - XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t); - if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win) - selclear(); -+ -+ xclipcopy(); - } - - void diff --git a/patches/st-no_bold_colors-0.8.1.diff b/patches/st-no_bold_colors-0.8.1.diff deleted file mode 100644 index 1bd4657..0000000 --- a/patches/st-no_bold_colors-0.8.1.diff +++ /dev/null @@ -1,25 +0,0 @@ -From e0a92b498278e42e33f8007fd7b622a05e5310eb Mon Sep 17 00:00:00 2001 -From: Linh Nguyen -Date: Wed, 28 Mar 2018 12:23:45 -0400 -Subject: [PATCH] port st-no_bold_colors patch to 0.8.1 - ---- - x.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/x.c b/x.c -index c343ba2..42e7e9f 100644 ---- a/x.c -+++ b/x.c -@@ -1295,7 +1295,7 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i - - /* Change basic system colors [0-7] to bright system colors [8-15] */ - if ((base.mode & ATTR_BOLD_FAINT) == ATTR_BOLD && BETWEEN(base.fg, 0, 7)) -- fg = &dc.col[base.fg + 8]; -+ fg = &dc.col[base.fg]; - - if (IS_SET(MODE_REVERSE)) { - if (fg == &dc.col[defaultfg]) { --- -2.16.3 - diff --git a/patches/st-scrollback-0.8.diff b/patches/st-scrollback-0.8.diff deleted file mode 100644 index a61601a..0000000 --- a/patches/st-scrollback-0.8.diff +++ /dev/null @@ -1,348 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 82b1b09..27d42ca 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -181,6 +181,8 @@ static Shortcut shortcuts[] = { - { TERMMOD, XK_Y, selpaste, {.i = 0} }, - { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, - { TERMMOD, XK_I, 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 65a0cb6..1d8c12a 100644 ---- a/st.c -+++ b/st.c -@@ -121,6 +121,9 @@ typedef struct { - int col; /* nb col */ - Line *line; /* screen */ - Line *alt; /* alternate screen */ -+ Line hist[HISTSIZE]; /* history buffer */ -+ int histi; /* history index */ -+ int scr; /* scroll back */ - int *dirty; /* dirtyness of lines */ - TCursor c; /* cursor */ - int ocx; /* old cursor col */ -@@ -188,8 +191,8 @@ static void tnewline(int); - static void tputtab(int); - static void tputc(Rune); - static void treset(void); --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 tsetdirt(int, int); -@@ -431,10 +434,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; -@@ -543,7 +546,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; -@@ -558,14 +561,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))) -@@ -586,14 +589,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; - } -@@ -624,13 +627,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; - -@@ -836,6 +839,9 @@ ttyread(void) - if (buflen > 0) - memmove(buf, buf + written, buflen); - -+ if (term.scr > 0 && term.scr < HISTSIZE-1) -+ term.scr++; -+ - return ret; - } - -@@ -843,6 +849,9 @@ void - ttywrite(const char *s, size_t n, int may_echo) - { - const char *next; -+ Arg arg = (Arg) { .i = term.scr }; -+ -+ kscrolldown(&arg); - - if (may_echo && IS_SET(MODE_ECHO)) - twrite(s, n, 1); -@@ -1054,13 +1063,54 @@ 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); - -+ 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; -+ } -+ - tsetdirt(orig, term.bot-n); - tclearregion(0, term.bot-n+1, term.col-1, term.bot); - -@@ -1074,13 +1124,20 @@ tscrolldown(int orig, int 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); - -+ 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); - -@@ -1129,7 +1186,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++; - } -@@ -1294,14 +1351,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 -@@ -1730,11 +1787,11 @@ csihandle(void) - break; - case 'S': /* SU -- Scroll 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 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 blank lines */ - DEFAULT(csiescseq.arg[0], 1); -@@ -2258,7 +2315,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); - } -@@ -2271,7 +2328,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); - } -@@ -2490,7 +2547,7 @@ twrite(const char *buf, int buflen, int show_ctrl) - 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; -@@ -2527,7 +2584,15 @@ tresize(int col, int row) - term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); - term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); - -- /* resize each row to new width, zero-pad if needed */ -+ 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 r w to new width, zero-pad if needed */ - for (i = 0; i < minrow; i++) { - term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); - term.alt[i] = xrealloc(term.alt[i], col * sizeof(Glyph)); -@@ -2584,7 +2649,7 @@ drawregion(int x1, int y1, int x2, int y2) - continue; - - term.dirty[y] = 0; -- xdrawline(term.line[y], x1, y, x2); -+ xdrawline(TLINE(y), x1, y, x2); - } - } - -@@ -2605,8 +2670,10 @@ draw(void) - cx--; - - drawregion(0, 0, term.col, term.row); -- xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], -- term.ocx, term.ocy, term.line[term.ocy][term.ocx]); -+ if (term.scr == 0) { -+ xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], -+ term.ocx, term.ocy, term.line[term.ocy][term.ocx]); -+ } - term.ocx = cx, term.ocy = term.c.y; - xfinishdraw(); - } -diff --git a/st.h b/st.h -index dac64d8..628e876 100644 ---- a/st.h -+++ b/st.h -@@ -3,6 +3,9 @@ - #include - #include - -+/* Arbitrary size */ -+#define HISTSIZE 2000 -+ - /* macros */ - #define MIN(a, b) ((a) < (b) ? (a) : (b)) - #define MAX(a, b) ((a) < (b) ? (b) : (a)) -@@ -19,6 +22,8 @@ - - #define TRUECOLOR(r,g,b) (1 << 24 | (r) << 16 | (g) << 8 | (b)) - #define IS_TRUECOL(x) (1 << 24 & (x)) -+#define TLINE(y) ((y) < term.scr ? term.hist[((y) + term.histi - term.scr \ -+ + HISTSIZE + 1) % HISTSIZE] : term.line[(y) - term.scr]) - - enum glyph_attribute { - ATTR_NULL = 0, -@@ -111,6 +116,9 @@ void *xmalloc(size_t); - void *xrealloc(void *, size_t); - char *xstrdup(char *); - -+void kscrolldown(const Arg *); -+void kscrollup(const Arg *); -+ - /* config.h globals */ - extern char *utmp; - extern char *stty_args; diff --git a/patches/st-scrollback-mouse-0.8.diff b/patches/st-scrollback-mouse-0.8.diff deleted file mode 100644 index 3b2729e..0000000 --- a/patches/st-scrollback-mouse-0.8.diff +++ /dev/null @@ -1,71 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 27d42ca..feec7e2 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -156,8 +156,14 @@ static unsigned int defaultattr = 11; - */ - static MouseShortcut mshortcuts[] = { - /* button mask string */ -- { Button4, XK_ANY_MOD, "\031" }, -- { Button5, XK_ANY_MOD, "\005" }, -+ { Button4, XK_NO_MOD, "\031" }, -+ { Button5, XK_NO_MOD, "\005" }, -+}; -+ -+MouseKey mkeys[] = { -+ /* button mask function argument */ -+ { Button4, ShiftMask, kscrollup, {.i = 1} }, -+ { Button5, ShiftMask, kscrolldown, {.i = 1} }, - }; - - /* Internal keyboard shortcuts. */ -diff --git a/st.h b/st.h -index 628e876..cdd25ae 100644 ---- a/st.h -+++ b/st.h -@@ -81,6 +81,13 @@ typedef union { - const void *v; - } Arg; - -+typedef struct { -+ uint b; -+ uint mask; -+ void (*func)(const Arg *); -+ const Arg arg; -+} MouseKey; -+ - void die(const char *, ...); - void redraw(void); - void draw(void); -@@ -129,3 +136,4 @@ extern char *termname; - extern unsigned int tabspaces; - extern unsigned int defaultfg; - extern unsigned int defaultbg; -+extern MouseKey mkeys[]; -diff --git a/x.c b/x.c -index d43a529..754d859 100644 ---- a/x.c -+++ b/x.c -@@ -409,6 +409,7 @@ bpress(XEvent *e) - { - struct timespec now; - MouseShortcut *ms; -+ MouseKey *mk; - int snap; - - if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forceselmod)) { -@@ -424,6 +425,14 @@ bpress(XEvent *e) - } - } - -+ for (mk = mkeys; mk < mkeys + LEN(mkeys); mk++) { -+ if (e->xbutton.button == mk->b -+ && match(mk->mask, e->xbutton.state)) { -+ mk->func(&mk->arg); -+ return; -+ } -+ } -+ - if (e->xbutton.button == Button1) { - /* - * If the user clicks below predefined timeouts specific diff --git a/patches/st-vertcenter-20160819-023225e.diff b/patches/st-vertcenter-20160819-023225e.diff deleted file mode 100644 index e3fca96..0000000 --- a/patches/st-vertcenter-20160819-023225e.diff +++ /dev/null @@ -1,44 +0,0 @@ -diff --git a/st.c b/st.c -index 2594c65..7285237 100644 ---- a/st.c -+++ b/st.c -@@ -268,6 +268,7 @@ typedef struct { - int w, h; /* window width and height */ - int ch; /* char height */ - int cw; /* char width */ -+ int cyo; /* char y offset */ - char state; /* focus, redraw, visible */ - int cursor; /* cursor style */ - } XWindow; -@@ -3359,6 +3360,7 @@ xloadfonts(char *fontstr, double fontsize) - /* Setting character width and height. */ - xw.cw = ceilf(dc.font.width * cwscale); - xw.ch = ceilf(dc.font.height * chscale); -+ xw.cyo = ceilf(dc.font.height * (chscale - 1) / 2); - - FcPatternDel(pattern, FC_SLANT); - FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); -@@ -3584,7 +3586,7 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x - font = &dc.bfont; - frcflags = FRC_BOLD; - } -- yp = winy + font->ascent; -+ yp = winy + font->ascent + xw.cyo; - } - - /* Lookup character index with default font. */ -@@ -3796,12 +3798,12 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i - - /* Render underline and strikethrough. */ - if (base.mode & ATTR_UNDERLINE) { -- XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent + 1, -+ XftDrawRect(xw.draw, fg, winx, winy + xw.cyo + dc.font.ascent + 1, - width, 1); - } - - if (base.mode & ATTR_STRUCK) { -- XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent / 3, -+ XftDrawRect(xw.draw, fg, winx, winy + xw.cyo + 2 * dc.font.ascent / 3, - width, 1); - } - diff --git a/run-patches.sh b/run-patches.sh deleted file mode 100755 index 48047e1..0000000 --- a/run-patches.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -patch < patches/st-clipboard-20180309-c5ba9c0.diff -patch < patches/st-no_bold_colors-0.8.1.diff -patch < patches/st-scrollback-0.8.diff -patch < patches/st-scrollback-mouse-0.8.diff -patch < patches/st-vertcenter-20180320-6ac8c8a.diff -patch < patches/st-alpha-0.8.1.diff diff --git a/solarized-alpha-toggle.patch b/solarized-alpha-toggle.patch new file mode 100644 index 0000000..901c392 --- /dev/null +++ b/solarized-alpha-toggle.patch @@ -0,0 +1,20 @@ +--- config.h 2018-05-01 14:09:36.752813283 -0700 ++++ config.sol.h 2018-05-01 14:10:20.132810913 -0700 +@@ -83,7 +83,7 @@ + unsigned int tabspaces = 8; + + /* bg opacity */ +-unsigned int alpha = 0xcd; ++unsigned int alpha = 0xff; + + static const char *colorname[] = { + "#073642", /* 0: black */ +@@ -114,7 +114,7 @@ + * foreground, background, cursor, reverse cursor + */ + unsigned int defaultfg = 12; +-unsigned int defaultbg = 256; ++unsigned int defaultbg = 0; + static unsigned int defaultcs = 14; + static unsigned int defaultrcs = 15; + diff --git a/st b/st new file mode 100755 index 0000000..3372f0e Binary files /dev/null and b/st differ diff --git a/st-remove.sh b/st-remove.sh deleted file mode 100755 index 48d3d41..0000000 --- a/st-remove.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -rm /usr/local/bin/st -rm /usr/local/share/man/man1/st.1 -rm /usr/share/terminfo/s/st* diff --git a/st.o b/st.o new file mode 100644 index 0000000..6dd0728 Binary files /dev/null and b/st.o differ diff --git a/x.o b/x.o new file mode 100644 index 0000000..7f356a4 Binary files /dev/null and b/x.o differ