dwm-pango-20200428-f09418b.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-pango-20200428-f09418b.diff (19188B) | |
--- | |
1 From c48056710a4ca6a6e52be60b0165313f9461f663 Mon Sep 17 00:00:00 2001 | |
2 From: Marius Iacob <[email protected]> | |
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; /* borde… | |
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 pang… | |
45 +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} `pkg-config --… | |
46 | |
47 # flags | |
48 CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -D… | |
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, 0x… | |
67 -static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0x… | |
68 -static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800,… | |
69 -static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF,… | |
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, 0… | |
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, unsig… | |
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… | |
135 - * same substitution results as using the pattern retur… | |
136 - * FcNameParse; using the latter results in the desired… | |
137 - * behaviour whereas the former just results in missing… | |
138 - * rectangles being drawn, at least with some fonts. */ | |
139 - if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fo… | |
140 - fprintf(stderr, "error, cannot load font from n… | |
141 - return NULL; | |
142 - } | |
143 - if (!(pattern = FcNameParse((FcChar8 *) fontname))) { | |
144 - fprintf(stderr, "error, cannot parse font name … | |
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 p… | |
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 B… | |
162 - * error from Xft with color glyphs. Modelled on the Xterm work… | |
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) == FcR… | |
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_langua… | |
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[], si… | |
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, u… | |
258 } | |
259 | |
260 int | |
261 -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsign… | |
262 +drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsign… | |
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, u… | |
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, … | |
297 - for (curfont = drw->fonts; curfont; curfont = c… | |
298 - charexists = charexists || XftCharExist… | |
299 - if (charexists) { | |
300 - if (curfont == usedfont) { | |
301 - utf8strlen += utf8charl… | |
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,… | |
318 - /* shorten text if necessary */ | |
319 - for (len = MIN(utf8strlen, sizeof(buf) - 1); le… | |
320 - drw_font_getexts(usedfont, utf8str, len… | |
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;… | |
327 - ; /* NOP */ | |
328 - | |
329 - if (render) { | |
330 - ty = y + (h - usedfont->h) / 2 … | |
331 - XftDrawStringUtf8(d, &drw->sche… | |
332 - usedfont->xfo… | |
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… | |
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… | |
354 - die("the first font in the cache must b… | |
355 - } | |
356 - | |
357 - fcpattern = FcPatternDuplicate(drw->fonts->patt… | |
358 - FcPatternAddCharSet(fcpattern, FC_CHARSET, fcch… | |
359 - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue… | |
360 - FcPatternAddBool(fcpattern, FC_COLOR, FcFalse); | |
361 - | |
362 - FcConfigSubstitute(NULL, fcpattern, FcMatchPatt… | |
363 - FcDefaultSubstitute(fcpattern); | |
364 - match = XftFontMatch(drw->dpy, drw->screen, fcp… | |
365 - | |
366 - FcCharSetDestroy(fccharset); | |
367 - FcPatternDestroy(fcpattern); | |
368 - | |
369 - if (match) { | |
370 - usedfont = xfont_create(drw, NULL, matc… | |
371 - if (usedfont && XftCharExists(drw->dpy,… | |
372 - for (curfont = drw->fonts; curf… | |
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, marku… | |
383 + /* shorten text if necessary */ | |
384 + for (len = MIN(len, sizeof(buf) - 1); len && ew > w; le… | |
385 + drw_font_getexts(drw->font, text, len, &ew, NUL… | |
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->fo… | |
398 + else | |
399 + pango_layout_set_text(drw->font… | |
400 + pango_xft_render_layout(d, &drw->scheme… | |
401 + drw->font->layout, x * PANGO_SC… | |
402 + if(markup) /* clear markup attributes */ | |
403 + pango_layout_set_attributes(drw… | |
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, unsign… | |
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, unsigne… | |
429 +drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigne… | |
430 { | |
431 - XGlyphInfo ext; | |
432 - | |
433 if (!font || !text) | |
434 return; | |
435 | |
436 - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, le… | |
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 i… | |
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, un… | |
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, un… | |
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, i… | |
499 -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, un… | |
500 +int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, un… | |
501 | |
502 /* Map functions */ | |
503 void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsign… | |
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) + l… | |
522 +#define TEXTWM(X) (drw_font_getwidth(drw, (X), True) + l… | |
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 << … | |
569 - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 … | |
570 + drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 … | |
571 if (occ & 1 << i) | |
572 drw_rect(drw, x + boxs, boxs, boxw, boxw, | |
573 m == selmon && selmon->sel && selmon->s… | |
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 ? SchemeS… | |
584 - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->n… | |
585 + drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->n… | |
586 if (m->sel->isfloating) | |
587 drw_rect(drw, x + boxs, boxs, boxw, box… | |
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 |