t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit fd3c19bd550e346d515c8e124c7fa55599a1aa22
   DIR parent 1bdb393f81541506c9e7d8259855e30523b71238
   URI Author: anselm@garbe.us <unknown>
       Date:   Fri,  2 Nov 2012 12:17:50 +0100
       
       incorporating Xft instead of cairo, cairo provides far too many options
       Diffstat:
         M config.def.h                        |       2 +-
         M config.mk                           |       4 ++--
         M dwm.c                               |     102 +++++++++++--------------------
       
       3 files changed, 39 insertions(+), 69 deletions(-)
       ---
   DIR diff --git a/config.def.h b/config.def.h
       t@@ -1,7 +1,7 @@
        /* See LICENSE file for copyright and license details. */
        
        /* 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 normbgcolor[]     = "#222222";
        static const char normfgcolor[]     = "#bbbbbb";
   DIR diff --git a/config.mk b/config.mk
       t@@ -15,8 +15,8 @@ XINERAMALIBS  = -lXinerama
        XINERAMAFLAGS = -DXINERAMA
        
        # includes and libs
       -INCS = -I${X11INC}
       -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS}
       +INCS = -I${X11INC} -I/usr/include/freetype2
       +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} -lutil -lXext -lXft -lfontconfig
        
        # flags
        CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
   DIR diff --git a/dwm.c b/dwm.c
       t@@ -37,6 +37,8 @@
        #include <X11/Xproto.h>
        #include <X11/Xutil.h>
        #include <X11/XKBlib.h>
       +#include <fontconfig/fontconfig.h>
       +#include <X11/Xft/Xft.h>
        #ifdef XINERAMA
        #include <X11/extensions/Xinerama.h>
        #endif /* XINERAMA */
       t@@ -100,16 +102,15 @@ struct Client {
        
        typedef struct {
                int x, y, w, h;
       -        unsigned long norm[ColLast];
       -        unsigned long sel[ColLast];
       +        XftColor norm[ColLast];
       +        XftColor sel[ColLast];
                Drawable drawable;
                GC gc;
                struct {
                        int ascent;
                        int descent;
                        int height;
       -                XFontSet set;
       -                XFontStruct *xfont;
       +                XftFont *xfont;
                } font;
        } DC; /* draw context */
        
       t@@ -179,15 +180,15 @@ static void die(const char *errstr, ...);
        static Monitor *dirtomon(int dir);
        static void drawbar(Monitor *m);
        static void drawbars(void);
       -static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
       -static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
       +static void drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]);
       +static void drawtext(const char *text, XftColor col[ColLast], Bool invert);
        static void enternotify(XEvent *e);
        static void expose(XEvent *e);
        static void focus(Client *c);
        static void focusin(XEvent *e);
        static void focusmon(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 long getstate(Window w);
        static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
       t@@ -487,10 +488,6 @@ cleanup(void) {
                for(m = mons; m; m = m->next)
                        while(m->stack)
                                unmanage(m->stack, False);
       -        if(dc.font.set)
       -                XFreeFontSet(dpy, dc.font.set);
       -        else
       -                XFreeFont(dpy, dc.font.xfont);
                XUngrabKey(dpy, AnyKey, AnyModifier, root);
                XFreePixmap(dpy, dc.drawable);
                XFreeGC(dpy, dc.gc);
       t@@ -723,7 +720,7 @@ void
        drawbar(Monitor *m) {
                int x;
                unsigned int i, occ = 0, urg = 0;
       -        unsigned long *col;
       +        XftColor *col;
                Client *c;
        
                for(c = m->clients; c; c = c->next) {
       t@@ -778,10 +775,10 @@ drawbars(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;
        
       -        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;
                if(filled)
                        XFillRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x+1, x+1);
       t@@ -790,11 +787,12 @@ drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
        }
        
        void
       -drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
       +drawtext(const char *text, XftColor col[ColLast], Bool invert) {
                char buf[256];
                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);
                if(!text)
                        return;
       t@@ -809,11 +807,11 @@ drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
                memcpy(buf, text, len);
                if(len < olen)
                        for(i = len; i && i > len - 3; buf[--i] = '.');
       -        XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
       -        if(dc.font.set)
       -                XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
       -        else
       -                XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
       +
       +        d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy,screen));
       +
       +        XftDrawStringUtf8(d, &col[invert ? ColBG : ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len);
       +        XftDrawDestroy(d);
        }
        
        void
       t@@ -859,7 +857,7 @@ focus(Client *c) {
                        detachstack(c);
                        attachstack(c);
                        grabbuttons(c, True);
       -                XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
       +                XSetWindowBorder(dpy, c->win, dc.sel[ColBorder].pixel);
                        setfocus(c);
                }
                else {
       t@@ -933,14 +931,14 @@ getatomprop(Client *c, Atom prop) {
                return atom;
        }
        
       -unsigned long
       +XftColor 
        getcolor(const char *colstr) {
       -        Colormap cmap = DefaultColormap(dpy, screen);
       -        XColor color;
       +        XftColor 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);
       -        return color.pixel;
       +
       +        return color;
        }
        
        Bool
       t@@ -1041,35 +1039,13 @@ incnmaster(const Arg *arg) {
        
        void
        initfont(const char *fontstr) {
       -        char *def, **missing;
       -        int n;
        
       -        dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
       -        if(missing) {
       -                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);
       -                dc.font.ascent = dc.font.xfont->ascent;
       -                dc.font.descent = dc.font.xfont->descent;
       -        }
       +        if(!(dc.font.xfont = XftFontOpenName(dpy,screen,fontstr))
       +        && !(dc.font.xfont = XftFontOpenName(dpy,screen,"fixed")))
       +                die("error, cannot load font: '%s'\n", fontstr);
       +
       +        dc.font.ascent = dc.font.xfont->ascent;
       +        dc.font.descent = dc.font.xfont->descent;
                dc.font.height = dc.font.ascent + dc.font.descent;
        }
        
       t@@ -1151,7 +1127,7 @@ manage(Window w, XWindowAttributes *wa) {
        
                wc.border_width = c->bw;
                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 */
                updatewindowtype(c);
                updatesizehints(c);
       t@@ -1640,8 +1616,6 @@ setup(void) {
                dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
                dc.gc = XCreateGC(dpy, root, 0, NULL);
                XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
       -        if(!dc.font.set)
       -                XSetFont(dpy, dc.gc, dc.font.xfont->fid);
                /* init bars */
                updatebars();
                updatestatus();
       t@@ -1712,13 +1686,9 @@ tagmon(const Arg *arg) {
        
        int
        textnw(const char *text, unsigned int len) {
       -        XRectangle r;
       -
       -        if(dc.font.set) {
       -                XmbTextExtents(dc.font.set, text, len, NULL, &r);
       -                return r.width;
       -        }
       -        return XTextWidth(dc.font.xfont, text, len);
       +        XGlyphInfo ext;
       +        XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *) text, len, &ext);
       +        return ext.xOff;
        }
        
        void
       t@@ -1798,7 +1768,7 @@ unfocus(Client *c, Bool setfocus) {
                if(!c)
                        return;
                grabbuttons(c, False);
       -        XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
       +        XSetWindowBorder(dpy, c->win, dc.norm[ColBorder].pixel);
                if(setfocus) {
                        XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
                        XDeleteProperty(dpy, root, netatom[NetActiveWindow]);