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