(oh and I'm also new around here and wasn't subscribed to the mail lists, so if somebody already did this, I apologize).
Em qua, 21 de mar de 2018 às 18:18, Abraão Caldas de Santana < [email protected]> escreveu: > 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 >> >>
