dwm-pango-20230520-e81f17d.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-pango-20230520-e81f17d.diff (22140B)
---
1 From 47099f4e65801269e7ec69bfd1f3c209b63da882 Mon Sep 17 00:00:00 2001
2 From: Khalid Bin Walid <kbwalid26@gmail.com>
3 Date: Sat, 20 May 2023 20:38:49 +0900
4 Subject: [PATCH 1/2] apply dwm-pango patch
5
6 ---
7 config.def.h | 2 +-
8 config.mk | 4 +-
9 drw.c | 325 ++++++++++++++-------------------------------------
10 drw.h | 19 ++-
11 dwm.c | 28 ++---
12 util.h | 4 +
13 6 files changed, 117 insertions(+), 265 deletions(-)
14
15 diff --git a/config.def.h b/config.def.h
16 index 9efa774..ef0e1b8 100644
17 --- a/config.def.h
18 +++ b/config.def.h
19 @@ -5,7 +5,7 @@ static const unsigned int borderpx = 1; /* border pixel of windows */
20 static const unsigned int snap = 32; /* snap pixel */
21 static const int showbar = 1; /* 0 means no bar */
22 static const int topbar = 1; /* 0 means bottom bar */
23 -static const char *fonts[] = { "monospace:size=10" };
24 +static const char font[] = "monospace 10";
25 static const char dmenufont[] = "monospace:size=10";
26 static const char col_gray1[] = "#222222";
27 static const char col_gray2[] = "#444444";
28 diff --git a/config.mk b/config.mk
29 index ba64d3d..96c25af 100644
30 --- a/config.mk
31 +++ b/config.mk
32 @@ -22,8 +22,8 @@ FREETYPEINC = /usr/include/freetype2
33 #MANPREFIX = ${PREFIX}/man
34
35 # includes and libs
36 -INCS = -I${X11INC} -I${FREETYPEINC}
37 -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
38 +INCS = -I${X11INC} -I${FREETYPEINC} `pkg-config --cflags xft pango pangoxft`
39 +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} `pkg-config --libs xft pango pangoxft`
40
41 # flags
42 CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
43 diff --git a/drw.c b/drw.c
44 index a58a2b4..d7ebfd8 100644
45 --- a/drw.c
46 +++ b/drw.c
47 @@ -4,62 +4,12 @@
48 #include <string.h>
49 #include <X11/Xlib.h>
50 #include <X11/Xft/Xft.h>
51 +#include <pango/pango.h>
52 +#include <pango/pangoxft.h>
53
54 #include "drw.h"
55 #include "util.h"
56
57 -#define UTF_INVALID 0xFFFD
58 -#define UTF_SIZ 4
59 -
60 -static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0};
61 -static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
62 -static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000};
63 -static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
64 -
65 -static long
66 -utf8decodebyte(const char c, size_t *i)
67 -{
68 - for (*i = 0; *i < (UTF_SIZ + 1); ++(*i))
69 - if (((unsigned char)c & utfmask[*i]) == utfbyte[*i])
70 - return (unsigned char)c & ~utfmask[*i];
71 - return 0;
72 -}
73 -
74 -static size_t
75 -utf8validate(long *u, size_t i)
76 -{
77 - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
78 - *u = UTF_INVALID;
79 - for (i = 1; *u > utfmax[i]; ++i)
80 - ;
81 - return i;
82 -}
83 -
84 -static size_t
85 -utf8decode(const char *c, long *u, size_t clen)
86 -{
87 - size_t i, j, len, type;
88 - long udecoded;
89 -
90 - *u = UTF_INVALID;
91 - if (!clen)
92 - return 0;
93 - udecoded = utf8decodebyte(c[0], &len);
94 - if (!BETWEEN(len, 1, UTF_SIZ))
95 - return 1;
96 - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) {
97 - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type);
98 - if (type)
99 - return j;
100 - }
101 - if (j < len)
102 - return 0;
103 - *u = udecoded;
104 - utf8validate(u, len);
105 -
106 - return len;
107 -}
108 -
109 Drw *
110 drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
111 {
112 @@ -95,50 +45,41 @@ drw_free(Drw *drw)
113 {
114 XFreePixmap(drw->dpy, drw->drawable);
115 XFreeGC(drw->dpy, drw->gc);
116 - drw_fontset_free(drw->fonts);
117 + drw_font_free(drw->font);
118 free(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 + PangoFontMap *fontmap;
155 + PangoContext *context;
156 + PangoFontDescription *desc;
157 + PangoFontMetrics *metrics;
158 +
159 + if (!fontname) {
160 die("no font specified.");
161 }
162
163 font = ecalloc(1, sizeof(Fnt));
164 - font->xfont = xfont;
165 - font->pattern = pattern;
166 - font->h = xfont->ascent + xfont->descent;
167 font->dpy = drw->dpy;
168
169 + fontmap = pango_xft_get_font_map(drw->dpy, drw->screen);
170 + context = pango_font_map_create_context(fontmap);
171 + desc = pango_font_description_from_string(fontname);
172 + font->layout = pango_layout_new(context);
173 + pango_layout_set_font_description(font->layout, desc);
174 +
175 + metrics = pango_context_get_metrics(context, desc, NULL);
176 + font->h = pango_font_metrics_get_height(metrics) / PANGO_SCALE;
177 +
178 + pango_font_metrics_unref(metrics);
179 + g_object_unref(context);
180 +
181 return font;
182 }
183
184 @@ -147,35 +88,28 @@ xfont_free(Fnt *font)
185 {
186 if (!font)
187 return;
188 - if (font->pattern)
189 - FcPatternDestroy(font->pattern);
190 - XftFontClose(font->dpy, font->xfont);
191 + if (font->layout)
192 + g_object_unref(font->layout);
193 free(font);
194 }
195
196 Fnt*
197 -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
198 +drw_font_create(Drw* drw, const char font[])
199 {
200 - Fnt *cur, *ret = NULL;
201 - size_t i;
202 + Fnt *fnt = NULL;
203
204 - if (!drw || !fonts)
205 + if (!drw || !font)
206 return NULL;
207
208 - for (i = 1; i <= fontcount; i++) {
209 - if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) {
210 - cur->next = ret;
211 - ret = cur;
212 - }
213 - }
214 - return (drw->fonts = ret);
215 + fnt = xfont_create(drw, font);
216 +
217 + return (drw->font = fnt);
218 }
219
220 void
221 -drw_fontset_free(Fnt *font)
222 +drw_font_free(Fnt *font)
223 {
224 if (font) {
225 - drw_fontset_free(font->next);
226 xfont_free(font);
227 }
228 }
229 @@ -187,8 +121,8 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
230 return;
231
232 if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
233 - DefaultColormap(drw->dpy, drw->screen),
234 - clrname, dest))
235 + DefaultColormap(drw->dpy, drw->screen),
236 + clrname, dest))
237 die("error, cannot allocate color '%s'", clrname);
238 }
239
240 @@ -209,13 +143,6 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
241 return ret;
242 }
243
244 -void
245 -drw_setfontset(Drw *drw, Fnt *set)
246 -{
247 - if (drw)
248 - drw->fonts = set;
249 -}
250 -
251 void
252 drw_setscheme(Drw *drw, Clr *scm)
253 {
254 @@ -236,26 +163,16 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int
255 }
256
257 int
258 -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
259 +drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup)
260 {
261 - int i, ty, ellipsis_x = 0;
262 - unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len;
263 + char buf[1024];
264 + int i, ty, th;
265 + unsigned int ew, eh;
266 XftDraw *d = NULL;
267 - Fnt *usedfont, *curfont, *nextfont;
268 - int utf8strlen, utf8charlen, render = x || y || w || h;
269 - long utf8codepoint = 0;
270 - const char *utf8str;
271 - FcCharSet *fccharset;
272 - FcPattern *fcpattern;
273 - FcPattern *match;
274 - XftResult result;
275 - int charexists = 0, overflow = 0;
276 - /* keep track of a couple codepoints for which we have no match. */
277 - enum { nomatches_len = 64 };
278 - static struct { long codepoint[nomatches_len]; unsigned int idx; } nomatches;
279 - static unsigned int ellipsis_width = 0;
280 -
281 - if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts)
282 + size_t len;
283 + int render = x || y || w || h;
284 +
285 + if (!drw || (render && !drw->scheme) || !text || !drw->font)
286 return 0;
287
288 if (!render) {
289 @@ -264,120 +181,47 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
290 XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
291 XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
292 d = XftDrawCreate(drw->dpy, drw->drawable,
293 - DefaultVisual(drw->dpy, drw->screen),
294 - DefaultColormap(drw->dpy, drw->screen));
295 + DefaultVisual(drw->dpy, drw->screen),
296 + DefaultColormap(drw->dpy, drw->screen));
297 x += lpad;
298 w -= lpad;
299 }
300
301 - usedfont = drw->fonts;
302 - if (!ellipsis_width && render)
303 - ellipsis_width = drw_fontset_getwidth(drw, "...");
304 - while (1) {
305 - ew = ellipsis_len = utf8strlen = 0;
306 - utf8str = text;
307 - nextfont = NULL;
308 - while (*text) {
309 - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ);
310 - for (curfont = drw->fonts; curfont; curfont = curfont->next) {
311 - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint);
312 - if (charexists) {
313 - drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL);
314 - if (ew + ellipsis_width <= w) {
315 - /* keep track where the ellipsis still fits */
316 - ellipsis_x = x + ew;
317 - ellipsis_w = w - ew;
318 - ellipsis_len = utf8strlen;
319 - }
320 -
321 - if (ew + tmpw > w) {
322 - overflow = 1;
323 - /* called from drw_fontset_getwidth_clamp():
324 - * it wants the width AFTER the overflow
325 - */
326 - if (!render)
327 - x += tmpw;
328 - else
329 - utf8strlen = ellipsis_len;
330 - } else if (curfont == usedfont) {
331 - utf8strlen += utf8charlen;
332 - text += utf8charlen;
333 - ew += tmpw;
334 - } else {
335 - nextfont = curfont;
336 - }
337 - break;
338 - }
339 - }
340 + len = strlen(text);
341
342 - if (overflow || !charexists || nextfont)
343 - break;
344 - else
345 - charexists = 0;
346 + if (len) {
347 + drw_font_getexts(drw->font, text, len, &ew, &eh, markup);
348 + th = eh;
349 + /* shorten text if necessary */
350 + for (len = MIN(len, sizeof(buf) - 1); len && ew > w; len--) {
351 + drw_font_getexts(drw->font, text, len, &ew, &eh, markup);
352 + if (eh > th)
353 + th = eh;
354 }
355
356 - if (utf8strlen) {
357 + if (len) {
358 + memcpy(buf, text, len);
359 + buf[len] = '\0';
360 + if (len < strlen(text))
361 + for (i = len; i && i > len - 3; buf[--i] = '.')
362 + ; /* NOP */
363 +
364 if (render) {
365 - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent;
366 - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg],
367 - usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen);
368 + ty = y + (h - th) / 2;
369 + if(markup)
370 + pango_layout_set_markup(drw->font->layout, buf, len);
371 + else
372 + pango_layout_set_text(drw->font->layout, buf, len);
373 + pango_xft_render_layout(d, &drw->scheme[invert ? ColBg : ColFg],
374 + drw->font->layout, x * PANGO_SCALE, ty * PANGO_SCALE);
375 + if(markup) /* clear markup attributes */
376 + pango_layout_set_attributes(drw->font->layout, NULL);
377 }
378 x += ew;
379 w -= ew;
380 }
381 - if (render && overflow)
382 - drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert);
383 -
384 - if (!*text || overflow) {
385 - break;
386 - } else if (nextfont) {
387 - charexists = 0;
388 - usedfont = nextfont;
389 - } else {
390 - /* Regardless of whether or not a fallback font is found, the
391 - * character must be drawn. */
392 - charexists = 1;
393 -
394 - for (i = 0; i < nomatches_len; ++i) {
395 - /* avoid calling XftFontMatch if we know we won't find a match */
396 - if (utf8codepoint == nomatches.codepoint[i])
397 - goto no_match;
398 - }
399 -
400 - fccharset = FcCharSetCreate();
401 - FcCharSetAddChar(fccharset, utf8codepoint);
402 -
403 - if (!drw->fonts->pattern) {
404 - /* Refer to the comment in xfont_create for more information. */
405 - die("the first font in the cache must be loaded from a font string.");
406 - }
407 -
408 - fcpattern = FcPatternDuplicate(drw->fonts->pattern);
409 - FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
410 - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
411 -
412 - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
413 - FcDefaultSubstitute(fcpattern);
414 - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result);
415 -
416 - FcCharSetDestroy(fccharset);
417 - FcPatternDestroy(fcpattern);
418 -
419 - if (match) {
420 - usedfont = xfont_create(drw, NULL, match);
421 - if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) {
422 - for (curfont = drw->fonts; curfont->next; curfont = curfont->next)
423 - ; /* NOP */
424 - curfont->next = usedfont;
425 - } else {
426 - xfont_free(usedfont);
427 - nomatches.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint;
428 -no_match:
429 - usedfont = drw->fonts;
430 - }
431 - }
432 - }
433 }
434 +
435 if (d)
436 XftDrawDestroy(d);
437
438 @@ -395,35 +239,40 @@ drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
439 }
440
441 unsigned int
442 -drw_fontset_getwidth(Drw *drw, const char *text)
443 +drw_font_getwidth(Drw *drw, const char *text, Bool markup)
444 {
445 - if (!drw || !drw->fonts || !text)
446 + if (!drw || !drw->font || !text)
447 return 0;
448 - return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
449 + return drw_text(drw, 0, 0, 0, 0, 0, text, 0, markup);
450 }
451
452 unsigned int
453 -drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n)
454 +drw_font_getwidth_clamp(Drw *drw, const char *text, unsigned int n, Bool markup)
455 {
456 unsigned int tmp = 0;
457 - if (drw && drw->fonts && text && n)
458 - tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n);
459 + if (drw && drw->font && text && n)
460 + tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n, markup);
461 return MIN(n, tmp);
462 }
463
464 void
465 -drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h)
466 +drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup)
467 {
468 - XGlyphInfo ext;
469 -
470 if (!font || !text)
471 return;
472
473 - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
474 + PangoRectangle r;
475 + if(markup)
476 + pango_layout_set_markup(font->layout, text, len);
477 + else
478 + pango_layout_set_text(font->layout, text, len);
479 + pango_layout_get_extents(font->layout, 0, &r);
480 + if(markup) /* clear markup attributes */
481 + pango_layout_set_attributes(font->layout, NULL);
482 if (w)
483 - *w = ext.xOff;
484 + *w = r.width / PANGO_SCALE;
485 if (h)
486 - *h = font->h;
487 + *h = r.height / PANGO_SCALE;
488 }
489
490 Cur *
491 diff --git a/drw.h b/drw.h
492 index 6471431..9487c72 100644
493 --- a/drw.h
494 +++ b/drw.h
495 @@ -7,9 +7,7 @@ typedef struct {
496 typedef struct Fnt {
497 Display *dpy;
498 unsigned int h;
499 - XftFont *xfont;
500 - FcPattern *pattern;
501 - struct Fnt *next;
502 + PangoLayout *layout;
503 } Fnt;
504
505 enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */
506 @@ -23,7 +21,7 @@ typedef struct {
507 Drawable drawable;
508 GC gc;
509 Clr *scheme;
510 - Fnt *fonts;
511 + Fnt *font;
512 } Drw;
513
514 /* Drawable abstraction */
515 @@ -32,11 +30,11 @@ void drw_resize(Drw *drw, unsigned int w, unsigned int h);
516 void drw_free(Drw *drw);
517
518 /* Fnt abstraction */
519 -Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount);
520 -void drw_fontset_free(Fnt* set);
521 -unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
522 -unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n);
523 -void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
524 +Fnt *drw_font_create(Drw* drw, const char font[]);
525 +void drw_font_free(Fnt* set);
526 +unsigned int drw_font_getwidth(Drw *drw, const char *text, Bool markup);
527 +unsigned int drw_font_getwidth_clamp(Drw *drw, const char *text, unsigned int n, Bool markup);
528 +void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup);
529
530 /* Colorscheme abstraction */
531 void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
532 @@ -47,12 +45,11 @@ Cur *drw_cur_create(Drw *drw, int shape);
533 void drw_cur_free(Drw *drw, Cur *cursor);
534
535 /* Drawing context manipulation */
536 -void drw_setfontset(Drw *drw, Fnt *set);
537 void drw_setscheme(Drw *drw, Clr *scm);
538
539 /* Drawing functions */
540 void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert);
541 -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert);
542 +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);
543
544 /* Map functions */
545 void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h);
546 diff --git a/dwm.c b/dwm.c
547 index f1d86b2..e535d73 100644
548 --- a/dwm.c
549 +++ b/dwm.c
550 @@ -40,6 +40,7 @@
551 #include <X11/extensions/Xinerama.h>
552 #endif /* XINERAMA */
553 #include <X11/Xft/Xft.h>
554 +#include <pango/pango.h>
555
556 #include "drw.h"
557 #include "util.h"
558 @@ -55,7 +56,8 @@
559 #define WIDTH(X) ((X)->w + 2 * (X)->bw)
560 #define HEIGHT(X) ((X)->h + 2 * (X)->bw)
561 #define TAGMASK ((1 << LENGTH(tags)) - 1)
562 -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
563 +#define TEXTW(X) (drw_font_getwidth(drw, (X), False) + lrpad)
564 +#define TEXTWM(X) (drw_font_getwidth(drw, (X), True) + lrpad)
565
566 /* enums */
567 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
568 @@ -236,7 +238,7 @@ static void zoom(const Arg *arg);
569
570 /* variables */
571 static const char broken[] = "broken";
572 -static char stext[256];
573 +static char stext[512];
574 static int screen;
575 static int sw, sh; /* X display screen geometry width, height */
576 static int bh; /* bar height */
577 @@ -441,7 +443,7 @@ buttonpress(XEvent *e)
578 arg.ui = 1 << i;
579 } else if (ev->x < x + TEXTW(selmon->ltsymbol))
580 click = ClkLtSymbol;
581 - else if (ev->x > selmon->ww - (int)TEXTW(stext))
582 + else if (ev->x > selmon->ww - (int)TEXTWM(stext))
583 click = ClkStatusText;
584 else
585 click = ClkWinTitle;
586 @@ -699,8 +701,8 @@ void
587 drawbar(Monitor *m)
588 {
589 int x, w, tw = 0;
590 - int boxs = drw->fonts->h / 9;
591 - int boxw = drw->fonts->h / 6 + 2;
592 + int boxs = drw->font->h / 9;
593 + int boxw = drw->font->h / 6 + 2;
594 unsigned int i, occ = 0, urg = 0;
595 Client *c;
596
597 @@ -710,8 +712,8 @@ drawbar(Monitor *m)
598 /* draw status first so it can be overdrawn by tags later */
599 if (m == selmon) { /* status is only drawn on selected monitor */
600 drw_setscheme(drw, scheme[SchemeNorm]);
601 - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
602 - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
603 + tw = TEXTWM(stext) - lrpad + 2; /* 2px right padding */
604 + drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0, True);
605 }
606
607 for (c = m->clients; c; c = c->next) {
608 @@ -723,7 +725,7 @@ drawbar(Monitor *m)
609 for (i = 0; i < LENGTH(tags); i++) {
610 w = TEXTW(tags[i]);
611 drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
612 - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
613 + drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i, False);
614 if (occ & 1 << i)
615 drw_rect(drw, x + boxs, boxs, boxw, boxw,
616 m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
617 @@ -732,12 +734,12 @@ drawbar(Monitor *m)
618 }
619 w = TEXTW(m->ltsymbol);
620 drw_setscheme(drw, scheme[SchemeNorm]);
621 - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
622 + x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0, False);
623
624 if ((w = m->ww - tw - x) > bh) {
625 if (m->sel) {
626 drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
627 - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
628 + drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0, False);
629 if (m->sel->isfloating)
630 drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
631 } else {
632 @@ -1559,10 +1561,10 @@ setup(void)
633 sh = DisplayHeight(dpy, screen);
634 root = RootWindow(dpy, screen);
635 drw = drw_create(dpy, screen, root, sw, sh);
636 - if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
637 + if (!drw_font_create(drw, font))
638 die("no fonts could be loaded.");
639 - lrpad = drw->fonts->h;
640 - bh = drw->fonts->h + 2;
641 + lrpad = drw->font->h;
642 + bh = drw->font->h + 2;
643 updategeom();
644 /* init atoms */
645 utf8string = XInternAtom(dpy, "UTF8_STRING", False);
646 diff --git a/util.h b/util.h
647 index f633b51..531ab25 100644
648 --- a/util.h
649 +++ b/util.h
650 @@ -1,7 +1,11 @@
651 /* See LICENSE file for copyright and license details. */
652
653 +#ifndef MAX
654 #define MAX(A, B) ((A) > (B) ? (A) : (B))
655 +#endif
656 +#ifndef MIN
657 #define MIN(A, B) ((A) < (B) ? (A) : (B))
658 +#endif
659 #define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B))
660
661 void die(const char *fmt, ...);
662 --
663 2.40.1
664
665
666 From f54ad36bfe201c64f2f7b82c38c01e08a98fb485 Mon Sep 17 00:00:00 2001
667 From: Khalid Bin Walid <kbwalid26@gmail.com>
668 Date: Sat, 20 May 2023 20:54:22 +0900
669 Subject: [PATCH 2/2] revert unintentional space to tab conversion
670
671 ---
672 drw.c | 8 ++++----
673 1 file changed, 4 insertions(+), 4 deletions(-)
674
675 diff --git a/drw.c b/drw.c
676 index d7ebfd8..908bb89 100644
677 --- a/drw.c
678 +++ b/drw.c
679 @@ -121,8 +121,8 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
680 return;
681
682 if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
683 - DefaultColormap(drw->dpy, drw->screen),
684 - clrname, dest))
685 + DefaultColormap(drw->dpy, drw->screen),
686 + clrname, dest))
687 die("error, cannot allocate color '%s'", clrname);
688 }
689
690 @@ -181,8 +181,8 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
691 XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
692 XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
693 d = XftDrawCreate(drw->dpy, drw->drawable,
694 - DefaultVisual(drw->dpy, drw->screen),
695 - DefaultColormap(drw->dpy, drw->screen));
696 + DefaultVisual(drw->dpy, drw->screen),
697 + DefaultColormap(drw->dpy, drw->screen));
698 x += lpad;
699 w -= lpad;
700 }
701 --
702 2.40.1
703