Workaround Xft BadLength X error - libsl - shared code master of various suckless projects
 (HTM) git clone git://git.suckless.org/libsl
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit 53ebcb48c6b12882c6dbe352ee43c96b2fb01b84
 (DIR) parent e1132a979e39d6cdb8c34ea5496c901a5b8c2d79
 (HTM) Author: Thomas Spurden <thomas@spurden.name>
       Date:   Wed, 16 Jan 2019 21:51:30 +0000
       
       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.
       
       Diffstat:
         M drw.c                               |      14 ++++++++++++++
       
       1 file changed, 14 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git 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);