applied alpha patch
This commit is contained in:
		
							parent
							
								
									f04cac6d6e
								
							
						
					
					
						commit
						19c8ed5228
					
				| @ -12,11 +12,18 @@ static const char col_gray2[]       = "#444444"; | |||||||
| static const char col_gray3[]       = "#bbbbbb"; | static const char col_gray3[]       = "#bbbbbb"; | ||||||
| static const char col_gray4[]       = "#eeeeee"; | static const char col_gray4[]       = "#eeeeee"; | ||||||
| static const char col_cyan[]        = "#005577"; | static const char col_cyan[]        = "#005577"; | ||||||
|  | static const unsigned int baralpha = 0xd0; | ||||||
|  | static const unsigned int borderalpha = OPAQUE; | ||||||
| static const char *colors[][3]      = { | static const char *colors[][3]      = { | ||||||
| 	/*               fg         bg         border   */ | 	/*               fg         bg         border   */ | ||||||
| 	[SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, | 	[SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, | ||||||
| 	[SchemeSel]  = { col_gray4, col_cyan,  col_cyan  }, | 	[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 */ | /* tagging */ | ||||||
| static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; | static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ FREETYPEINC = /usr/include/freetype2 | |||||||
| 
 | 
 | ||||||
| # includes and libs
 | # includes and libs
 | ||||||
| INCS = -I${X11INC} -I${FREETYPEINC} | INCS = -I${X11INC} -I${FREETYPEINC} | ||||||
| LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} | LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lXrender | ||||||
| 
 | 
 | ||||||
| # flags
 | # flags
 | ||||||
| CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} | CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} | ||||||
|  | |||||||
							
								
								
									
										26
									
								
								drw.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								drw.c
									
									
									
									
									
								
							| @ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Drw * | 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)); | 	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->root = root; | ||||||
| 	drw->w = w; | 	drw->w = w; | ||||||
| 	drw->h = h; | 	drw->h = h; | ||||||
| 	drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); | 	drw->visual = visual; | ||||||
| 	drw->gc = XCreateGC(dpy, root, 0, NULL); | 	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); | 	XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); | ||||||
| 
 | 
 | ||||||
| 	return drw; | 	return drw; | ||||||
| @ -87,7 +90,7 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h) | |||||||
| 	drw->h = h; | 	drw->h = h; | ||||||
| 	if (drw->drawable) | 	if (drw->drawable) | ||||||
| 		XFreePixmap(drw->dpy, 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 | void | ||||||
| @ -194,21 +197,22 @@ drw_fontset_free(Fnt *font) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | 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) | 	if (!drw || !dest || !clrname) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), | 	if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap, | ||||||
| 	                       DefaultColormap(drw->dpy, drw->screen), |  | ||||||
| 	                       clrname, dest)) | 	                       clrname, dest)) | ||||||
| 		die("error, cannot allocate color '%s'", clrname); | 		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
 | /* Wrapper to create color schemes. The caller has to call free(3) on the
 | ||||||
|  * returned color scheme when done using it. */ |  * returned color scheme when done using it. */ | ||||||
| Clr * | 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; | 	size_t i; | ||||||
| 	Clr *ret; | 	Clr *ret; | ||||||
| @ -218,7 +222,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) | |||||||
| 		return NULL; | 		return NULL; | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < clrcount; i++) | 	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; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -274,9 +278,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp | |||||||
| 	} else { | 	} else { | ||||||
| 		XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); | 		XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); | ||||||
| 		XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); | 		XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); | ||||||
| 		d = XftDrawCreate(drw->dpy, drw->drawable, | 		d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap); | ||||||
| 		                  DefaultVisual(drw->dpy, drw->screen), |  | ||||||
| 		                  DefaultColormap(drw->dpy, drw->screen)); |  | ||||||
| 		x += lpad; | 		x += lpad; | ||||||
| 		w -= lpad; | 		w -= lpad; | ||||||
| 	} | 	} | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								drw.h
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								drw.h
									
									
									
									
									
								
							| @ -20,6 +20,9 @@ typedef struct { | |||||||
| 	Display *dpy; | 	Display *dpy; | ||||||
| 	int screen; | 	int screen; | ||||||
| 	Window root; | 	Window root; | ||||||
|  | 	Visual *visual; | ||||||
|  | 	unsigned int depth; | ||||||
|  | 	Colormap cmap; | ||||||
| 	Drawable drawable; | 	Drawable drawable; | ||||||
| 	GC gc; | 	GC gc; | ||||||
| 	Clr *scheme; | 	Clr *scheme; | ||||||
| @ -27,7 +30,7 @@ typedef struct { | |||||||
| } Drw; | } Drw; | ||||||
| 
 | 
 | ||||||
| /* Drawable abstraction */ | /* 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_resize(Drw *drw, unsigned int w, unsigned int h); | ||||||
| void drw_free(Drw *drw); | 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); | void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); | ||||||
| 
 | 
 | ||||||
| /* Colorscheme abstraction */ | /* Colorscheme abstraction */ | ||||||
| void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); | void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha); | ||||||
| Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); | Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount); | ||||||
| 
 | 
 | ||||||
| /* Cursor abstraction */ | /* Cursor abstraction */ | ||||||
| Cur *drw_cur_create(Drw *drw, int shape); | Cur *drw_cur_create(Drw *drw, int shape); | ||||||
|  | |||||||
							
								
								
									
										60
									
								
								dwm.c
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								dwm.c
									
									
									
									
									
								
							| @ -57,6 +57,8 @@ | |||||||
| #define TAGMASK                 ((1 << LENGTH(tags)) - 1) | #define TAGMASK                 ((1 << LENGTH(tags)) - 1) | ||||||
| #define TEXTW(X)                (drw_fontset_getwidth(drw, (X)) + lrpad) | #define TEXTW(X)                (drw_fontset_getwidth(drw, (X)) + lrpad) | ||||||
| 
 | 
 | ||||||
|  | #define OPAQUE                  0xffU | ||||||
|  | 
 | ||||||
| /* enums */ | /* enums */ | ||||||
| enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ | enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ | ||||||
| enum { SchemeNorm, SchemeSel }; /* color schemes */ | enum { SchemeNorm, SchemeSel }; /* color schemes */ | ||||||
| @ -233,6 +235,7 @@ static Monitor *wintomon(Window w); | |||||||
| static int xerror(Display *dpy, XErrorEvent *ee); | static int xerror(Display *dpy, XErrorEvent *ee); | ||||||
| static int xerrordummy(Display *dpy, XErrorEvent *ee); | static int xerrordummy(Display *dpy, XErrorEvent *ee); | ||||||
| static int xerrorstart(Display *dpy, XErrorEvent *ee); | static int xerrorstart(Display *dpy, XErrorEvent *ee); | ||||||
|  | static void xinitvisual(); | ||||||
| static void zoom(const Arg *arg); | static void zoom(const Arg *arg); | ||||||
| 
 | 
 | ||||||
| /* variables */ | /* variables */ | ||||||
| @ -269,6 +272,11 @@ static Drw *drw; | |||||||
| static Monitor *mons, *selmon; | static Monitor *mons, *selmon; | ||||||
| static Window root, wmcheckwin; | 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 */ | /* configuration, allows nested code to access above variables */ | ||||||
| #include "config.h" | #include "config.h" | ||||||
| 
 | 
 | ||||||
| @ -1542,7 +1550,8 @@ setup(void) | |||||||
| 	sw = DisplayWidth(dpy, screen); | 	sw = DisplayWidth(dpy, screen); | ||||||
| 	sh = DisplayHeight(dpy, screen); | 	sh = DisplayHeight(dpy, screen); | ||||||
| 	root = RootWindow(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))) | 	if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) | ||||||
| 		die("no fonts could be loaded."); | 		die("no fonts could be loaded."); | ||||||
| 	lrpad = drw->fonts->h; | 	lrpad = drw->fonts->h; | ||||||
| @ -1570,7 +1579,7 @@ setup(void) | |||||||
| 	/* init appearance */ | 	/* init appearance */ | ||||||
| 	scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); | 	scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); | ||||||
| 	for (i = 0; i < LENGTH(colors); i++) | 	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 */ | 	/* init bars */ | ||||||
| 	updatebars(); | 	updatebars(); | ||||||
| 	updatestatus(); | 	updatestatus(); | ||||||
| @ -1807,16 +1816,18 @@ updatebars(void) | |||||||
| 	Monitor *m; | 	Monitor *m; | ||||||
| 	XSetWindowAttributes wa = { | 	XSetWindowAttributes wa = { | ||||||
| 		.override_redirect = True, | 		.override_redirect = True, | ||||||
| 		.background_pixmap = ParentRelative, | 		.background_pixel = 0, | ||||||
|  | 		.border_pixel = 0, | ||||||
|  | 		.colormap = cmap, | ||||||
| 		.event_mask = ButtonPressMask|ExposureMask | 		.event_mask = ButtonPressMask|ExposureMask | ||||||
| 	}; | 	}; | ||||||
| 	XClassHint ch = {"dwm", "dwm"}; | 	XClassHint ch = {"dwm", "dwm"}; | ||||||
| 	for (m = mons; m; m = m->next) { | 	for (m = mons; m; m = m->next) { | ||||||
| 		if (m->barwin) | 		if (m->barwin) | ||||||
| 			continue; | 			continue; | ||||||
| 		m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), | 		m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, depth, | ||||||
| 				CopyFromParent, DefaultVisual(dpy, screen), | 		                          InputOutput, visual, | ||||||
| 				CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); | 		                          CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa); | ||||||
| 		XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); | 		XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); | ||||||
| 		XMapRaised(dpy, m->barwin); | 		XMapRaised(dpy, m->barwin); | ||||||
| 		XSetClassHint(dpy, m->barwin, &ch); | 		XSetClassHint(dpy, m->barwin, &ch); | ||||||
| @ -2113,6 +2124,43 @@ xerrorstart(Display *dpy, XErrorEvent *ee) | |||||||
| 	return -1; | 	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 | void | ||||||
| zoom(const Arg *arg) | zoom(const Arg *arg) | ||||||
| { | { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user