dwm-6.0-xft.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
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 }