dwm-6.0-xft.diff (8146B)
1 diff --git a/config.def.h b/config.def.h 2 index 77ff358..a355bf0 100644 3 --- a/config.def.h 4 +++ b/config.def.h 5 @@ -1,7 +1,7 @@ 6 /* See LICENSE file for copyright and license details. */ 7 8 /* appearance */ 9 -static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*"; 10 +static const char font[] = "monospace-9"; 11 static const char normbordercolor[] = "#444444"; 12 static const char normbgcolor[] = "#222222"; 13 static const char normfgcolor[] = "#bbbbbb"; 14 diff --git a/config.mk b/config.mk 15 index 484554a..a09be79 100644 16 --- a/config.mk 17 +++ b/config.mk 18 @@ -15,8 +15,8 @@ XINERAMALIBS = -L${X11LIB} -lXinerama 19 XINERAMAFLAGS = -DXINERAMA 20 21 # includes and libs 22 -INCS = -I. -I/usr/include -I${X11INC} 23 -LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} 24 +INCS = -I. -I/usr/include -I${X11INC} -I/usr/include/freetype2 25 +LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} -lfontconfig -lXft 26 27 # flags 28 CPPFLAGS = -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} 29 diff --git a/dwm.c b/dwm.c 30 index 1d78655..9587e77 100644 31 --- a/dwm.c 32 +++ b/dwm.c 33 @@ -39,6 +39,7 @@ 34 #ifdef XINERAMA 35 #include <X11/extensions/Xinerama.h> 36 #endif /* XINERAMA */ 37 +#include <X11/Xft/Xft.h> 38 39 /* macros */ 40 #define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) 41 @@ -99,16 +100,15 @@ struct Client { 42 43 typedef struct { 44 int x, y, w, h; 45 - unsigned long norm[ColLast]; 46 - unsigned long sel[ColLast]; 47 + XftColor norm[ColLast]; 48 + XftColor sel[ColLast]; 49 Drawable drawable; 50 GC gc; 51 struct { 52 int ascent; 53 int descent; 54 int height; 55 - XFontSet set; 56 - XFontStruct *xfont; 57 + XftFont *xfont; 58 } font; 59 } DC; /* draw context */ 60 61 @@ -178,15 +178,15 @@ static void die(const char *errstr, ...); 62 static Monitor *dirtomon(int dir); 63 static void drawbar(Monitor *m); 64 static void drawbars(void); 65 -static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]); 66 -static void drawtext(const char *text, unsigned long col[ColLast], Bool invert); 67 +static void drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]); 68 +static void drawtext(const char *text, XftColor col[ColLast], Bool invert); 69 static void enternotify(XEvent *e); 70 static void expose(XEvent *e); 71 static void focus(Client *c); 72 static void focusin(XEvent *e); 73 static void focusmon(const Arg *arg); 74 static void focusstack(const Arg *arg); 75 -static unsigned long getcolor(const char *colstr); 76 +static XftColor getcolor(const char *colstr); 77 static Bool getrootptr(int *x, int *y); 78 static long getstate(Window w); 79 static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); 80 @@ -485,10 +485,6 @@ cleanup(void) { 81 for(m = mons; m; m = m->next) 82 while(m->stack) 83 unmanage(m->stack, False); 84 - if(dc.font.set) 85 - XFreeFontSet(dpy, dc.font.set); 86 - else 87 - XFreeFont(dpy, dc.font.xfont); 88 XUngrabKey(dpy, AnyKey, AnyModifier, root); 89 XFreePixmap(dpy, dc.drawable); 90 XFreeGC(dpy, dc.gc); 91 @@ -719,7 +715,7 @@ void 92 drawbar(Monitor *m) { 93 int x; 94 unsigned int i, occ = 0, urg = 0; 95 - unsigned long *col; 96 + XftColor *col; 97 Client *c; 98 99 for(c = m->clients; c; c = c->next) { 100 @@ -774,10 +770,10 @@ drawbars(void) { 101 } 102 103 void 104 -drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) { 105 +drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]) { 106 int x; 107 108 - XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]); 109 + XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG].pixel); 110 x = (dc.font.ascent + dc.font.descent + 2) / 4; 111 if(filled) 112 XFillRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x+1, x+1); 113 @@ -786,11 +782,12 @@ drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) { 114 } 115 116 void 117 -drawtext(const char *text, unsigned long col[ColLast], Bool invert) { 118 +drawtext(const char *text, XftColor col[ColLast], Bool invert) { 119 char buf[256]; 120 int i, x, y, h, len, olen; 121 + XftDraw *d; 122 123 - XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]); 124 + XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG].pixel); 125 XFillRectangle(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.w, dc.h); 126 if(!text) 127 return; 128 @@ -805,11 +802,11 @@ drawtext(const char *text, unsigned long col[ColLast], Bool invert) { 129 memcpy(buf, text, len); 130 if(len < olen) 131 for(i = len; i && i > len - 3; buf[--i] = '.'); 132 - XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]); 133 - if(dc.font.set) 134 - XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); 135 - else 136 - XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); 137 + 138 + d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy,screen)); 139 + 140 + XftDrawStringUtf8(d, &col[invert ? ColBG : ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len); 141 + XftDrawDestroy(d); 142 } 143 144 void 145 @@ -855,7 +852,7 @@ focus(Client *c) { 146 detachstack(c); 147 attachstack(c); 148 grabbuttons(c, True); 149 - XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]); 150 + XSetWindowBorder(dpy, c->win, dc.sel[ColBorder].pixel); 151 setfocus(c); 152 } 153 else 154 @@ -926,14 +923,14 @@ getatomprop(Client *c, Atom prop) { 155 return atom; 156 } 157 158 -unsigned long 159 +XftColor 160 getcolor(const char *colstr) { 161 - Colormap cmap = DefaultColormap(dpy, screen); 162 - XColor color; 163 + XftColor color; 164 165 - if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) 166 + if(!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), colstr, &color)) 167 die("error, cannot allocate color '%s'\n", colstr); 168 - return color.pixel; 169 + 170 + return color; 171 } 172 173 Bool 174 @@ -1034,35 +1031,13 @@ incnmaster(const Arg *arg) { 175 176 void 177 initfont(const char *fontstr) { 178 - char *def, **missing; 179 - int n; 180 181 - dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); 182 - if(missing) { 183 - while(n--) 184 - fprintf(stderr, "dwm: missing fontset: %s\n", missing[n]); 185 - XFreeStringList(missing); 186 - } 187 - if(dc.font.set) { 188 - XFontStruct **xfonts; 189 - char **font_names; 190 - 191 - dc.font.ascent = dc.font.descent = 0; 192 - XExtentsOfFontSet(dc.font.set); 193 - n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); 194 - while(n--) { 195 - dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent); 196 - dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent); 197 - xfonts++; 198 - } 199 - } 200 - else { 201 - if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)) 202 - && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) 203 - die("error, cannot load font: '%s'\n", fontstr); 204 - dc.font.ascent = dc.font.xfont->ascent; 205 - dc.font.descent = dc.font.xfont->descent; 206 - } 207 + if(!(dc.font.xfont = XftFontOpenName(dpy,screen,fontstr)) 208 + && !(dc.font.xfont = XftFontOpenName(dpy,screen,"fixed"))) 209 + die("error, cannot load font: '%s'\n", fontstr); 210 + 211 + dc.font.ascent = dc.font.xfont->ascent; 212 + dc.font.descent = dc.font.xfont->descent; 213 dc.font.height = dc.font.ascent + dc.font.descent; 214 } 215 216 @@ -1144,7 +1119,7 @@ manage(Window w, XWindowAttributes *wa) { 217 218 wc.border_width = c->bw; 219 XConfigureWindow(dpy, w, CWBorderWidth, &wc); 220 - XSetWindowBorder(dpy, w, dc.norm[ColBorder]); 221 + XSetWindowBorder(dpy, w, dc.norm[ColBorder].pixel); 222 configure(c); /* propagates border_width, if size doesn't change */ 223 updatewindowtype(c); 224 updatesizehints(c); 225 @@ -1621,8 +1596,6 @@ setup(void) { 226 dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen)); 227 dc.gc = XCreateGC(dpy, root, 0, NULL); 228 XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); 229 - if(!dc.font.set) 230 - XSetFont(dpy, dc.gc, dc.font.xfont->fid); 231 /* init bars */ 232 updatebars(); 233 updatestatus(); 234 @@ -1692,13 +1665,9 @@ tagmon(const Arg *arg) { 235 236 int 237 textnw(const char *text, unsigned int len) { 238 - XRectangle r; 239 - 240 - if(dc.font.set) { 241 - XmbTextExtents(dc.font.set, text, len, NULL, &r); 242 - return r.width; 243 - } 244 - return XTextWidth(dc.font.xfont, text, len); 245 + XGlyphInfo ext; 246 + XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *) text, len, &ext); 247 + return ext.xOff; 248 } 249 250 void 251 @@ -1776,7 +1745,7 @@ unfocus(Client *c, Bool setfocus) { 252 if(!c) 253 return; 254 grabbuttons(c, False); 255 - XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]); 256 + XSetWindowBorder(dpy, c->win, dc.norm[ColBorder].pixel); 257 if(setfocus) 258 XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); 259 }