incorporating Xft instead of cairo, cairo provides far too many options
This commit is contained in:
		@@ -1,7 +1,7 @@
 | 
				
			|||||||
/* See LICENSE file for copyright and license details. */
 | 
					/* See LICENSE file for copyright and license details. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* appearance */
 | 
					/* appearance */
 | 
				
			||||||
static const char font[]            = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
 | 
					static const char font[]            = "Liberation Mono:pixelsize=12:antialias=false:autohint=false";
 | 
				
			||||||
static const char normbordercolor[] = "#444444";
 | 
					static const char normbordercolor[] = "#444444";
 | 
				
			||||||
static const char normbgcolor[]     = "#222222";
 | 
					static const char normbgcolor[]     = "#222222";
 | 
				
			||||||
static const char normfgcolor[]     = "#bbbbbb";
 | 
					static const char normfgcolor[]     = "#bbbbbb";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,8 +15,8 @@ XINERAMALIBS  = -lXinerama
 | 
				
			|||||||
XINERAMAFLAGS = -DXINERAMA
 | 
					XINERAMAFLAGS = -DXINERAMA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# includes and libs
 | 
					# includes and libs
 | 
				
			||||||
INCS = -I${X11INC}
 | 
					INCS = -I${X11INC} -I/usr/include/freetype2
 | 
				
			||||||
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS}
 | 
					LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} -lutil -lXext -lXft -lfontconfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# flags
 | 
					# flags
 | 
				
			||||||
CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
 | 
					CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										96
									
								
								dwm.c
									
									
									
									
									
								
							
							
						
						
									
										96
									
								
								dwm.c
									
									
									
									
									
								
							@@ -37,6 +37,8 @@
 | 
				
			|||||||
#include <X11/Xproto.h>
 | 
					#include <X11/Xproto.h>
 | 
				
			||||||
#include <X11/Xutil.h>
 | 
					#include <X11/Xutil.h>
 | 
				
			||||||
#include <X11/XKBlib.h>
 | 
					#include <X11/XKBlib.h>
 | 
				
			||||||
 | 
					#include <fontconfig/fontconfig.h>
 | 
				
			||||||
 | 
					#include <X11/Xft/Xft.h>
 | 
				
			||||||
#ifdef XINERAMA
 | 
					#ifdef XINERAMA
 | 
				
			||||||
#include <X11/extensions/Xinerama.h>
 | 
					#include <X11/extensions/Xinerama.h>
 | 
				
			||||||
#endif /* XINERAMA */
 | 
					#endif /* XINERAMA */
 | 
				
			||||||
@@ -100,16 +102,15 @@ struct Client {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
	int x, y, w, h;
 | 
						int x, y, w, h;
 | 
				
			||||||
	unsigned long norm[ColLast];
 | 
						XftColor norm[ColLast];
 | 
				
			||||||
	unsigned long sel[ColLast];
 | 
						XftColor sel[ColLast];
 | 
				
			||||||
	Drawable drawable;
 | 
						Drawable drawable;
 | 
				
			||||||
	GC gc;
 | 
						GC gc;
 | 
				
			||||||
	struct {
 | 
						struct {
 | 
				
			||||||
		int ascent;
 | 
							int ascent;
 | 
				
			||||||
		int descent;
 | 
							int descent;
 | 
				
			||||||
		int height;
 | 
							int height;
 | 
				
			||||||
		XFontSet set;
 | 
							XftFont *xfont;
 | 
				
			||||||
		XFontStruct *xfont;
 | 
					 | 
				
			||||||
	} font;
 | 
						} font;
 | 
				
			||||||
} DC; /* draw context */
 | 
					} DC; /* draw context */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -179,15 +180,15 @@ static void die(const char *errstr, ...);
 | 
				
			|||||||
static Monitor *dirtomon(int dir);
 | 
					static Monitor *dirtomon(int dir);
 | 
				
			||||||
static void drawbar(Monitor *m);
 | 
					static void drawbar(Monitor *m);
 | 
				
			||||||
static void drawbars(void);
 | 
					static void drawbars(void);
 | 
				
			||||||
static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
 | 
					static void drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]);
 | 
				
			||||||
static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
 | 
					static void drawtext(const char *text, XftColor col[ColLast], Bool invert);
 | 
				
			||||||
static void enternotify(XEvent *e);
 | 
					static void enternotify(XEvent *e);
 | 
				
			||||||
static void expose(XEvent *e);
 | 
					static void expose(XEvent *e);
 | 
				
			||||||
static void focus(Client *c);
 | 
					static void focus(Client *c);
 | 
				
			||||||
static void focusin(XEvent *e);
 | 
					static void focusin(XEvent *e);
 | 
				
			||||||
static void focusmon(const Arg *arg);
 | 
					static void focusmon(const Arg *arg);
 | 
				
			||||||
static void focusstack(const Arg *arg);
 | 
					static void focusstack(const Arg *arg);
 | 
				
			||||||
static unsigned long getcolor(const char *colstr);
 | 
					static XftColor getcolor(const char *colstr);
 | 
				
			||||||
static Bool getrootptr(int *x, int *y);
 | 
					static Bool getrootptr(int *x, int *y);
 | 
				
			||||||
static long getstate(Window w);
 | 
					static long getstate(Window w);
 | 
				
			||||||
static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
 | 
					static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
 | 
				
			||||||
@@ -487,10 +488,6 @@ cleanup(void) {
 | 
				
			|||||||
	for(m = mons; m; m = m->next)
 | 
						for(m = mons; m; m = m->next)
 | 
				
			||||||
		while(m->stack)
 | 
							while(m->stack)
 | 
				
			||||||
			unmanage(m->stack, False);
 | 
								unmanage(m->stack, False);
 | 
				
			||||||
	if(dc.font.set)
 | 
					 | 
				
			||||||
		XFreeFontSet(dpy, dc.font.set);
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		XFreeFont(dpy, dc.font.xfont);
 | 
					 | 
				
			||||||
	XUngrabKey(dpy, AnyKey, AnyModifier, root);
 | 
						XUngrabKey(dpy, AnyKey, AnyModifier, root);
 | 
				
			||||||
	XFreePixmap(dpy, dc.drawable);
 | 
						XFreePixmap(dpy, dc.drawable);
 | 
				
			||||||
	XFreeGC(dpy, dc.gc);
 | 
						XFreeGC(dpy, dc.gc);
 | 
				
			||||||
@@ -723,7 +720,7 @@ void
 | 
				
			|||||||
drawbar(Monitor *m) {
 | 
					drawbar(Monitor *m) {
 | 
				
			||||||
	int x;
 | 
						int x;
 | 
				
			||||||
	unsigned int i, occ = 0, urg = 0;
 | 
						unsigned int i, occ = 0, urg = 0;
 | 
				
			||||||
	unsigned long *col;
 | 
						XftColor *col;
 | 
				
			||||||
	Client *c;
 | 
						Client *c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for(c = m->clients; c; c = c->next) {
 | 
						for(c = m->clients; c; c = c->next) {
 | 
				
			||||||
@@ -778,10 +775,10 @@ drawbars(void) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
 | 
					drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]) {
 | 
				
			||||||
	int x;
 | 
						int x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
 | 
						XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG].pixel);
 | 
				
			||||||
	x = (dc.font.ascent + dc.font.descent + 2) / 4;
 | 
						x = (dc.font.ascent + dc.font.descent + 2) / 4;
 | 
				
			||||||
	if(filled)
 | 
						if(filled)
 | 
				
			||||||
		XFillRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x+1, x+1);
 | 
							XFillRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x+1, x+1);
 | 
				
			||||||
@@ -790,11 +787,12 @@ drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
 | 
					drawtext(const char *text, XftColor col[ColLast], Bool invert) {
 | 
				
			||||||
	char buf[256];
 | 
						char buf[256];
 | 
				
			||||||
	int i, x, y, h, len, olen;
 | 
						int i, x, y, h, len, olen;
 | 
				
			||||||
 | 
						XftDraw *d;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
 | 
						XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG].pixel);
 | 
				
			||||||
	XFillRectangle(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.w, dc.h);
 | 
						XFillRectangle(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.w, dc.h);
 | 
				
			||||||
	if(!text)
 | 
						if(!text)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
@@ -809,11 +807,11 @@ drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
 | 
				
			|||||||
	memcpy(buf, text, len);
 | 
						memcpy(buf, text, len);
 | 
				
			||||||
	if(len < olen)
 | 
						if(len < olen)
 | 
				
			||||||
		for(i = len; i && i > len - 3; buf[--i] = '.');
 | 
							for(i = len; i && i > len - 3; buf[--i] = '.');
 | 
				
			||||||
	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
 | 
					
 | 
				
			||||||
	if(dc.font.set)
 | 
						d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy,screen));
 | 
				
			||||||
		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
 | 
					
 | 
				
			||||||
	else
 | 
						XftDrawStringUtf8(d, &col[invert ? ColBG : ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len);
 | 
				
			||||||
		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
 | 
						XftDrawDestroy(d);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
@@ -859,7 +857,7 @@ focus(Client *c) {
 | 
				
			|||||||
		detachstack(c);
 | 
							detachstack(c);
 | 
				
			||||||
		attachstack(c);
 | 
							attachstack(c);
 | 
				
			||||||
		grabbuttons(c, True);
 | 
							grabbuttons(c, True);
 | 
				
			||||||
		XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
 | 
							XSetWindowBorder(dpy, c->win, dc.sel[ColBorder].pixel);
 | 
				
			||||||
		setfocus(c);
 | 
							setfocus(c);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else {
 | 
						else {
 | 
				
			||||||
@@ -933,14 +931,14 @@ getatomprop(Client *c, Atom prop) {
 | 
				
			|||||||
	return atom;
 | 
						return atom;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned long
 | 
					XftColor 
 | 
				
			||||||
getcolor(const char *colstr) {
 | 
					getcolor(const char *colstr) {
 | 
				
			||||||
	Colormap cmap = DefaultColormap(dpy, screen);
 | 
						XftColor color;
 | 
				
			||||||
	XColor color;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
 | 
						if(!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), colstr, &color))
 | 
				
			||||||
		die("error, cannot allocate color '%s'\n", colstr);
 | 
							die("error, cannot allocate color '%s'\n", colstr);
 | 
				
			||||||
	return color.pixel;
 | 
					
 | 
				
			||||||
 | 
						return color;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Bool
 | 
					Bool
 | 
				
			||||||
@@ -1041,35 +1039,13 @@ incnmaster(const Arg *arg) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
initfont(const char *fontstr) {
 | 
					initfont(const char *fontstr) {
 | 
				
			||||||
	char *def, **missing;
 | 
					 | 
				
			||||||
	int n;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
 | 
						if(!(dc.font.xfont = XftFontOpenName(dpy,screen,fontstr))
 | 
				
			||||||
	if(missing) {
 | 
						&& !(dc.font.xfont = XftFontOpenName(dpy,screen,"fixed")))
 | 
				
			||||||
		while(n--)
 | 
					 | 
				
			||||||
			fprintf(stderr, "dwm: missing fontset: %s\n", missing[n]);
 | 
					 | 
				
			||||||
		XFreeStringList(missing);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if(dc.font.set) {
 | 
					 | 
				
			||||||
		XFontStruct **xfonts;
 | 
					 | 
				
			||||||
		char **font_names;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dc.font.ascent = dc.font.descent = 0;
 | 
					 | 
				
			||||||
		XExtentsOfFontSet(dc.font.set);
 | 
					 | 
				
			||||||
		n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
 | 
					 | 
				
			||||||
		while(n--) {
 | 
					 | 
				
			||||||
			dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent);
 | 
					 | 
				
			||||||
			dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent);
 | 
					 | 
				
			||||||
			xfonts++;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	else {
 | 
					 | 
				
			||||||
		if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
 | 
					 | 
				
			||||||
		&& !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))
 | 
					 | 
				
			||||||
		die("error, cannot load font: '%s'\n", fontstr);
 | 
							die("error, cannot load font: '%s'\n", fontstr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dc.font.ascent = dc.font.xfont->ascent;
 | 
						dc.font.ascent = dc.font.xfont->ascent;
 | 
				
			||||||
	dc.font.descent = dc.font.xfont->descent;
 | 
						dc.font.descent = dc.font.xfont->descent;
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	dc.font.height = dc.font.ascent + dc.font.descent;
 | 
						dc.font.height = dc.font.ascent + dc.font.descent;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1151,7 +1127,7 @@ manage(Window w, XWindowAttributes *wa) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	wc.border_width = c->bw;
 | 
						wc.border_width = c->bw;
 | 
				
			||||||
	XConfigureWindow(dpy, w, CWBorderWidth, &wc);
 | 
						XConfigureWindow(dpy, w, CWBorderWidth, &wc);
 | 
				
			||||||
	XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
 | 
						XSetWindowBorder(dpy, w, dc.norm[ColBorder].pixel);
 | 
				
			||||||
	configure(c); /* propagates border_width, if size doesn't change */
 | 
						configure(c); /* propagates border_width, if size doesn't change */
 | 
				
			||||||
	updatewindowtype(c);
 | 
						updatewindowtype(c);
 | 
				
			||||||
	updatesizehints(c);
 | 
						updatesizehints(c);
 | 
				
			||||||
@@ -1640,8 +1616,6 @@ setup(void) {
 | 
				
			|||||||
	dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
 | 
						dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
 | 
				
			||||||
	dc.gc = XCreateGC(dpy, root, 0, NULL);
 | 
						dc.gc = XCreateGC(dpy, root, 0, NULL);
 | 
				
			||||||
	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
 | 
						XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
 | 
				
			||||||
	if(!dc.font.set)
 | 
					 | 
				
			||||||
		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
 | 
					 | 
				
			||||||
	/* init bars */
 | 
						/* init bars */
 | 
				
			||||||
	updatebars();
 | 
						updatebars();
 | 
				
			||||||
	updatestatus();
 | 
						updatestatus();
 | 
				
			||||||
@@ -1712,13 +1686,9 @@ tagmon(const Arg *arg) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
textnw(const char *text, unsigned int len) {
 | 
					textnw(const char *text, unsigned int len) {
 | 
				
			||||||
	XRectangle r;
 | 
						XGlyphInfo ext;
 | 
				
			||||||
 | 
						XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *) text, len, &ext);
 | 
				
			||||||
	if(dc.font.set) {
 | 
						return ext.xOff;
 | 
				
			||||||
		XmbTextExtents(dc.font.set, text, len, NULL, &r);
 | 
					 | 
				
			||||||
		return r.width;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return XTextWidth(dc.font.xfont, text, len);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
@@ -1798,7 +1768,7 @@ unfocus(Client *c, Bool setfocus) {
 | 
				
			|||||||
	if(!c)
 | 
						if(!c)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	grabbuttons(c, False);
 | 
						grabbuttons(c, False);
 | 
				
			||||||
	XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
 | 
						XSetWindowBorder(dpy, c->win, dc.norm[ColBorder].pixel);
 | 
				
			||||||
	if(setfocus) {
 | 
						if(setfocus) {
 | 
				
			||||||
		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
 | 
							XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
 | 
				
			||||||
		XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
 | 
							XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user