commit 53ebcb48c6b12882c6dbe352ee43c96b2fb01b84
Author:     Thomas Spurden <[email protected]>
AuthorDate: Wed Jan 16 21:51:30 2019 +0000
Commit:     Anselm R Garbe <[email protected]>
CommitDate: Sat Feb 2 04:37:06 2019 -0800

    Workaround Xft BadLength X error
    
    Modify the fontconfig pattern to prefer non-color fonts, and discard any
    selected font which has the color flag set. Using these fonts with Xft is 
just
    going to generate a BadLength X error.

diff --git a/drw.c b/drw.c
index c1582e7..8fd1ca4 100644
--- a/drw.c
+++ b/drw.c
@@ -132,6 +132,19 @@ xfont_create(Drw *drw, const char *fontname, FcPattern 
*fontpattern)
                die("no font specified.");
        }
 
+       /* Do not allow using color fonts. This is a workaround for a BadLength
+        * error from Xft with color glyphs. Modelled on the Xterm workaround. 
See
+        * https://bugzilla.redhat.com/show_bug.cgi?id=1498269
+        * https://lists.suckless.org/dev/1701/30932.html
+        * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349
+        * and lots more all over the internet.
+        */
+       FcBool iscol;
+       if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == 
FcResultMatch && iscol) {
+               XftFontClose(drw->dpy, xfont);
+               return NULL;
+       }
+
        font = ecalloc(1, sizeof(Fnt));
        font->xfont = xfont;
        font->pattern = pattern;
@@ -337,6 +350,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned 
int h, unsigned int lp
                        fcpattern = FcPatternDuplicate(drw->fonts->pattern);
                        FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
                        FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
+                       FcPatternAddBool(fcpattern, FC_COLOR, FcFalse);
 
                        FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
                        FcDefaultSubstitute(fcpattern);

Reply via email to