Re: [dev] [st] [patch] ARGB background for st-0.4.1

From: <jiceher_AT_free.fr>
Date: Wed, 12 Jun 2013 10:36:13 +0200 (CEST)

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" <esjeon_AT_live.com>
À: dev_AT_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
_AT_@ -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[] = {
_AT_@ -52,6 +54,7 @@ static const char *colorname[] = {
 
     /* more colors can be added after 255 to use with DefaultXX */
     "#cccccc",
+    "black",
 };
 
 
_AT_@ -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
_AT_@ -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
_AT_@ -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 */
 
_AT_@ -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"
 
_AT_@ -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;
 
_AT_@ -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);
 }
_AT_@ -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++) {
_AT_@ -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())
_AT_@ -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 */
_AT_@ -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,
_AT_@ -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);
Received on Wed Jun 12 2013 - 10:36:13 CEST

This archive was generated by hypermail 2.3.0 : Wed Jun 12 2013 - 10:48:05 CEST