Last active
March 16, 2021 23:04
-
-
Save sineemore/816e3241a996aac9e45cbdf4dba83a7c to your computer and use it in GitHub Desktop.
proper st alpha patch with premultiplied colors
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/config.def.h b/config.def.h | |
index 546edda..4f3e806 100644 | |
--- a/config.def.h | |
+++ b/config.def.h | |
@@ -82,6 +82,9 @@ char *termname = "st-256color"; | |
*/ | |
unsigned int tabspaces = 8; | |
+/* bg opacity */ | |
+float alpha = 0.8; | |
+ | |
/* 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 = 258; | |
static unsigned int defaultcs = 256; | |
static unsigned int defaultrcs = 257; | |
diff --git a/config.mk b/config.mk | |
index 0cbb002..1d2f0e2 100644 | |
--- a/config.mk | |
+++ b/config.mk | |
@@ -16,7 +16,7 @@ PKG_CONFIG = pkg-config | |
INCS = -I$(X11INC) \ | |
`$(PKG_CONFIG) --cflags fontconfig` \ | |
`$(PKG_CONFIG) --cflags freetype2` | |
-LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \ | |
+LIBS = -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 a1928ca..64e6ea3 100644 | |
--- a/st.h | |
+++ b/st.h | |
@@ -121,3 +121,4 @@ extern char *termname; | |
extern unsigned int tabspaces; | |
extern unsigned int defaultfg; | |
extern unsigned int defaultbg; | |
+extern float alpha; | |
diff --git a/x.c b/x.c | |
index 1f62129..a13f28a 100644 | |
--- a/x.c | |
+++ b/x.c | |
@@ -105,6 +105,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; | |
@@ -242,6 +243,7 @@ static char *usedfont = NULL; | |
static double usedfontsize = 0; | |
static double defaultfontsize = 0; | |
+static char *opt_alpha = NULL; | |
static char *opt_class = NULL; | |
static char **opt_cmd = NULL; | |
static char *opt_embed = NULL; | |
@@ -719,7 +721,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); | |
@@ -779,6 +781,23 @@ xloadcols(void) | |
else | |
die("could not allocate color %d\n", i); | |
} | |
+ | |
+ /* set alpha value of bg color */ | |
+ if (opt_alpha) | |
+ alpha = strtof(opt_alpha, NULL); | |
+ | |
+ Color *c = &dc.col[defaultbg]; | |
+ c->color.red *= alpha; | |
+ c->color.green *= alpha; | |
+ c->color.blue *= alpha; | |
+ c->color.alpha = (unsigned short)(0xffff * alpha); | |
+ | |
+ c->pixel = \ | |
+ (unsigned char)(0xff * alpha) << 24 \ | |
+ + ((unsigned char)(c->color.red / 0xffff.0p0 * 0xff) << 16) \ | |
+ + ((unsigned char)(c->color.green / 0xffff.0p0 * 0xff) << 8) \ | |
+ + (unsigned char)(c->color.blue / 0xffff.0p0 * 0xff); | |
+ | |
loaded = 1; | |
} | |
@@ -1089,11 +1108,23 @@ xinit(int cols, int rows) | |
Window parent; | |
pid_t thispid = getpid(); | |
XColor xmousefg, xmousebg; | |
+ XWindowAttributes attr; | |
+ XVisualInfo vis; | |
if (!(xw.dpy = XOpenDisplay(NULL))) | |
die("can't open display\n"); | |
xw.scr = XDefaultScreen(xw.dpy); | |
- xw.vis = XDefaultVisual(xw.dpy, xw.scr); | |
+ | |
+ if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) { | |
+ parent = XRootWindow(xw.dpy, xw.scr); | |
+ xw.depth = 32; | |
+ } else { | |
+ XGetWindowAttributes(xw.dpy, parent, &attr); | |
+ xw.depth = attr.depth; | |
+ } | |
+ | |
+ XMatchVisualInfo(xw.dpy, xw.scr, xw.depth, TrueColor, &vis); | |
+ xw.vis = vis.visual; | |
/* font */ | |
if (!FcInit()) | |
@@ -1103,7 +1134,7 @@ xinit(int cols, int rows) | |
xloadfonts(usedfont, 0); | |
/* colors */ | |
- xw.cmap = XDefaultColormap(xw.dpy, xw.scr); | |
+ xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None); | |
xloadcols(); | |
/* adjust fixed window geometry */ | |
@@ -1123,19 +1154,15 @@ xinit(int cols, int rows) | |
| ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; | |
xw.attrs.colormap = xw.cmap; | |
- 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, xw.buf, GCGraphicsExposures, &gcvalues); | |
XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel); | |
XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h); | |
@@ -1980,6 +2007,9 @@ main(int argc, char *argv[]) | |
case 'a': | |
allowaltscreen = 0; | |
break; | |
+ case 'A': | |
+ opt_alpha = EARGF(usage()); | |
+ break; | |
case 'c': | |
opt_class = EARGF(usage()); | |
break; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
You are welcome!