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
>
>

Reply via email to