Alpha
This commit is contained in:
		| @ -2,6 +2,7 @@ | |||||||
| /* Default settings; can be overriden by command line. */ | /* Default settings; can be overriden by command line. */ | ||||||
|  |  | ||||||
| static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */ | static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */ | ||||||
|  | static const unsigned int alpha = 0xf0; | ||||||
| /* -fn option overrides fonts[0]; default X11 font or font set */ | /* -fn option overrides fonts[0]; default X11 font or font set */ | ||||||
| static const char *fonts[] = { | static const char *fonts[] = { | ||||||
| 	"monospace:size=10" | 	"monospace:size=10" | ||||||
| @ -13,6 +14,13 @@ static const char *colors[SchemeLast][2] = { | |||||||
| 	[SchemeSel] = { "#eeeeee", "#005577" }, | 	[SchemeSel] = { "#eeeeee", "#005577" }, | ||||||
| 	[SchemeOut] = { "#000000", "#00ffff" }, | 	[SchemeOut] = { "#000000", "#00ffff" }, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | static const unsigned int alphas[SchemeLast][2] = { | ||||||
|  | 	[SchemeNorm] = { OPAQUE, alpha }, | ||||||
|  | 	[SchemeSel] = { OPAQUE, alpha }, | ||||||
|  | 	[SchemeOut] = { OPAQUE, alpha }, | ||||||
|  | }; | ||||||
|  |  | ||||||
| /* -l option; if nonzero, dmenu uses vertical list with given number of lines */ | /* -l option; if nonzero, dmenu uses vertical list with given number of lines */ | ||||||
| static unsigned int lines      = 0; | static unsigned int lines      = 0; | ||||||
|  |  | ||||||
|  | |||||||
							
								
								
									
										62
									
								
								dmenu.c
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								dmenu.c
									
									
									
									
									
								
							| @ -10,6 +10,7 @@ | |||||||
|  |  | ||||||
| #include <X11/Xlib.h> | #include <X11/Xlib.h> | ||||||
| #include <X11/Xatom.h> | #include <X11/Xatom.h> | ||||||
|  | #include <X11/Xproto.h> | ||||||
| #include <X11/Xutil.h> | #include <X11/Xutil.h> | ||||||
| #ifdef XINERAMA | #ifdef XINERAMA | ||||||
| #include <X11/extensions/Xinerama.h> | #include <X11/extensions/Xinerama.h> | ||||||
| @ -25,6 +26,8 @@ | |||||||
| #define LENGTH(X)             (sizeof X / sizeof X[0]) | #define LENGTH(X)             (sizeof X / sizeof X[0]) | ||||||
| #define TEXTW(X)              (drw_fontset_getwidth(drw, (X)) + lrpad) | #define TEXTW(X)              (drw_fontset_getwidth(drw, (X)) + lrpad) | ||||||
|  |  | ||||||
|  | #define OPAQUE                0xffU | ||||||
|  |  | ||||||
| /* enums */ | /* enums */ | ||||||
| enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ | enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ | ||||||
|  |  | ||||||
| @ -53,10 +56,16 @@ static XIC xic; | |||||||
| static Drw *drw; | static Drw *drw; | ||||||
| static Clr *scheme[SchemeLast]; | static Clr *scheme[SchemeLast]; | ||||||
|  |  | ||||||
|  | static int useargb = 0; | ||||||
|  | static Visual *visual; | ||||||
|  | static int depth; | ||||||
|  | static Colormap cmap; | ||||||
|  |  | ||||||
| #include "config.h" | #include "config.h" | ||||||
|  |  | ||||||
| static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; | static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; | ||||||
| static char *(*fstrstr)(const char *, const char *) = strstr; | static char *(*fstrstr)(const char *, const char *) = strstr; | ||||||
|  | static void xinitvisual(); | ||||||
|  |  | ||||||
| static unsigned int | static unsigned int | ||||||
| textw_clamp(const char *str, unsigned int n) | textw_clamp(const char *str, unsigned int n) | ||||||
| @ -628,7 +637,7 @@ setup(void) | |||||||
| #endif | #endif | ||||||
| 	/* init appearance */ | 	/* init appearance */ | ||||||
| 	for (j = 0; j < SchemeLast; j++) | 	for (j = 0; j < SchemeLast; j++) | ||||||
| 		scheme[j] = drw_scm_create(drw, colors[j], 2); | 		scheme[j] = drw_scm_create(drw, colors[j], alphas[i], 2); | ||||||
|  |  | ||||||
| 	clip = XInternAtom(dpy, "CLIPBOARD",   False); | 	clip = XInternAtom(dpy, "CLIPBOARD",   False); | ||||||
| 	utf8 = XInternAtom(dpy, "UTF8_STRING", False); | 	utf8 = XInternAtom(dpy, "UTF8_STRING", False); | ||||||
| @ -666,6 +675,7 @@ setup(void) | |||||||
| 		x = info[i].x_org; | 		x = info[i].x_org; | ||||||
| 		y = info[i].y_org + (topbar ? 0 : info[i].height - mh); | 		y = info[i].y_org + (topbar ? 0 : info[i].height - mh); | ||||||
| 		mw = info[i].width; | 		mw = info[i].width; | ||||||
|  |  | ||||||
| 		XFree(info); | 		XFree(info); | ||||||
| 	} else | 	} else | ||||||
| #endif | #endif | ||||||
| @ -683,11 +693,13 @@ setup(void) | |||||||
|  |  | ||||||
| 	/* create menu window */ | 	/* create menu window */ | ||||||
| 	swa.override_redirect = True; | 	swa.override_redirect = True; | ||||||
| 	swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; | 	swa.background_pixel = 0; | ||||||
|  | 	swa.border_pixel = 0; | ||||||
|  | 	swa.colormap = cmap; | ||||||
| 	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; | 	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; | ||||||
| 	win = XCreateWindow(dpy, root, x, y, mw, mh, 0, | 	win = XCreateWindow(dpy, parentwin, x, y, mw, mh, border_width, | ||||||
| 	                    CopyFromParent, CopyFromParent, CopyFromParent, | 	                    depth, CopyFromParent, visual, | ||||||
| 	                    CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); | 	                    CWOverrideRedirect | CWBackPixel | CWBorderPixel | CWColormap | CWEventMask, &swa); | ||||||
| 	XSetClassHint(dpy, win, &ch); | 	XSetClassHint(dpy, win, &ch); | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -773,7 +785,8 @@ main(int argc, char *argv[]) | |||||||
| 	if (!XGetWindowAttributes(dpy, parentwin, &wa)) | 	if (!XGetWindowAttributes(dpy, parentwin, &wa)) | ||||||
| 		die("could not get embedding window attributes: 0x%lx", | 		die("could not get embedding window attributes: 0x%lx", | ||||||
| 		    parentwin); | 		    parentwin); | ||||||
| 	drw = drw_create(dpy, screen, root, wa.width, wa.height); | 	xinitvisual(); | ||||||
|  | 	drw = drw_create(dpy, screen, root, wa.width, wa.height, 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; | ||||||
| @ -795,3 +808,40 @@ main(int argc, char *argv[]) | |||||||
|  |  | ||||||
| 	return 1; /* unreachable */ | 	return 1; /* unreachable */ | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  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); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										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 | ||||||
| @ -181,21 +184,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; | ||||||
| @ -205,7 +209,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; | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -263,9 +267,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*, unsigned int, Colormap); | ||||||
| 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); | ||||||
|  |  | ||||||
| @ -39,8 +42,8 @@ unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int | |||||||
| 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); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user