commit 0dff37c09fb9ca69564b440eea711940c4ca2985
Author: Khalid Bin Walid <[email protected]>
Date:   Sat May 20 21:03:00 2023 +0900

    [dwm][patch][pango] update pango patch

diff --git a/dwm.suckless.org/patches/pango/dwm-pango-20230520-e81f17d.diff 
b/dwm.suckless.org/patches/pango/dwm-pango-20230520-e81f17d.diff
new file mode 100644
index 00000000..882dd8b3
--- /dev/null
+++ b/dwm.suckless.org/patches/pango/dwm-pango-20230520-e81f17d.diff
@@ -0,0 +1,703 @@
+From 47099f4e65801269e7ec69bfd1f3c209b63da882 Mon Sep 17 00:00:00 2001
+From: Khalid Bin Walid <[email protected]>
+Date: Sat, 20 May 2023 20:38:49 +0900
+Subject: [PATCH 1/2] apply dwm-pango patch
+
+---
+ config.def.h |   2 +-
+ config.mk    |   4 +-
+ drw.c        | 325 ++++++++++++++-------------------------------------
+ drw.h        |  19 ++-
+ dwm.c        |  28 ++---
+ util.h       |   4 +
+ 6 files changed, 117 insertions(+), 265 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 9efa774..ef0e1b8 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -5,7 +5,7 @@ static const unsigned int borderpx  = 1;        /* border 
pixel of windows */
+ static const unsigned int snap      = 32;       /* snap pixel */
+ static const int showbar            = 1;        /* 0 means no bar */
+ static const int topbar             = 1;        /* 0 means bottom bar */
+-static const char *fonts[]          = { "monospace:size=10" };
++static const char font[]            = "monospace 10";
+ static const char dmenufont[]       = "monospace:size=10";
+ static const char col_gray1[]       = "#222222";
+ static const char col_gray2[]       = "#444444";
+diff --git a/config.mk b/config.mk
+index ba64d3d..96c25af 100644
+--- a/config.mk
++++ b/config.mk
+@@ -22,8 +22,8 @@ FREETYPEINC = /usr/include/freetype2
+ #MANPREFIX = ${PREFIX}/man
+ 
+ # includes and libs
+-INCS = -I${X11INC} -I${FREETYPEINC}
+-LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
++INCS = -I${X11INC} -I${FREETYPEINC} `pkg-config --cflags xft pango pangoxft`
++LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} `pkg-config --libs 
xft pango pangoxft`
+ 
+ # flags
+ CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L 
-DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
+diff --git a/drw.c b/drw.c
+index a58a2b4..d7ebfd8 100644
+--- a/drw.c
++++ b/drw.c
+@@ -4,62 +4,12 @@
+ #include <string.h>
+ #include <X11/Xlib.h>
+ #include <X11/Xft/Xft.h>
++#include <pango/pango.h>
++#include <pango/pangoxft.h>
+ 
+ #include "drw.h"
+ #include "util.h"
+ 
+-#define UTF_INVALID 0xFFFD
+-#define UTF_SIZ     4
+-
+-static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80,    0, 0xC0, 0xE0, 
0xF0};
+-static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 
0xF8};
+-static const long utfmin[UTF_SIZ + 1] = {       0,    0,  0x80,  0x800,  
0x10000};
+-static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 
0x10FFFF};
+-
+-static long
+-utf8decodebyte(const char c, size_t *i)
+-{
+-      for (*i = 0; *i < (UTF_SIZ + 1); ++(*i))
+-              if (((unsigned char)c & utfmask[*i]) == utfbyte[*i])
+-                      return (unsigned char)c & ~utfmask[*i];
+-      return 0;
+-}
+-
+-static size_t
+-utf8validate(long *u, size_t i)
+-{
+-      if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
+-              *u = UTF_INVALID;
+-      for (i = 1; *u > utfmax[i]; ++i)
+-              ;
+-      return i;
+-}
+-
+-static size_t
+-utf8decode(const char *c, long *u, size_t clen)
+-{
+-      size_t i, j, len, type;
+-      long udecoded;
+-
+-      *u = UTF_INVALID;
+-      if (!clen)
+-              return 0;
+-      udecoded = utf8decodebyte(c[0], &len);
+-      if (!BETWEEN(len, 1, UTF_SIZ))
+-              return 1;
+-      for (i = 1, j = 1; i < clen && j < len; ++i, ++j) {
+-              udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type);
+-              if (type)
+-                      return j;
+-      }
+-      if (j < len)
+-              return 0;
+-      *u = udecoded;
+-      utf8validate(u, len);
+-
+-      return len;
+-}
+-
+ Drw *
+ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned 
int h)
+ {
+@@ -95,50 +45,41 @@ drw_free(Drw *drw)
+ {
+       XFreePixmap(drw->dpy, drw->drawable);
+       XFreeGC(drw->dpy, drw->gc);
+-      drw_fontset_free(drw->fonts);
++      drw_font_free(drw->font);
+       free(drw);
+ }
+ 
+ /* This function is an implementation detail. Library users should use
+- * drw_fontset_create instead.
++ * drw_font_create instead.
+  */
+ static Fnt *
+-xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
++xfont_create(Drw *drw, const char *fontname)
+ {
+       Fnt *font;
+-      XftFont *xfont = NULL;
+-      FcPattern *pattern = NULL;
+-
+-      if (fontname) {
+-              /* Using the pattern found at font->xfont->pattern does not 
yield the
+-               * same substitution results as using the pattern returned by
+-               * FcNameParse; using the latter results in the desired fallback
+-               * behaviour whereas the former just results in 
missing-character
+-               * rectangles being drawn, at least with some fonts. */
+-              if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, 
fontname))) {
+-                      fprintf(stderr, "error, cannot load font from name: '%s'
", fontname);
+-                      return NULL;
+-              }
+-              if (!(pattern = FcNameParse((FcChar8 *) fontname))) {
+-                      fprintf(stderr, "error, cannot parse font name to 
pattern: '%s'
", fontname);
+-                      XftFontClose(drw->dpy, xfont);
+-                      return NULL;
+-              }
+-      } else if (fontpattern) {
+-              if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) {
+-                      fprintf(stderr, "error, cannot load font from pattern.
");
+-                      return NULL;
+-              }
+-      } else {
++      PangoFontMap *fontmap;
++      PangoContext *context;
++      PangoFontDescription *desc;
++      PangoFontMetrics *metrics;
++
++      if (!fontname) {
+               die("no font specified.");
+       }
+ 
+       font = ecalloc(1, sizeof(Fnt));
+-      font->xfont = xfont;
+-      font->pattern = pattern;
+-      font->h = xfont->ascent + xfont->descent;
+       font->dpy = drw->dpy;
+ 
++      fontmap = pango_xft_get_font_map(drw->dpy, drw->screen);
++      context = pango_font_map_create_context(fontmap);
++      desc = pango_font_description_from_string(fontname);
++      font->layout = pango_layout_new(context);
++      pango_layout_set_font_description(font->layout, desc);
++
++      metrics = pango_context_get_metrics(context, desc, NULL);
++      font->h = pango_font_metrics_get_height(metrics) / PANGO_SCALE;
++
++      pango_font_metrics_unref(metrics);
++      g_object_unref(context);
++
+       return font;
+ }
+ 
+@@ -147,35 +88,28 @@ xfont_free(Fnt *font)
+ {
+       if (!font)
+               return;
+-      if (font->pattern)
+-              FcPatternDestroy(font->pattern);
+-      XftFontClose(font->dpy, font->xfont);
++      if (font->layout)
++              g_object_unref(font->layout);
+       free(font);
+ }
+ 
+ Fnt*
+-drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
++drw_font_create(Drw* drw, const char font[])
+ {
+-      Fnt *cur, *ret = NULL;
+-      size_t i;
++      Fnt *fnt = NULL;
+ 
+-      if (!drw || !fonts)
++      if (!drw || !font)
+               return NULL;
+ 
+-      for (i = 1; i <= fontcount; i++) {
+-              if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) {
+-                      cur->next = ret;
+-                      ret = cur;
+-              }
+-      }
+-      return (drw->fonts = ret);
++      fnt = xfont_create(drw, font);
++
++      return (drw->font = fnt);
+ }
+ 
+ void
+-drw_fontset_free(Fnt *font)
++drw_font_free(Fnt *font)
+ {
+       if (font) {
+-              drw_fontset_free(font->next);
+               xfont_free(font);
+       }
+ }
+@@ -187,8 +121,8 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
+               return;
+ 
+       if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
+-                             DefaultColormap(drw->dpy, drw->screen),
+-                             clrname, dest))
++                                                 DefaultColormap(drw->dpy, 
drw->screen),
++                                                 clrname, dest))
+               die("error, cannot allocate color '%s'", clrname);
+ }
+ 
+@@ -209,13 +143,6 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t 
clrcount)
+       return ret;
+ }
+ 
+-void
+-drw_setfontset(Drw *drw, Fnt *set)
+-{
+-      if (drw)
+-              drw->fonts = set;
+-}
+-
+ void
+ drw_setscheme(Drw *drw, Clr *scm)
+ {
+@@ -236,26 +163,16 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, 
unsigned int h, int filled, int
+ }
+ 
+ int
+-drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int 
lpad, const char *text, int invert)
++drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int 
lpad, const char *text, int invert, Bool markup)
+ {
+-      int i, ty, ellipsis_x = 0;
+-      unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len;
++      char buf[1024];
++      int i, ty, th;
++      unsigned int ew, eh;
+       XftDraw *d = NULL;
+-      Fnt *usedfont, *curfont, *nextfont;
+-      int utf8strlen, utf8charlen, render = x || y || w || h;
+-      long utf8codepoint = 0;
+-      const char *utf8str;
+-      FcCharSet *fccharset;
+-      FcPattern *fcpattern;
+-      FcPattern *match;
+-      XftResult result;
+-      int charexists = 0, overflow = 0;
+-      /* keep track of a couple codepoints for which we have no match. */
+-      enum { nomatches_len = 64 };
+-      static struct { long codepoint[nomatches_len]; unsigned int idx; } 
nomatches;
+-      static unsigned int ellipsis_width = 0;
+-
+-      if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts)
++      size_t len;
++      int render = x || y || w || h;
++
++      if (!drw || (render && !drw->scheme) || !text || !drw->font)
+               return 0;
+ 
+       if (!render) {
+@@ -264,120 +181,47 @@ drw_text(Drw *drw, int x, int y, unsigned int w, 
unsigned int h, unsigned int lp
+               XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : 
ColBg].pixel);
+               XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
+               d = XftDrawCreate(drw->dpy, drw->drawable,
+-                                DefaultVisual(drw->dpy, drw->screen),
+-                                DefaultColormap(drw->dpy, drw->screen));
++                                                DefaultVisual(drw->dpy, 
drw->screen),
++                                                DefaultColormap(drw->dpy, 
drw->screen));
+               x += lpad;
+               w -= lpad;
+       }
+ 
+-      usedfont = drw->fonts;
+-      if (!ellipsis_width && render)
+-              ellipsis_width = drw_fontset_getwidth(drw, "...");
+-      while (1) {
+-              ew = ellipsis_len = utf8strlen = 0;
+-              utf8str = text;
+-              nextfont = NULL;
+-              while (*text) {
+-                      utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ);
+-                      for (curfont = drw->fonts; curfont; curfont = 
curfont->next) {
+-                              charexists = charexists || 
XftCharExists(drw->dpy, curfont->xfont, utf8codepoint);
+-                              if (charexists) {
+-                                      drw_font_getexts(curfont, text, 
utf8charlen, &tmpw, NULL);
+-                                      if (ew + ellipsis_width <= w) {
+-                                              /* keep track where the 
ellipsis still fits */
+-                                              ellipsis_x = x + ew;
+-                                              ellipsis_w = w - ew;
+-                                              ellipsis_len = utf8strlen;
+-                                      }
+-
+-                                      if (ew + tmpw > w) {
+-                                              overflow = 1;
+-                                              /* called from 
drw_fontset_getwidth_clamp():
+-                                               * it wants the width AFTER the 
overflow
+-                                               */
+-                                              if (!render)
+-                                                      x += tmpw;
+-                                              else
+-                                                      utf8strlen = 
ellipsis_len;
+-                                      } else if (curfont == usedfont) {
+-                                              utf8strlen += utf8charlen;
+-                                              text += utf8charlen;
+-                                              ew += tmpw;
+-                                      } else {
+-                                              nextfont = curfont;
+-                                      }
+-                                      break;
+-                              }
+-                      }
++      len = strlen(text);
+ 
+-                      if (overflow || !charexists || nextfont)
+-                              break;
+-                      else
+-                              charexists = 0;
++      if (len) {
++              drw_font_getexts(drw->font, text, len, &ew, &eh, markup);
++              th = eh;
++              /* shorten text if necessary */
++              for (len = MIN(len, sizeof(buf) - 1); len && ew > w; len--) {
++                      drw_font_getexts(drw->font, text, len, &ew, &eh, 
markup);
++                      if (eh > th)
++                              th = eh;
+               }
+ 
+-              if (utf8strlen) {
++              if (len) {
++                      memcpy(buf, text, len);
++                      buf[len] = '++                  if (len < strlen(text))
++                              for (i = len; i && i > len - 3; buf[--i] = '.')
++                                      ; /* NOP */
++
+                       if (render) {
+-                              ty = y + (h - usedfont->h) / 2 + 
usedfont->xfont->ascent;
+-                              XftDrawStringUtf8(d, &drw->scheme[invert ? 
ColBg : ColFg],
+-                                                usedfont->xfont, x, ty, 
(XftChar8 *)utf8str, utf8strlen);
++                              ty = y + (h - th) / 2;
++                              if(markup)
++                                      
pango_layout_set_markup(drw->font->layout, buf, len);
++                              else
++                                      
pango_layout_set_text(drw->font->layout, buf, len);
++                              pango_xft_render_layout(d, &drw->scheme[invert 
? ColBg : ColFg],
++                                      drw->font->layout, x * PANGO_SCALE, ty 
* PANGO_SCALE);
++                              if(markup) /* clear markup attributes */
++                                      
pango_layout_set_attributes(drw->font->layout, NULL);
+                       }
+                       x += ew;
+                       w -= ew;
+               }
+-              if (render && overflow)
+-                      drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", 
invert);
+-
+-              if (!*text || overflow) {
+-                      break;
+-              } else if (nextfont) {
+-                      charexists = 0;
+-                      usedfont = nextfont;
+-              } else {
+-                      /* Regardless of whether or not a fallback font is 
found, the
+-                       * character must be drawn. */
+-                      charexists = 1;
+-
+-                      for (i = 0; i < nomatches_len; ++i) {
+-                              /* avoid calling XftFontMatch if we know we 
won't find a match */
+-                              if (utf8codepoint == nomatches.codepoint[i])
+-                                      goto no_match;
+-                      }
+-
+-                      fccharset = FcCharSetCreate();
+-                      FcCharSetAddChar(fccharset, utf8codepoint);
+-
+-                      if (!drw->fonts->pattern) {
+-                              /* Refer to the comment in xfont_create for 
more information. */
+-                              die("the first font in the cache must be loaded 
from a font string.");
+-                      }
+-
+-                      fcpattern = FcPatternDuplicate(drw->fonts->pattern);
+-                      FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
+-                      FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
+-
+-                      FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
+-                      FcDefaultSubstitute(fcpattern);
+-                      match = XftFontMatch(drw->dpy, drw->screen, fcpattern, 
&result);
+-
+-                      FcCharSetDestroy(fccharset);
+-                      FcPatternDestroy(fcpattern);
+-
+-                      if (match) {
+-                              usedfont = xfont_create(drw, NULL, match);
+-                              if (usedfont && XftCharExists(drw->dpy, 
usedfont->xfont, utf8codepoint)) {
+-                                      for (curfont = drw->fonts; 
curfont->next; curfont = curfont->next)
+-                                              ; /* NOP */
+-                                      curfont->next = usedfont;
+-                              } else {
+-                                      xfont_free(usedfont);
+-                                      nomatches.codepoint[++nomatches.idx % 
nomatches_len] = utf8codepoint;
+-no_match:
+-                                      usedfont = drw->fonts;
+-                              }
+-                      }
+-              }
+       }
++
+       if (d)
+               XftDrawDestroy(d);
+ 
+@@ -395,35 +239,40 @@ drw_map(Drw *drw, Window win, int x, int y, unsigned int 
w, unsigned int h)
+ }
+ 
+ unsigned int
+-drw_fontset_getwidth(Drw *drw, const char *text)
++drw_font_getwidth(Drw *drw, const char *text, Bool markup)
+ {
+-      if (!drw || !drw->fonts || !text)
++      if (!drw || !drw->font || !text)
+               return 0;
+-      return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
++      return drw_text(drw, 0, 0, 0, 0, 0, text, 0, markup);
+ }
+ 
+ unsigned int
+-drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n)
++drw_font_getwidth_clamp(Drw *drw, const char *text, unsigned int n, Bool 
markup)
+ {
+       unsigned int tmp = 0;
+-      if (drw && drw->fonts && text && n)
+-              tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n);
++      if (drw && drw->font && text && n)
++              tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n, markup);
+       return MIN(n, tmp);
+ }
+ 
+ void
+-drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int 
*w, unsigned int *h)
++drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int 
*w, unsigned int *h, Bool markup)
+ {
+-      XGlyphInfo ext;
+-
+       if (!font || !text)
+               return;
+ 
+-      XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
++      PangoRectangle r;
++      if(markup)
++              pango_layout_set_markup(font->layout, text, len);
++      else
++              pango_layout_set_text(font->layout, text, len);
++      pango_layout_get_extents(font->layout, 0, &r);
++      if(markup) /* clear markup attributes */
++              pango_layout_set_attributes(font->layout, NULL);
+       if (w)
+-              *w = ext.xOff;
++              *w = r.width / PANGO_SCALE;
+       if (h)
+-              *h = font->h;
++              *h = r.height / PANGO_SCALE;
+ }
+ 
+ Cur *
+diff --git a/drw.h b/drw.h
+index 6471431..9487c72 100644
+--- a/drw.h
++++ b/drw.h
+@@ -7,9 +7,7 @@ typedef struct {
+ typedef struct Fnt {
+       Display *dpy;
+       unsigned int h;
+-      XftFont *xfont;
+-      FcPattern *pattern;
+-      struct Fnt *next;
++      PangoLayout *layout;
+ } Fnt;
+ 
+ enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */
+@@ -23,7 +21,7 @@ typedef struct {
+       Drawable drawable;
+       GC gc;
+       Clr *scheme;
+-      Fnt *fonts;
++      Fnt *font;
+ } Drw;
+ 
+ /* Drawable abstraction */
+@@ -32,11 +30,11 @@ void drw_resize(Drw *drw, unsigned int w, unsigned int h);
+ void drw_free(Drw *drw);
+ 
+ /* Fnt abstraction */
+-Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount);
+-void drw_fontset_free(Fnt* set);
+-unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
+-unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned 
int n);
+-void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned 
int *w, unsigned int *h);
++Fnt *drw_font_create(Drw* drw, const char font[]);
++void drw_font_free(Fnt* set);
++unsigned int drw_font_getwidth(Drw *drw, const char *text, Bool markup);
++unsigned int drw_font_getwidth_clamp(Drw *drw, const char *text, unsigned int 
n, Bool markup);
++void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned 
int *w, unsigned int *h, Bool markup);
+ 
+ /* Colorscheme abstraction */
+ void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
+@@ -47,12 +45,11 @@ Cur *drw_cur_create(Drw *drw, int shape);
+ void drw_cur_free(Drw *drw, Cur *cursor);
+ 
+ /* Drawing context manipulation */
+-void drw_setfontset(Drw *drw, Fnt *set);
+ void drw_setscheme(Drw *drw, Clr *scm);
+ 
+ /* Drawing functions */
+ void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int 
filled, int invert);
+-int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned 
int lpad, const char *text, int invert);
++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);
+ 
+ /* Map functions */
+ void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int 
h);
+diff --git a/dwm.c b/dwm.c
+index f1d86b2..e535d73 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -40,6 +40,7 @@
+ #include <X11/extensions/Xinerama.h>
+ #endif /* XINERAMA */
+ #include <X11/Xft/Xft.h>
++#include <pango/pango.h>
+ 
+ #include "drw.h"
+ #include "util.h"
+@@ -55,7 +56,8 @@
+ #define WIDTH(X)                ((X)->w + 2 * (X)->bw)
+ #define HEIGHT(X)               ((X)->h + 2 * (X)->bw)
+ #define TAGMASK                 ((1 << LENGTH(tags)) - 1)
+-#define TEXTW(X)                (drw_fontset_getwidth(drw, (X)) + lrpad)
++#define TEXTW(X)                (drw_font_getwidth(drw, (X), False) + lrpad)
++#define TEXTWM(X)               (drw_font_getwidth(drw, (X), True) + lrpad)
+ 
+ /* enums */
+ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
+@@ -236,7 +238,7 @@ static void zoom(const Arg *arg);
+ 
+ /* variables */
+ static const char broken[] = "broken";
+-static char stext[256];
++static char stext[512];
+ static int screen;
+ static int sw, sh;           /* X display screen geometry width, height */
+ static int bh;               /* bar height */
+@@ -441,7 +443,7 @@ buttonpress(XEvent *e)
+                       arg.ui = 1 << i;
+               } else if (ev->x < x + TEXTW(selmon->ltsymbol))
+                       click = ClkLtSymbol;
+-              else if (ev->x > selmon->ww - (int)TEXTW(stext))
++              else if (ev->x > selmon->ww - (int)TEXTWM(stext))
+                       click = ClkStatusText;
+               else
+                       click = ClkWinTitle;
+@@ -699,8 +701,8 @@ void
+ drawbar(Monitor *m)
+ {
+       int x, w, tw = 0;
+-      int boxs = drw->fonts->h / 9;
+-      int boxw = drw->fonts->h / 6 + 2;
++      int boxs = drw->font->h / 9;
++      int boxw = drw->font->h / 6 + 2;
+       unsigned int i, occ = 0, urg = 0;
+       Client *c;
+ 
+@@ -710,8 +712,8 @@ drawbar(Monitor *m)
+       /* draw status first so it can be overdrawn by tags later */
+       if (m == selmon) { /* status is only drawn on selected monitor */
+               drw_setscheme(drw, scheme[SchemeNorm]);
+-              tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
+-              drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
++              tw = TEXTWM(stext) - lrpad + 2; /* 2px right padding */
++              drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0, True);
+       }
+ 
+       for (c = m->clients; c; c = c->next) {
+@@ -723,7 +725,7 @@ drawbar(Monitor *m)
+       for (i = 0; i < LENGTH(tags); i++) {
+               w = TEXTW(tags[i]);
+               drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? 
SchemeSel : SchemeNorm]);
+-              drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
++              drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i, 
False);
+               if (occ & 1 << i)
+                       drw_rect(drw, x + boxs, boxs, boxw, boxw,
+                               m == selmon && selmon->sel && selmon->sel->tags 
& 1 << i,
+@@ -732,12 +734,12 @@ drawbar(Monitor *m)
+       }
+       w = TEXTW(m->ltsymbol);
+       drw_setscheme(drw, scheme[SchemeNorm]);
+-      x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
++      x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0, False);
+ 
+       if ((w = m->ww - tw - x) > bh) {
+               if (m->sel) {
+                       drw_setscheme(drw, scheme[m == selmon ? SchemeSel : 
SchemeNorm]);
+-                      drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
++                      drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0, 
False);
+                       if (m->sel->isfloating)
+                               drw_rect(drw, x + boxs, boxs, boxw, boxw, 
m->sel->isfixed, 0);
+               } else {
+@@ -1559,10 +1561,10 @@ setup(void)
+       sh = DisplayHeight(dpy, screen);
+       root = RootWindow(dpy, screen);
+       drw = drw_create(dpy, screen, root, sw, sh);
+-      if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
++      if (!drw_font_create(drw, font))
+               die("no fonts could be loaded.");
+-      lrpad = drw->fonts->h;
+-      bh = drw->fonts->h + 2;
++      lrpad = drw->font->h;
++      bh = drw->font->h + 2;
+       updategeom();
+       /* init atoms */
+       utf8string = XInternAtom(dpy, "UTF8_STRING", False);
+diff --git a/util.h b/util.h
+index f633b51..531ab25 100644
+--- a/util.h
++++ b/util.h
+@@ -1,7 +1,11 @@
+ /* See LICENSE file for copyright and license details. */
+ 
++#ifndef MAX
+ #define MAX(A, B)               ((A) > (B) ? (A) : (B))
++#endif
++#ifndef MIN
+ #define MIN(A, B)               ((A) < (B) ? (A) : (B))
++#endif
+ #define BETWEEN(X, A, B)        ((A) <= (X) && (X) <= (B))
+ 
+ void die(const char *fmt, ...);
+-- 
+2.40.1
+
+
+From f54ad36bfe201c64f2f7b82c38c01e08a98fb485 Mon Sep 17 00:00:00 2001
+From: Khalid Bin Walid <[email protected]>
+Date: Sat, 20 May 2023 20:54:22 +0900
+Subject: [PATCH 2/2] revert unintentional space to tab conversion
+
+---
+ drw.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drw.c b/drw.c
+index d7ebfd8..908bb89 100644
+--- a/drw.c
++++ b/drw.c
+@@ -121,8 +121,8 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
+               return;
+ 
+       if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
+-                                                 DefaultColormap(drw->dpy, 
drw->screen),
+-                                                 clrname, dest))
++                           DefaultColormap(drw->dpy, drw->screen),
++                           clrname, dest))
+               die("error, cannot allocate color '%s'", clrname);
+ }
+ 
+@@ -181,8 +181,8 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned 
int h, unsigned int lp
+               XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : 
ColBg].pixel);
+               XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
+               d = XftDrawCreate(drw->dpy, drw->drawable,
+-                                                DefaultVisual(drw->dpy, 
drw->screen),
+-                                                DefaultColormap(drw->dpy, 
drw->screen));
++                          DefaultVisual(drw->dpy, drw->screen),
++                          DefaultColormap(drw->dpy, drw->screen));
+               x += lpad;
+               w -= lpad;
+       }
+-- 
+2.40.1
+
diff --git a/dwm.suckless.org/patches/pango/index.md 
b/dwm.suckless.org/patches/pango/index.md
index 53784eb2..06b548a8 100644
--- a/dwm.suckless.org/patches/pango/index.md
+++ b/dwm.suckless.org/patches/pango/index.md
@@ -35,6 +35,7 @@ The last patch fixes some vertical alignment issues which 
were obvious only for
 
 Download
 --------
+* [dwm-pango-20230520-e81f17d.diff](dwm-pango-20230520-e81f17d.diff)
 * [dwm-pango-20201020-519f869.diff](dwm-pango-20201020-519f869.diff)
 * [dwm-pango-20200428-f09418b.diff](dwm-pango-20200428-f09418b.diff)
 * [dwm-pango-6.0.diff](dwm-pango-6.0.diff)


Reply via email to