tabbed-0.6-xft.diff (6605B)
1 diff --git a/config.def.h b/config.def.h 2 index ceda9f7..bc7cfe2 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[] = "-*-*-medium-*-*-*-14-*-*-*-*-*-*-*"; 10 +static const char font[] = "monospace-9"; 11 static const char* normbgcolor = "#222222"; 12 static const char* normfgcolor = "#cccccc"; 13 static const char* selbgcolor = "#555555"; 14 diff --git a/config.mk b/config.mk 15 index 5279711..037f9d7 100644 16 --- a/config.mk 17 +++ b/config.mk 18 @@ -8,8 +8,8 @@ PREFIX = /usr/local 19 MANPREFIX = ${PREFIX}/share/man 20 21 # includes and libs 22 -INCS = -I. -I/usr/include 23 -LIBS = -L/usr/lib -lc -lX11 24 +INCS = -I. -I/usr/include -I/usr/include/freetype2 25 +LIBS = -L/usr/lib -lc -lX11 -lfontconfig -lXft 26 27 # flags 28 CPPFLAGS = -DVERSION=\"${VERSION}\" -D_BSD_SOURCE 29 diff --git a/tabbed.c b/tabbed.c 30 index d30206b..d08348c 100644 31 --- a/tabbed.c 32 +++ b/tabbed.c 33 @@ -15,6 +15,7 @@ 34 #include <X11/Xproto.h> 35 #include <X11/Xutil.h> 36 #include <X11/XKBlib.h> 37 +#include <X11/Xft/Xft.h> 38 39 #include "arg.h" 40 41 @@ -64,16 +65,15 @@ typedef struct { 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 @@ -95,7 +95,7 @@ static void createnotify(const XEvent *e); 62 static void destroynotify(const XEvent *e); 63 static void die(const char *errstr, ...); 64 static void drawbar(void); 65 -static void drawtext(const char *text, unsigned long col[ColLast]); 66 +static void drawtext(const char *text, XftColor col[ColLast]); 67 static void *emallocz(size_t size); 68 static void *erealloc(void *o, size_t size); 69 static void expose(const XEvent *e); 70 @@ -105,7 +105,7 @@ static void focusonce(const Arg *arg); 71 static void fullscreen(const Arg *arg); 72 static char* getatom(int a); 73 static int getclient(Window w); 74 -static unsigned long getcolor(const char *colstr); 75 +static XftColor getcolor(const char *colstr); 76 static int getfirsttab(void); 77 static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); 78 static void initfont(const char *fontstr); 79 @@ -219,12 +219,6 @@ cleanup(void) { 80 free(clients); 81 clients = NULL; 82 83 - if(dc.font.set) { 84 - XFreeFontSet(dpy, dc.font.set); 85 - } else { 86 - XFreeFont(dpy, dc.font.xfont); 87 - } 88 - 89 XFreePixmap(dpy, dc.drawable); 90 XFreeGC(dpy, dc.gc); 91 XDestroyWindow(dpy, win); 92 @@ -305,7 +299,7 @@ die(const char *errstr, ...) { 93 94 void 95 drawbar(void) { 96 - unsigned long *col; 97 + XftColor *col; 98 int c, fc, width, n = 0; 99 char *name = NULL; 100 101 @@ -362,12 +356,13 @@ drawbar(void) { 102 } 103 104 void 105 -drawtext(const char *text, unsigned long col[ColLast]) { 106 +drawtext(const char *text, XftColor col[ColLast]) { 107 int i, x, y, h, len, olen; 108 char buf[256]; 109 + XftDraw *d; 110 XRectangle r = { dc.x, dc.y, dc.w, dc.h }; 111 112 - XSetForeground(dpy, dc.gc, col[ColBG]); 113 + XSetForeground(dpy, dc.gc, col[ColBG].pixel); 114 XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); 115 if(!text) 116 return; 117 @@ -388,13 +383,10 @@ drawtext(const char *text, unsigned long col[ColLast]) { 118 for(i = len; i && i > len - 3; buf[--i] = '.'); 119 } 120 121 - XSetForeground(dpy, dc.gc, col[ColFG]); 122 - if(dc.font.set) { 123 - XmbDrawString(dpy, dc.drawable, dc.font.set, 124 - dc.gc, x, y, buf, len); 125 - } else { 126 - XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); 127 - } 128 + d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen)); 129 + 130 + XftDrawStringUtf8(d, &col[ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len); 131 + XftDrawDestroy(d); 132 } 133 134 void * 135 @@ -524,15 +516,14 @@ getclient(Window w) { 136 return -1; 137 } 138 139 -unsigned long 140 +XftColor 141 getcolor(const char *colstr) { 142 - Colormap cmap = DefaultColormap(dpy, screen); 143 - XColor color; 144 + XftColor color; 145 146 - if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) 147 + if(!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), colstr, &color)) 148 die("tabbed: cannot allocate color '%s'\n", colstr); 149 150 - return color.pixel; 151 + return color; 152 } 153 154 int 155 @@ -585,41 +576,12 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) { 156 157 void 158 initfont(const char *fontstr) { 159 - char *def, **missing, **font_names; 160 - int i, n; 161 - XFontStruct **xfonts; 162 - 163 - missing = NULL; 164 - if(dc.font.set) 165 - XFreeFontSet(dpy, dc.font.set); 166 - 167 - dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); 168 - if(missing) { 169 - while(n--) 170 - fprintf(stderr, "tabbed: missing fontset: %s\n", missing[n]); 171 - XFreeStringList(missing); 172 - } 173 + if(!(dc.font.xfont = XftFontOpenName(dpy, screen, fontstr)) 174 + && !(dc.font.xfont = XftFontOpenName(dpy, screen, "fixed"))) 175 + die("error, cannot load font: '%s'\n", fontstr); 176 177 - if(dc.font.set) { 178 - dc.font.ascent = dc.font.descent = 0; 179 - n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); 180 - for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) { 181 - dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent); 182 - dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent); 183 - xfonts++; 184 - } 185 - } else { 186 - if(dc.font.xfont) 187 - XFreeFont(dpy, dc.font.xfont); 188 - dc.font.xfont = NULL; 189 - if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)) 190 - && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) { 191 - die("tabbed: cannot load font: '%s'\n", fontstr); 192 - } 193 - 194 - dc.font.ascent = dc.font.xfont->ascent; 195 - dc.font.descent = dc.font.xfont->descent; 196 - } 197 + dc.font.ascent = dc.font.xfont->ascent; 198 + dc.font.descent = dc.font.xfont->descent; 199 dc.font.height = dc.font.ascent + dc.font.descent; 200 } 201 202 @@ -972,11 +934,9 @@ setup(void) { 203 dc.drawable = XCreatePixmap(dpy, root, ww, wh, 204 DefaultDepth(dpy, screen)); 205 dc.gc = XCreateGC(dpy, root, 0, 0); 206 - if(!dc.font.set) 207 - XSetFont(dpy, dc.gc, dc.font.xfont->fid); 208 209 win = XCreateSimpleWindow(dpy, root, wx, wy, ww, wh, 0, 210 - dc.norm[ColFG], dc.norm[ColBG]); 211 + dc.norm[ColFG].pixel, dc.norm[ColBG].pixel); 212 XMapRaised(dpy, win); 213 XSelectInput(dpy, win, SubstructureNotifyMask|FocusChangeMask| 214 ButtonPressMask|ExposureMask|KeyPressMask|PropertyChangeMask| 215 @@ -1040,15 +1000,9 @@ spawn(const Arg *arg) { 216 217 int 218 textnw(const char *text, unsigned int len) { 219 - XRectangle r; 220 - 221 - if(dc.font.set) { 222 - XmbTextExtents(dc.font.set, text, len, NULL, &r); 223 - 224 - return r.width; 225 - } 226 - 227 - return XTextWidth(dc.font.xfont, text, len); 228 + XGlyphInfo ext; 229 + XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *) text, len, &ext); 230 + return ext.xOff; 231 } 232 233 void