Created
February 13, 2020 20:22
-
-
Save SteenSchutt/703400e9d20116e3b1bcf4c27174e571 to your computer and use it in GitHub Desktop.
An updated patch for status bar transparency in suckless/dwm. 100% credit goes to vicooi. I stole all of this from this commit: https://notabug.org/vicooi/dwm/commit/502967ea50115579e8e650d9b28b58a341ad8735
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 1c0b587..6a75355 100644 | |
--- a/config.def.h | |
+++ b/config.def.h | |
@@ -1,23 +1,31 @@ | |
/* See LICENSE file for copyright and license details. */ | |
/* appearance */ | |
-static const unsigned int borderpx = 1; /* border pixel of windows */ | |
-static const unsigned int snap = 32; /* snap pixel */ | |
-static const int showbar = 1; /* 0 means no bar */ | |
-static const int topbar = 1; /* 0 means bottom bar */ | |
-static const char *fonts[] = { "monospace:size=10" }; | |
-static const char dmenufont[] = "monospace:size=10"; | |
-static const char col_gray1[] = "#222222"; | |
-static const char col_gray2[] = "#444444"; | |
-static const char col_gray3[] = "#bbbbbb"; | |
-static const char col_gray4[] = "#eeeeee"; | |
-static const char col_cyan[] = "#005577"; | |
-static const char *colors[][3] = { | |
+static const unsigned int borderpx = 1; /* border pixel of windows */ | |
+static const unsigned int snap = 32; /* snap pixel */ | |
+static const int showbar = 1; /* 0 means no bar */ | |
+static const int topbar = 1; /* 0 means bottom bar */ | |
+static const char *fonts[] = { "monospace:size=10" }; | |
+static const char dmenufont[] = "monospace:size=10"; | |
+static const char col_gray1[] = "#222222"; | |
+static const char col_gray2[] = "#444444"; | |
+static const char col_gray3[] = "#bbbbbb"; | |
+static const char col_gray4[] = "#eeeeee"; | |
+static const char col_cyan[] = "#005577"; | |
+static const unsigned int baralpha = 0xd0; | |
+static const unsigned int borderalpha = OPAQUE; | |
+static const char *colors[][3] = { | |
/* fg bg border */ | |
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, | |
[SchemeSel] = { col_gray4, col_cyan, col_cyan }, | |
}; | |
+static const unsigned int alphas[][3] = { | |
+ /* fg bg border */ | |
+ [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, | |
+ [SchemeSel] = { OPAQUE, baralpha, borderalpha }, | |
+}; | |
+ | |
/* tagging */ | |
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; | |
diff --git a/config.mk b/config.mk | |
index 6d36cb7..3cb1518 100644 | |
--- a/config.mk | |
+++ b/config.mk | |
@@ -22,7 +22,7 @@ FREETYPEINC = /usr/include/freetype2 | |
# includes and libs | |
INCS = -I${X11INC} -I${FREETYPEINC} | |
-LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} | |
+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lXrender | |
# flags | |
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} | |
diff --git a/drw.c b/drw.c | |
index 8fd1ca4..5174c3e 100644 | |
--- a/drw.c | |
+++ b/drw.c | |
@@ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen) | |
} | |
Drw * | |
-drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) | |
+drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap) | |
{ | |
Drw *drw = ecalloc(1, sizeof(Drw)); | |
@@ -70,8 +70,11 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h | |
drw->root = root; | |
drw->w = w; | |
drw->h = h; | |
- drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); | |
- drw->gc = XCreateGC(dpy, root, 0, NULL); | |
+ drw->visual = visual; | |
+ drw->depth = depth; | |
+ drw->cmap = cmap; | |
+ drw->drawable = XCreatePixmap(dpy, root, w, h, depth); | |
+ drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL); | |
XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); | |
return drw; | |
@@ -87,7 +90,7 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h) | |
drw->h = h; | |
if (drw->drawable) | |
XFreePixmap(drw->dpy, drw->drawable); | |
- drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); | |
+ drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth); | |
} | |
void | |
@@ -193,21 +196,22 @@ drw_fontset_free(Fnt *font) | |
} | |
void | |
-drw_clr_create(Drw *drw, Clr *dest, const char *clrname) | |
+drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha) | |
{ | |
if (!drw || !dest || !clrname) | |
return; | |
- if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), | |
- DefaultColormap(drw->dpy, drw->screen), | |
- clrname, dest)) | |
+ if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap, | |
+ clrname, dest)) | |
die("error, cannot allocate color '%s'", clrname); | |
+ | |
+ dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24); | |
} | |
/* Wrapper to create color schemes. The caller has to call free(3) on the | |
* returned color scheme when done using it. */ | |
Clr * | |
-drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) | |
+drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount) | |
{ | |
size_t i; | |
Clr *ret; | |
@@ -217,7 +221,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) | |
return NULL; | |
for (i = 0; i < clrcount; i++) | |
- drw_clr_create(drw, &ret[i], clrnames[i]); | |
+ drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]); | |
return ret; | |
} | |
@@ -273,9 +277,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp | |
} else { | |
XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); | |
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); | |
- d = XftDrawCreate(drw->dpy, drw->drawable, | |
- DefaultVisual(drw->dpy, drw->screen), | |
- DefaultColormap(drw->dpy, drw->screen)); | |
+ d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap); | |
x += lpad; | |
w -= lpad; | |
} | |
diff --git a/drw.h b/drw.h | |
index 4bcd5ad..a56f523 100644 | |
--- a/drw.h | |
+++ b/drw.h | |
@@ -20,6 +20,9 @@ typedef struct { | |
Display *dpy; | |
int screen; | |
Window root; | |
+ Visual *visual; | |
+ unsigned int depth; | |
+ Colormap cmap; | |
Drawable drawable; | |
GC gc; | |
Clr *scheme; | |
@@ -27,7 +30,7 @@ typedef struct { | |
} Drw; | |
/* Drawable abstraction */ | |
-Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); | |
+Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap); | |
void drw_resize(Drw *drw, unsigned int w, unsigned int h); | |
void drw_free(Drw *drw); | |
@@ -38,8 +41,8 @@ unsigned int drw_fontset_getwidth(Drw *drw, const char *text); | |
void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); | |
/* Colorscheme abstraction */ | |
-void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); | |
-Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); | |
+void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha); | |
+Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount); | |
/* Cursor abstraction */ | |
Cur *drw_cur_create(Drw *drw, int shape); | |
diff --git a/dwm.c b/dwm.c | |
index 4465af1..c6d35b8 100644 | |
--- a/dwm.c | |
+++ b/dwm.c | |
@@ -57,6 +57,8 @@ | |
#define TAGMASK ((1 << LENGTH(tags)) - 1) | |
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) | |
+#define OPAQUE 0xffU | |
+ | |
/* enums */ | |
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ | |
enum { SchemeNorm, SchemeSel }; /* color schemes */ | |
@@ -232,6 +234,7 @@ static Monitor *wintomon(Window w); | |
static int xerror(Display *dpy, XErrorEvent *ee); | |
static int xerrordummy(Display *dpy, XErrorEvent *ee); | |
static int xerrorstart(Display *dpy, XErrorEvent *ee); | |
+static void xinitvisual(); | |
static void zoom(const Arg *arg); | |
/* variables */ | |
@@ -268,6 +271,11 @@ static Drw *drw; | |
static Monitor *mons, *selmon; | |
static Window root, wmcheckwin; | |
+static int useargb = 0; | |
+static Visual *visual; | |
+static int depth; | |
+static Colormap cmap; | |
+ | |
/* configuration, allows nested code to access above variables */ | |
#include "config.h" | |
@@ -1541,7 +1549,8 @@ setup(void) | |
sw = DisplayWidth(dpy, screen); | |
sh = DisplayHeight(dpy, screen); | |
root = RootWindow(dpy, screen); | |
- drw = drw_create(dpy, screen, root, sw, sh); | |
+ xinitvisual(); | |
+ drw = drw_create(dpy, screen, root, sw, sh, visual, depth, cmap); | |
if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) | |
die("no fonts could be loaded."); | |
lrpad = drw->fonts->h; | |
@@ -1569,7 +1578,7 @@ setup(void) | |
/* init appearance */ | |
scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); | |
for (i = 0; i < LENGTH(colors); i++) | |
- scheme[i] = drw_scm_create(drw, colors[i], 3); | |
+ scheme[i] = drw_scm_create(drw, colors[i], alphas[i], 3); | |
/* init bars */ | |
updatebars(); | |
updatestatus(); | |
@@ -1804,16 +1813,18 @@ updatebars(void) | |
Monitor *m; | |
XSetWindowAttributes wa = { | |
.override_redirect = True, | |
- .background_pixmap = ParentRelative, | |
+ .background_pixel = 0, | |
+ .border_pixel = 0, | |
+ .colormap = cmap, | |
.event_mask = ButtonPressMask|ExposureMask | |
}; | |
XClassHint ch = {"dwm", "dwm"}; | |
for (m = mons; m; m = m->next) { | |
if (m->barwin) | |
continue; | |
- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), | |
- CopyFromParent, DefaultVisual(dpy, screen), | |
- CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); | |
+ m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, depth, | |
+ InputOutput, visual, | |
+ CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa); | |
XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); | |
XMapRaised(dpy, m->barwin); | |
XSetClassHint(dpy, m->barwin, &ch); | |
@@ -2110,6 +2121,42 @@ xerrorstart(Display *dpy, XErrorEvent *ee) | |
return -1; | |
} | |
+void | |
+xinitvisual() | |
+{ | |
+ XVisualInfo *infos; | |
+ XRenderPictFormat *fmt; | |
+ int nitems; | |
+ int i; | |
+ XVisualInfo tpl = { | |
+ .screen = screen, | |
+ .depth = 32, | |
+ .class = TrueColor | |
+ }; | |
+ long masks = VisualScreenMask | VisualDepthMask | VisualClassMask; | |
+ | |
+ infos = XGetVisualInfo(dpy, masks, &tpl, &nitems); | |
+ visual = NULL; | |
+ for(i = 0; i < nitems; i ++) { | |
+ fmt = XRenderFindVisualFormat(dpy, infos[i].visual); | |
+ if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { | |
+ visual = infos[i].visual; | |
+ depth = infos[i].depth; | |
+ cmap = XCreateColormap(dpy, root, visual, AllocNone); | |
+ useargb = 1; | |
+ break; | |
+ } | |
+ } | |
+ | |
+ XFree(infos); | |
+ | |
+ if (! visual) { | |
+ visual = DefaultVisual(dpy, screen); | |
+ depth = DefaultDepth(dpy, screen); | |
+ cmap = DefaultColormap(dpy, screen); | |
+ } | |
+} | |
+ | |
void | |
zoom(const Arg *arg) | |
{ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment