aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drw.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drw.c b/drw.c
index 7d985b1..a50c9ee 100644
--- a/drw.c
+++ b/drw.c
@@ -251,7 +251,7 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int
251int 251int
252drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) 252drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
253{ 253{
254 int ty, ellipsis_x = 0; 254 int i, ty, ellipsis_x = 0;
255 unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len, ellipsis_width; 255 unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len, ellipsis_width;
256 XftDraw *d = NULL; 256 XftDraw *d = NULL;
257 Fnt *usedfont, *curfont, *nextfont; 257 Fnt *usedfont, *curfont, *nextfont;
@@ -263,6 +263,9 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
263 FcPattern *match; 263 FcPattern *match;
264 XftResult result; 264 XftResult result;
265 int charexists = 0, overflow = 0; 265 int charexists = 0, overflow = 0;
266 /* keep track of a couple codepoints for which we have no match. */
267 enum { nomatches_len = 64 };
268 static struct { long codepoint[nomatches_len]; unsigned int idx; } nomatches;
266 269
267 if (!drw || (render && !drw->scheme) || !text || !drw->fonts) 270 if (!drw || (render && !drw->scheme) || !text || !drw->fonts)
268 return 0; 271 return 0;
@@ -346,6 +349,12 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
346 * character must be drawn. */ 349 * character must be drawn. */
347 charexists = 1; 350 charexists = 1;
348 351
352 for (i = 0; i < nomatches_len; ++i) {
353 /* avoid calling XftFontMatch if we know we won't find a match */
354 if (utf8codepoint == nomatches.codepoint[i])
355 goto no_match;
356 }
357
349 fccharset = FcCharSetCreate(); 358 fccharset = FcCharSetCreate();
350 FcCharSetAddChar(fccharset, utf8codepoint); 359 FcCharSetAddChar(fccharset, utf8codepoint);
351 360
@@ -374,6 +383,8 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
374 curfont->next = usedfont; 383 curfont->next = usedfont;
375 } else { 384 } else {
376 xfont_free(usedfont); 385 xfont_free(usedfont);
386 nomatches.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint;
387no_match:
377 usedfont = drw->fonts; 388 usedfont = drw->fonts;
378 } 389 }
379 } 390 }