]> git.armaanb.net Git - dmenu.git/blobdiff - drw.c
Switch to dark theme
[dmenu.git] / drw.c
diff --git a/drw.c b/drw.c
index 95839c98ee51047677d6313c89f679d3e9d533ba..4cdbcbe51c2945f1f9be817e910f0331e1f1ea64 100644 (file)
--- a/drw.c
+++ b/drw.c
@@ -95,6 +95,7 @@ drw_free(Drw *drw)
 {
        XFreePixmap(drw->dpy, drw->drawable);
        XFreeGC(drw->dpy, drw->gc);
+       drw_fontset_free(drw->fonts);
        free(drw);
 }
 
@@ -129,7 +130,20 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
                        return NULL;
                }
        } else {
-               die("no font specified.\n");
+               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));
@@ -188,7 +202,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
        if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
                               DefaultColormap(drw->dpy, drw->screen),
                               clrname, dest))
-               die("error, cannot allocate color '%s'\n", clrname);
+               die("error, cannot allocate color '%s'", clrname);
 }
 
 /* Wrapper to create color schemes. The caller has to call free(3) on the
@@ -331,12 +345,13 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
 
                        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.\n");
+                               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);
+                       FcPatternAddBool(fcpattern, FC_COLOR, FcFalse);
 
                        FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
                        FcDefaultSubstitute(fcpattern);