dwm-pango-20200428-f09418b.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-pango-20200428-f09418b.diff (19188B)
---
1 From c48056710a4ca6a6e52be60b0165313f9461f663 Mon Sep 17 00:00:00 2001
2 From: Marius Iacob <themariusus@gmail.com>
3 Date: Tue, 28 Apr 2020 17:18:32 +0300
4 Subject: [PATCH] Using pango markup for status text
5
6 Use a single font string. Removed some utf8 code from drw.
7 Created for pango 1.44. Older versions might not have getter
8 for font height, ascent + descent can be used instead.
9 All texts are rendered with pango but only status is with
10 markup. Doubled stext size (in case a lot of markup is used).
11 MIN/MAX is already defined (didn't redefine them).
12 ---
13 config.def.h | 2 +-
14 config.mk | 4 +-
15 drw.c | 303 +++++++++++++--------------------------------------
16 drw.h | 17 ++-
17 dwm.c | 28 ++---
18 util.h | 4 +
19 6 files changed, 106 insertions(+), 252 deletions(-)
20
21 diff --git a/config.def.h b/config.def.h
22 index 1c0b587..d201ae6 100644
23 --- a/config.def.h
24 +++ b/config.def.h
25 @@ -5,7 +5,7 @@ static const unsigned int borderpx = 1; /* border pixel of windows */
26 static const unsigned int snap = 32; /* snap pixel */
27 static const int showbar = 1; /* 0 means no bar */
28 static const int topbar = 1; /* 0 means bottom bar */
29 -static const char *fonts[] = { "monospace:size=10" };
30 +static const char font[] = "monospace 10";
31 static const char dmenufont[] = "monospace:size=10";
32 static const char col_gray1[] = "#222222";
33 static const char col_gray2[] = "#444444";
34 diff --git a/config.mk b/config.mk
35 index 7084c33..b5c7e12 100644
36 --- a/config.mk
37 +++ b/config.mk
38 @@ -21,8 +21,8 @@ FREETYPEINC = /usr/include/freetype2
39 #FREETYPEINC = ${X11INC}/freetype2
40
41 # includes and libs
42 -INCS = -I${X11INC} -I${FREETYPEINC}
43 -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
44 +INCS = -I${X11INC} -I${FREETYPEINC} `pkg-config --cflags xft pango pangoxft`
45 +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} `pkg-config --libs xft pango pangoxft`
46
47 # flags
48 CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
49 diff --git a/drw.c b/drw.c
50 index 8fd1ca4..6d1b64e 100644
51 --- a/drw.c
52 +++ b/drw.c
53 @@ -4,62 +4,12 @@
54 #include <string.h>
55 #include <X11/Xlib.h>
56 #include <X11/Xft/Xft.h>
57 +#include <pango/pango.h>
58 +#include <pango/pangoxft.h>
59
60 #include "drw.h"
61 #include "util.h"
62
63 -#define UTF_INVALID 0xFFFD
64 -#define UTF_SIZ 4
65 -
66 -static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0};
67 -static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
68 -static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000};
69 -static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
70 -
71 -static long
72 -utf8decodebyte(const char c, size_t *i)
73 -{
74 - for (*i = 0; *i < (UTF_SIZ + 1); ++(*i))
75 - if (((unsigned char)c & utfmask[*i]) == utfbyte[*i])
76 - return (unsigned char)c & ~utfmask[*i];
77 - return 0;
78 -}
79 -
80 -static size_t
81 -utf8validate(long *u, size_t i)
82 -{
83 - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
84 - *u = UTF_INVALID;
85 - for (i = 1; *u > utfmax[i]; ++i)
86 - ;
87 - return i;
88 -}
89 -
90 -static size_t
91 -utf8decode(const char *c, long *u, size_t clen)
92 -{
93 - size_t i, j, len, type;
94 - long udecoded;
95 -
96 - *u = UTF_INVALID;
97 - if (!clen)
98 - return 0;
99 - udecoded = utf8decodebyte(c[0], &len);
100 - if (!BETWEEN(len, 1, UTF_SIZ))
101 - return 1;
102 - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) {
103 - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type);
104 - if (type)
105 - return j;
106 - }
107 - if (j < len)
108 - return 0;
109 - *u = udecoded;
110 - utf8validate(u, len);
111 -
112 - return len;
113 -}
114 -
115 Drw *
116 drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
117 {
118 @@ -99,58 +49,37 @@ drw_free(Drw *drw)
119 }
120
121 /* This function is an implementation detail. Library users should use
122 - * drw_fontset_create instead.
123 + * drw_font_create instead.
124 */
125 static Fnt *
126 -xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
127 +xfont_create(Drw *drw, const char *fontname)
128 {
129 Fnt *font;
130 - XftFont *xfont = NULL;
131 - FcPattern *pattern = NULL;
132 -
133 - if (fontname) {
134 - /* Using the pattern found at font->xfont->pattern does not yield the
135 - * same substitution results as using the pattern returned by
136 - * FcNameParse; using the latter results in the desired fallback
137 - * behaviour whereas the former just results in missing-character
138 - * rectangles being drawn, at least with some fonts. */
139 - if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) {
140 - fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname);
141 - return NULL;
142 - }
143 - if (!(pattern = FcNameParse((FcChar8 *) fontname))) {
144 - fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname);
145 - XftFontClose(drw->dpy, xfont);
146 - return NULL;
147 - }
148 - } else if (fontpattern) {
149 - if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) {
150 - fprintf(stderr, "error, cannot load font from pattern.\n");
151 - return NULL;
152 - }
153 - } else {
154 - die("no font specified.");
155 - }
156 + PangoFontMap *fontmap;
157 + PangoContext *context;
158 + PangoFontDescription *desc;
159 + PangoFontMetrics *metrics;
160
161 - /* Do not allow using color fonts. This is a workaround for a BadLength
162 - * error from Xft with color glyphs. Modelled on the Xterm workaround. See
163 - * https://bugzilla.redhat.com/show_bug.cgi?id=1498269
164 - * https://lists.suckless.org/dev/1701/30932.html
165 - * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349
166 - * and lots more all over the internet.
167 - */
168 - FcBool iscol;
169 - if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) {
170 - XftFontClose(drw->dpy, xfont);
171 - return NULL;
172 +
173 + if (!fontname) {
174 + die("no font specified.");
175 }
176
177 font = ecalloc(1, sizeof(Fnt));
178 - font->xfont = xfont;
179 - font->pattern = pattern;
180 - font->h = xfont->ascent + xfont->descent;
181 font->dpy = drw->dpy;
182
183 + fontmap = pango_xft_get_font_map(drw->dpy, drw->screen);
184 + context = pango_font_map_create_context(fontmap);
185 + desc = pango_font_description_from_string(fontname);
186 + font->layout = pango_layout_new(context);
187 + pango_layout_set_font_description(font->layout, desc);
188 +
189 + metrics = pango_context_get_metrics(context, desc, pango_language_from_string ("en-us"));
190 + font->h = pango_font_metrics_get_height(metrics) / PANGO_SCALE;
191 +
192 + pango_font_metrics_unref(metrics);
193 + g_object_unref(context);
194 +
195 return font;
196 }
197
198 @@ -159,35 +88,28 @@ xfont_free(Fnt *font)
199 {
200 if (!font)
201 return;
202 - if (font->pattern)
203 - FcPatternDestroy(font->pattern);
204 - XftFontClose(font->dpy, font->xfont);
205 + if (font->layout)
206 + g_object_unref(font->layout);
207 free(font);
208 }
209
210 Fnt*
211 -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
212 +drw_font_create(Drw* drw, const char font[])
213 {
214 - Fnt *cur, *ret = NULL;
215 - size_t i;
216 + Fnt *fnt = NULL;
217
218 - if (!drw || !fonts)
219 + if (!drw || !font)
220 return NULL;
221
222 - for (i = 1; i <= fontcount; i++) {
223 - if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) {
224 - cur->next = ret;
225 - ret = cur;
226 - }
227 - }
228 - return (drw->fonts = ret);
229 + fnt = xfont_create(drw, font);
230 +
231 + return (drw->font = fnt);
232 }
233
234 void
235 -drw_fontset_free(Fnt *font)
236 +drw_font_free(Fnt *font)
237 {
238 if (font) {
239 - drw_fontset_free(font->next);
240 xfont_free(font);
241 }
242 }
243 @@ -221,13 +143,6 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
244 return ret;
245 }
246
247 -void
248 -drw_setfontset(Drw *drw, Fnt *set)
249 -{
250 - if (drw)
251 - drw->fonts = set;
252 -}
253 -
254 void
255 drw_setscheme(Drw *drw, Clr *scm)
256 {
257 @@ -248,24 +163,16 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int
258 }
259
260 int
261 -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
262 +drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup)
263 {
264 char buf[1024];
265 int ty;
266 unsigned int ew;
267 XftDraw *d = NULL;
268 - Fnt *usedfont, *curfont, *nextfont;
269 size_t i, len;
270 - int utf8strlen, utf8charlen, render = x || y || w || h;
271 - long utf8codepoint = 0;
272 - const char *utf8str;
273 - FcCharSet *fccharset;
274 - FcPattern *fcpattern;
275 - FcPattern *match;
276 - XftResult result;
277 - int charexists = 0;
278 -
279 - if (!drw || (render && !drw->scheme) || !text || !drw->fonts)
280 + int render = x || y || w || h;
281 +
282 + if (!drw || (render && !drw->scheme) || !text || !drw->font)
283 return 0;
284
285 if (!render) {
286 @@ -280,98 +187,37 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
287 w -= lpad;
288 }
289
290 - usedfont = drw->fonts;
291 - while (1) {
292 - utf8strlen = 0;
293 - utf8str = text;
294 - nextfont = NULL;
295 - while (*text) {
296 - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ);
297 - for (curfont = drw->fonts; curfont; curfont = curfont->next) {
298 - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint);
299 - if (charexists) {
300 - if (curfont == usedfont) {
301 - utf8strlen += utf8charlen;
302 - text += utf8charlen;
303 - } else {
304 - nextfont = curfont;
305 - }
306 - break;
307 - }
308 - }
309 -
310 - if (!charexists || nextfont)
311 - break;
312 - else
313 - charexists = 0;
314 - }
315 -
316 - if (utf8strlen) {
317 - drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL);
318 - /* shorten text if necessary */
319 - for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--)
320 - drw_font_getexts(usedfont, utf8str, len, &ew, NULL);
321 -
322 - if (len) {
323 - memcpy(buf, utf8str, len);
324 - buf[len] = '\0';
325 - if (len < utf8strlen)
326 - for (i = len; i && i > len - 3; buf[--i] = '.')
327 - ; /* NOP */
328 -
329 - if (render) {
330 - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent;
331 - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg],
332 - usedfont->xfont, x, ty, (XftChar8 *)buf, len);
333 - }
334 - x += ew;
335 - w -= ew;
336 - }
337 - }
338 -
339 - if (!*text) {
340 - break;
341 - } else if (nextfont) {
342 - charexists = 0;
343 - usedfont = nextfont;
344 - } else {
345 - /* Regardless of whether or not a fallback font is found, the
346 - * character must be drawn. */
347 - charexists = 1;
348 -
349 - fccharset = FcCharSetCreate();
350 - FcCharSetAddChar(fccharset, utf8codepoint);
351 -
352 - if (!drw->fonts->pattern) {
353 - /* Refer to the comment in xfont_create for more information. */
354 - die("the first font in the cache must be loaded from a font string.");
355 - }
356 -
357 - fcpattern = FcPatternDuplicate(drw->fonts->pattern);
358 - FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
359 - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
360 - FcPatternAddBool(fcpattern, FC_COLOR, FcFalse);
361 -
362 - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
363 - FcDefaultSubstitute(fcpattern);
364 - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result);
365 -
366 - FcCharSetDestroy(fccharset);
367 - FcPatternDestroy(fcpattern);
368 -
369 - if (match) {
370 - usedfont = xfont_create(drw, NULL, match);
371 - if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) {
372 - for (curfont = drw->fonts; curfont->next; curfont = curfont->next)
373 - ; /* NOP */
374 - curfont->next = usedfont;
375 - } else {
376 - xfont_free(usedfont);
377 - usedfont = drw->fonts;
378 - }
379 + len = strlen(text);
380 +
381 + if (len) {
382 + drw_font_getexts(drw->font, text, len, &ew, NULL, markup);
383 + /* shorten text if necessary */
384 + for (len = MIN(len, sizeof(buf) - 1); len && ew > w; len--)
385 + drw_font_getexts(drw->font, text, len, &ew, NULL, markup);
386 +
387 + if (len) {
388 + memcpy(buf, text, len);
389 + buf[len] = '\0';
390 + if (len < strlen(text))
391 + for (i = len; i && i > len - 3; buf[--i] = '.')
392 + ; /* NOP */
393 +
394 + if (render) {
395 + ty = y + (h - drw->font->h) / 2;
396 + if(markup)
397 + pango_layout_set_markup(drw->font->layout, buf, len);
398 + else
399 + pango_layout_set_text(drw->font->layout, buf, len);
400 + pango_xft_render_layout(d, &drw->scheme[invert ? ColBg : ColFg],
401 + drw->font->layout, x * PANGO_SCALE, ty * PANGO_SCALE);
402 + if(markup) /* clear markup attributes */
403 + pango_layout_set_attributes(drw->font->layout, NULL);
404 }
405 + x += ew;
406 + w -= ew;
407 }
408 }
409 +
410 if (d)
411 XftDrawDestroy(d);
412
413 @@ -389,24 +235,29 @@ drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
414 }
415
416 unsigned int
417 -drw_fontset_getwidth(Drw *drw, const char *text)
418 +drw_font_getwidth(Drw *drw, const char *text, Bool markup)
419 {
420 - if (!drw || !drw->fonts || !text)
421 + if (!drw || !drw->font || !text)
422 return 0;
423 - return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
424 + return drw_text(drw, 0, 0, 0, 0, 0, text, 0, markup);
425 }
426
427 void
428 -drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h)
429 +drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup)
430 {
431 - XGlyphInfo ext;
432 -
433 if (!font || !text)
434 return;
435
436 - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
437 + PangoRectangle r;
438 + if(markup)
439 + pango_layout_set_markup(font->layout, text, len);
440 + else
441 + pango_layout_set_text(font->layout, text, len);
442 + pango_layout_get_extents(font->layout, 0, &r);
443 + if(markup) /* clear markup attributes */
444 + pango_layout_set_attributes(font->layout, NULL);
445 if (w)
446 - *w = ext.xOff;
447 + *w = r.width / PANGO_SCALE;
448 if (h)
449 *h = font->h;
450 }
451 diff --git a/drw.h b/drw.h
452 index 4bcd5ad..3d3a906 100644
453 --- a/drw.h
454 +++ b/drw.h
455 @@ -7,9 +7,7 @@ typedef struct {
456 typedef struct Fnt {
457 Display *dpy;
458 unsigned int h;
459 - XftFont *xfont;
460 - FcPattern *pattern;
461 - struct Fnt *next;
462 + PangoLayout *layout;
463 } Fnt;
464
465 enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */
466 @@ -23,7 +21,7 @@ typedef struct {
467 Drawable drawable;
468 GC gc;
469 Clr *scheme;
470 - Fnt *fonts;
471 + Fnt *font;
472 } Drw;
473
474 /* Drawable abstraction */
475 @@ -32,10 +30,10 @@ void drw_resize(Drw *drw, unsigned int w, unsigned int h);
476 void drw_free(Drw *drw);
477
478 /* Fnt abstraction */
479 -Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount);
480 -void drw_fontset_free(Fnt* set);
481 -unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
482 -void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
483 +Fnt *drw_font_create(Drw* drw, const char font[]);
484 +void drw_font_free(Fnt* set);
485 +unsigned int drw_font_getwidth(Drw *drw, const char *text, Bool markup);
486 +void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup);
487
488 /* Colorscheme abstraction */
489 void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
490 @@ -46,12 +44,11 @@ Cur *drw_cur_create(Drw *drw, int shape);
491 void drw_cur_free(Drw *drw, Cur *cursor);
492
493 /* Drawing context manipulation */
494 -void drw_setfontset(Drw *drw, Fnt *set);
495 void drw_setscheme(Drw *drw, Clr *scm);
496
497 /* Drawing functions */
498 void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert);
499 -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert);
500 +int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup);
501
502 /* Map functions */
503 void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h);
504 diff --git a/dwm.c b/dwm.c
505 index 9fd0286..cc180c4 100644
506 --- a/dwm.c
507 +++ b/dwm.c
508 @@ -40,6 +40,7 @@
509 #include <X11/extensions/Xinerama.h>
510 #endif /* XINERAMA */
511 #include <X11/Xft/Xft.h>
512 +#include <pango/pango.h>
513
514 #include "drw.h"
515 #include "util.h"
516 @@ -55,7 +56,8 @@
517 #define WIDTH(X) ((X)->w + 2 * (X)->bw)
518 #define HEIGHT(X) ((X)->h + 2 * (X)->bw)
519 #define TAGMASK ((1 << LENGTH(tags)) - 1)
520 -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
521 +#define TEXTW(X) (drw_font_getwidth(drw, (X), False) + lrpad)
522 +#define TEXTWM(X) (drw_font_getwidth(drw, (X), True) + lrpad)
523
524 /* enums */
525 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
526 @@ -237,7 +239,7 @@ static void zoom(const Arg *arg);
527
528 /* variables */
529 static const char broken[] = "broken";
530 -static char stext[256];
531 +static char stext[512];
532 static int screen;
533 static int sw, sh; /* X display screen geometry width, height */
534 static int bh, blw = 0; /* bar geometry */
535 @@ -440,7 +442,7 @@ buttonpress(XEvent *e)
536 arg.ui = 1 << i;
537 } else if (ev->x < x + blw)
538 click = ClkLtSymbol;
539 - else if (ev->x > selmon->ww - TEXTW(stext))
540 + else if (ev->x > selmon->ww - TEXTWM(stext))
541 click = ClkStatusText;
542 else
543 click = ClkWinTitle;
544 @@ -697,16 +699,16 @@ void
545 drawbar(Monitor *m)
546 {
547 int x, w, tw = 0;
548 - int boxs = drw->fonts->h / 9;
549 - int boxw = drw->fonts->h / 6 + 2;
550 + int boxs = drw->font->h / 9;
551 + int boxw = drw->font->h / 6 + 2;
552 unsigned int i, occ = 0, urg = 0;
553 Client *c;
554
555 /* draw status first so it can be overdrawn by tags later */
556 if (m == selmon) { /* status is only drawn on selected monitor */
557 drw_setscheme(drw, scheme[SchemeNorm]);
558 - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
559 - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
560 + tw = TEXTWM(stext) - lrpad + 2; /* 2px right padding */
561 + drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0, True);
562 }
563
564 for (c = m->clients; c; c = c->next) {
565 @@ -718,7 +720,7 @@ drawbar(Monitor *m)
566 for (i = 0; i < LENGTH(tags); i++) {
567 w = TEXTW(tags[i]);
568 drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
569 - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
570 + drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i, False);
571 if (occ & 1 << i)
572 drw_rect(drw, x + boxs, boxs, boxw, boxw,
573 m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
574 @@ -727,12 +729,12 @@ drawbar(Monitor *m)
575 }
576 w = blw = TEXTW(m->ltsymbol);
577 drw_setscheme(drw, scheme[SchemeNorm]);
578 - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
579 + x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0, False);
580
581 if ((w = m->ww - tw - x) > bh) {
582 if (m->sel) {
583 drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
584 - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
585 + drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0, False);
586 if (m->sel->isfloating)
587 drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
588 } else {
589 @@ -1543,10 +1545,10 @@ setup(void)
590 sh = DisplayHeight(dpy, screen);
591 root = RootWindow(dpy, screen);
592 drw = drw_create(dpy, screen, root, sw, sh);
593 - if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
594 + if (!drw_font_create(drw, font))
595 die("no fonts could be loaded.");
596 - lrpad = drw->fonts->h;
597 - bh = drw->fonts->h + 2;
598 + lrpad = drw->font->h;
599 + bh = drw->font->h + 2;
600 updategeom();
601 /* init atoms */
602 utf8string = XInternAtom(dpy, "UTF8_STRING", False);
603 diff --git a/util.h b/util.h
604 index f633b51..531ab25 100644
605 --- a/util.h
606 +++ b/util.h
607 @@ -1,7 +1,11 @@
608 /* See LICENSE file for copyright and license details. */
609
610 +#ifndef MAX
611 #define MAX(A, B) ((A) > (B) ? (A) : (B))
612 +#endif
613 +#ifndef MIN
614 #define MIN(A, B) ((A) < (B) ? (A) : (B))
615 +#endif
616 #define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B))
617
618 void die(const char *fmt, ...);
619 --
620 2.26.2
621