Alpha
This commit is contained in:
		@ -2,6 +2,7 @@
 | 
			
		||||
/* Default settings; can be overriden by command line. */
 | 
			
		||||
 | 
			
		||||
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 */
 | 
			
		||||
static const char *fonts[] = {
 | 
			
		||||
	"monospace:size=10"
 | 
			
		||||
@ -13,6 +14,13 @@ static const char *colors[SchemeLast][2] = {
 | 
			
		||||
	[SchemeSel] = { "#eeeeee", "#005577" },
 | 
			
		||||
	[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 */
 | 
			
		||||
static unsigned int lines      = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										62
									
								
								dmenu.c
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								dmenu.c
									
									
									
									
									
								
							@ -10,6 +10,7 @@
 | 
			
		||||
 | 
			
		||||
#include <X11/Xlib.h>
 | 
			
		||||
#include <X11/Xatom.h>
 | 
			
		||||
#include <X11/Xproto.h>
 | 
			
		||||
#include <X11/Xutil.h>
 | 
			
		||||
#ifdef XINERAMA
 | 
			
		||||
#include <X11/extensions/Xinerama.h>
 | 
			
		||||
@ -25,6 +26,8 @@
 | 
			
		||||
#define LENGTH(X)             (sizeof X / sizeof X[0])
 | 
			
		||||
#define TEXTW(X)              (drw_fontset_getwidth(drw, (X)) + lrpad)
 | 
			
		||||
 | 
			
		||||
#define OPAQUE                0xffU
 | 
			
		||||
 | 
			
		||||
/* enums */
 | 
			
		||||
enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */
 | 
			
		||||
 | 
			
		||||
@ -53,10 +56,16 @@ static XIC xic;
 | 
			
		||||
static Drw *drw;
 | 
			
		||||
static Clr *scheme[SchemeLast];
 | 
			
		||||
 | 
			
		||||
static int useargb = 0;
 | 
			
		||||
static Visual *visual;
 | 
			
		||||
static int depth;
 | 
			
		||||
static Colormap cmap;
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
 | 
			
		||||
static char *(*fstrstr)(const char *, const char *) = strstr;
 | 
			
		||||
static void xinitvisual();
 | 
			
		||||
 | 
			
		||||
static unsigned int
 | 
			
		||||
textw_clamp(const char *str, unsigned int n)
 | 
			
		||||
@ -628,7 +637,7 @@ setup(void)
 | 
			
		||||
#endif
 | 
			
		||||
	/* init appearance */
 | 
			
		||||
	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);
 | 
			
		||||
	utf8 = XInternAtom(dpy, "UTF8_STRING", False);
 | 
			
		||||
@ -666,6 +675,7 @@ setup(void)
 | 
			
		||||
		x = info[i].x_org;
 | 
			
		||||
		y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
 | 
			
		||||
		mw = info[i].width;
 | 
			
		||||
 | 
			
		||||
		XFree(info);
 | 
			
		||||
	} else
 | 
			
		||||
#endif
 | 
			
		||||
@ -683,11 +693,13 @@ setup(void)
 | 
			
		||||
 | 
			
		||||
	/* create menu window */
 | 
			
		||||
	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;
 | 
			
		||||
	win = XCreateWindow(dpy, root, x, y, mw, mh, 0,
 | 
			
		||||
	                    CopyFromParent, CopyFromParent, CopyFromParent,
 | 
			
		||||
	                    CWOverrideRedirect | CWBackPixel | CWEventMask, &swa);
 | 
			
		||||
	win = XCreateWindow(dpy, parentwin, x, y, mw, mh, border_width,
 | 
			
		||||
	                    depth, CopyFromParent, visual,
 | 
			
		||||
	                    CWOverrideRedirect | CWBackPixel | CWBorderPixel | CWColormap | CWEventMask, &swa);
 | 
			
		||||
	XSetClassHint(dpy, win, &ch);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -773,7 +785,8 @@ main(int argc, char *argv[])
 | 
			
		||||
	if (!XGetWindowAttributes(dpy, parentwin, &wa))
 | 
			
		||||
		die("could not get embedding window attributes: 0x%lx",
 | 
			
		||||
		    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)))
 | 
			
		||||
		die("no fonts could be loaded.");
 | 
			
		||||
	lrpad = drw->fonts->h;
 | 
			
		||||
@ -795,3 +808,40 @@ main(int argc, char *argv[])
 | 
			
		||||
 | 
			
		||||
	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_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
 | 
			
		||||
@ -181,21 +184,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),
 | 
			
		||||
	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;
 | 
			
		||||
@ -205,7 +209,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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -263,9 +267,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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										9
									
								
								drw.h
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								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*, unsigned int, Colormap);
 | 
			
		||||
void drw_resize(Drw *drw, unsigned int w, unsigned int h);
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
/* 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);
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user