X-Git-Url: https://git.danieliu.xyz/?p=dwm.git;a=blobdiff_plain;f=drw.c;h=8f1059e963aba9b8af48821e68b1bf27979ff439;hp=987e53b3aa22190a1debc7bbad18ae1061a4a6e4;hb=HEAD;hpb=7af4d439bdb5a2e40aca69446a3367bd71431c45 diff --git a/drw.c b/drw.c index 987e53b..8f1059e 100644 --- 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)); @@ -180,7 +194,7 @@ drw_fontset_free(Fnt *font) } void -drw_clr_create(Drw *drw, XftColor *dest, const char *clrname) +drw_clr_create(Drw *drw, Clr *dest, const char *clrname) { if (!drw || !dest || !clrname) return; @@ -188,16 +202,16 @@ drw_clr_create(Drw *drw, XftColor *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 * returned color scheme when done using it. */ -Scm -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) +Clr * +drw_scm_create(Drw *drw, char *clrnames[], size_t clrcount) { size_t i; - Scm ret; + Clr *ret; /* need at least two colors for a scheme */ if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) @@ -216,7 +230,7 @@ drw_setfontset(Drw *drw, Fnt *set) } void -drw_setscheme(Drw *drw, Scm scm) +drw_setscheme(Drw *drw, Clr *scm) { if (drw) drw->scheme = scm; @@ -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);