I applied the st alpha patch to a previous commit in git, resolved conflicts, merged it in 0.8.1 and generated a patch to be used in my st 0.8.1 at work too. I thought of sharing here to avoid re-work in case anyone is going to make a patch to the last version.
Em qua, 21 de mar de 2018 às 18:14, Abraão C. de Santana < [email protected]> escreveu: > From: Abraão C. de Santana <[email protected]> > > --- > config.def.h | 6 ++++- > config.mk | 4 ++-- > st.h | 1 + > win.h | 4 ++++ > x.c | 71 > +++++++++++++++++++++++++++++++++++++++++++++++++++++------- > 5 files changed, 75 insertions(+), 11 deletions(-) > > diff --git a/config.def.h b/config.def.h > index 82b1b09..2c721e8 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 = 0xcc; > + > /* Terminal colors (16 first used in escape sequence) */ > static const char *colorname[] = { > /* 8 normal colors */ > @@ -109,6 +112,7 @@ static const char *colorname[] = { > /* more colors can be added after 255 to use with DefaultXX */ > "#cccccc", > "#555555", > + "black", > }; > > > @@ -117,7 +121,7 @@ static const char *colorname[] = { > * foreground, background, cursor, reverse cursor > */ > unsigned int defaultfg = 7; > -unsigned int defaultbg = 0; > +unsigned int defaultbg = 257; > static unsigned int defaultcs = 256; > static unsigned int defaultrcs = 257; > > diff --git a/config.mk b/config.mk > index 039c42c..b1fa717 100644 > --- a/config.mk > +++ b/config.mk > @@ -11,10 +11,10 @@ X11INC = /usr/X11R6/include > X11LIB = /usr/X11R6/lib > > # includes and libs > -INCS = -I$(X11INC) \ > +INCS = -I. -I/usr/include -I${X11INC} \ > `pkg-config --cflags fontconfig` \ > `pkg-config --cflags freetype2` > -LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \ > +LIBS = -L/usr/lib -lc -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 dac64d8..433c74f 100644 > --- a/st.h > +++ b/st.h > @@ -119,5 +119,6 @@ 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; > diff --git a/win.h b/win.h > index 31f327d..7ade3ae 100644 > --- a/win.h > +++ b/win.h > @@ -24,6 +24,10 @@ enum win_mode { > }; > > void xbell(void); > +/* alpha */ > +#define OPAQUE 0Xff > +#define USE_ARGB (alpha != OPAQUE && opt_embed == NULL) > + > void xclipcopy(void); > void xdrawcursor(int, int, Glyph, int, int, Glyph); > void xdrawline(Line, int, int, int); > diff --git a/x.c b/x.c > index c343ba2..a174419 100644 > --- a/x.c > +++ b/x.c > @@ -98,6 +98,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; > @@ -686,7 +687,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); > > @@ -746,6 +747,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; > } > > @@ -767,6 +775,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. > */ > @@ -1005,7 +1024,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()) > @@ -1015,7 +1067,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 */ > @@ -1038,16 +1094,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); > > -- > 2.16.2 > >
