You probably also need a compositor. On 12 Jun 2013 09:36, <jice...@free.fr> wrote:
> Hi, > > I would like to test your patch. > I have successfully applied it to HEAD of st git repository. > I compile it but it seems that my st it stills not transparent at all (I > have modified alpha in config.h with different values, same results). > > Did you have an example of configuration or I have missed something? > > Regards, > > JiCeher > > ----- Mail original ----- > De: "Eon Seob Jeon" <esj...@live.com> > À: dev@suckless.org > Envoyé: Mercredi 12 Juin 2013 02:34:49 > Objet: [dev] [st] [patch] ARGB background for st-0.4.1 > > Hi. > > I've made a short patch that enables semi-transparent background for > st-0.4.1. The same mechanism should work with recent commits. > > Some important notes: > 1) This changes background opacity only. > 2) The color designated by "defaultbg" are modified during the > initialization, so you should add another color to be used as background. > (check st.c:2360 to see what actually happens) > 3) There's a bug in this patch: if st is embeded into an ARGB-enabled > window, it crashes. (What an irony.) > 4) The maximum value of 'alpha' is 0xff (= OPAQUE) > > Regards > > Eon > > > > diff --git a/config.def.h b/config.def.h > index d1c20bd..cc9f34d 100644 > --- a/config.def.h > +++ b/config.def.h > @@ -25,6 +25,8 @@ static char termname[] = "st-256color"; >  >  static unsigned int tabspaces = 8; >  > +/* background opacity */ > +static const int alpha = 0xdd; >  >  /* Terminal colors (16 first used in escape sequence) */ >  static const char *colorname[] = { > @@ -52,6 +54,7 @@ static const char *colorname[] = { >  >     /* more colors can be added after 255 to use with DefaultXX */ >     "#cccccc", > +   "black", >  }; >  >  > @@ -60,7 +63,7 @@ static const char *colorname[] = { >  * foreground, background, cursor >  */ >  static unsigned int defaultfg = 7; > -static unsigned int defaultbg = 0; > +static unsigned int defaultbg = 257; >  static unsigned int defaultcs = 256; >  >  /* > diff --git a/config.mk b/config.mk > index 9431de2..0b92bf2 100644 > --- a/config.mk > +++ b/config.mk > @@ -14,7 +14,7 @@ X11LIB = /usr/X11R6/lib >  INCS = -I. -I/usr/include -I${X11INC} \ >        `pkg-config --cflags fontconfig` \ >        `pkg-config --cflags freetype2` > -LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lutil -lXext -lXft \ > +LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lutil -lXext -lXft -lXrender \ >        `pkg-config --libs fontconfig` \ >        `pkg-config --libs freetype2` >  > diff --git a/st.c b/st.c > index 686ed5d..de4d0f9 100644 > --- a/st.c > +++ b/st.c > @@ -60,6 +60,7 @@ char *argv0; >  #define XK_ANY_MOD   UINT_MAX >  #define XK_NO_MOD    0 >  #define XK_SWITCH_MOD (1<<13) > +#define OPAQUE 0Xff >  >  #define REDRAW_TIMEOUT (80*1000) /* 80 ms */ >  > @@ -74,6 +75,7 @@ char *argv0; >  #define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || > (a).bg != (b).bg) >  #define IS_SET(flag) ((term.mode & (flag)) != 0) >  #define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + > (t1.tv_usec-t2.tv_usec)/1000) > +#define USE_ARGB (alpha != OPAQUE && opt_embed == NULL) >  >  #define VT102ID "\033[?6c" >  > @@ -215,6 +217,7 @@ typedef struct { >     int w, h; /* window width and height */ >     int ch; /* char height */ >     int cw; /* char width */ > +   int depth; /* bit depth */ >     char state; /* focus, redraw, visible */ >  } XWindow; >  > @@ -2335,8 +2338,7 @@ xresize(int col, int row) { >     xw.th = MAX(1, row * xw.ch); >  >     XFreePixmap(xw.dpy, xw.buf); > -   xw.buf = XCreatePixmap(xw.dpy, xw.win, xw.w, xw.h, > -         DefaultDepth(xw.dpy, xw.scr)); > +   xw.buf = XCreatePixmap(xw.dpy, xw.win, xw.w, xw.h, xw.depth); >     XftDrawChange(xw.draw, xw.buf); >     xclear(0, 0, xw.w, xw.h); >  } > @@ -2360,6 +2362,13 @@ xloadcols(void) { >        } >     } >  > +   /* set alpha value of bg color */ > +   if (USE_ARGB) { > +      dc.col[defaultbg].color.alpha = (0xffff * alpha) / OPAQUE; > //0xcccc; > +      dc.col[defaultbg].pixel &= 0x00111111; > +      dc.col[defaultbg].pixel |= alpha << 24; // 0xcc000000; > +   } > + >     /* load colors [16-255] ; same colors as xterm */ >     for(i = 16, r = 0; r < 6; r++) { >        for(g = 0; g < 6; g++) { > @@ -2603,7 +2612,38 @@ xinit(void) { >     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()) > @@ -2613,7 +2653,10 @@ xinit(void) { >     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 */ > @@ -2647,7 +2690,7 @@ xinit(void) { >     parent = opt_embed ? strtol(opt_embed, NULL, 0) : \ >           XRootWindow(xw.dpy, xw.scr); >     xw.win = XCreateWindow(xw.dpy, parent, xw.fx, xw.fy, > -         xw.w, xw.h, 0, XDefaultDepth(xw.dpy, xw.scr), > InputOutput, > +         xw.w, xw.h, 0, xw.depth, InputOutput, >           xw.vis, >           CWBackPixel | CWBorderPixel | CWBitGravity | > CWEventMask >           | CWColormap, > @@ -2655,10 +2698,11 @@ xinit(void) { >  >     memset(&gcvalues, 0, sizeof(gcvalues)); >     gcvalues.graphics_exposures = False; > -   dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures, > +   xw.buf = XCreatePixmap(xw.dpy, xw.win, xw.w, xw.h, xw.depth); > +   dc.gc = XCreateGC(xw.dpy, > +         (USE_ARGB)? xw.buf: parent, > +         GCGraphicsExposures, >           &gcvalues); > -   xw.buf = XCreatePixmap(xw.dpy, xw.win, xw.w, xw.h, > -         DefaultDepth(xw.dpy, xw.scr)); >     XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel); >     XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, xw.w, xw.h); >