diff --git a/xmenu.c b/xmenu.c
index 68c8360..6e189cc 100644
--- a/xmenu.c
+++ b/xmenu.c
@@ -41,6 +41,7 @@ static struct Menu *parsestdin(void);
 
 /* text drawer, and its helper routine */
 static FcChar32 getnextutf8char(const char *s, const char **end_ret);
+static XftFont *getfontucode(FcChar32 ucode);
 static int drawtext(XftDraw *draw, XftColor *color, int x, int y, unsigned h, const char *text);
 
 /* structure setters, and their helper routines */
@@ -638,53 +639,54 @@ getnextutf8char(const char *s, const char **next_ret)
 	return ucode;
 }
 
-/* draw text into XftDraw */
+/* get which font contains a given code point */
+static XftFont *
+getfontucode(FcChar32 ucode)
+{
+	size_t i;
+
+	for (i = 0; i < dc.nfonts; i++)
+		if (XftCharExists(dpy, dc.fonts[i], ucode) == FcTrue)
+			return dc.fonts[i];
+	return NULL;
+}
+
+/* draw text into XftDraw, return width of text glyphs */
 static int
 drawtext(XftDraw *draw, XftColor *color, int x, int y, unsigned h, const char *text)
 {
-	const char *s, *nexts;
-	FcChar32 ucode;
-	XftFont *currfont;
-	int textlen = 0;
+	int textwidth = 0;
 	int texty;
 
 	texty = y + (h - (dc.fonts[0]->ascent + dc.fonts[0]->descent))/2 + dc.fonts[0]->ascent;
 
-	s = text;
-	while (*s) {
+	while (*text) {
+		XftFont *currfont;
 		XGlyphInfo ext;
-		int charexists;
+		FcChar32 ucode;
+		const char *next;
 		size_t len;
-		size_t i;
 
-		charexists = 0;
-		ucode = getnextutf8char(s, &nexts);
-		for (i = 0; i < dc.nfonts; i++) {
-			charexists = XftCharExists(dpy, dc.fonts[i], ucode);
-			if (charexists)
-				break;
-		}
-		if (charexists)
-			currfont = dc.fonts[i];
+		ucode = getnextutf8char(text, &next);
+		if ((currfont = getfontucode(ucode)) == NULL)
+			currfont = dc.fonts[0];
 
-		len = nexts - s;
+		len = next - text;
 
-		XftTextExtentsUtf8(dpy, currfont, (XftChar8 *)s,
-		                   len, &ext);
-		textlen += ext.xOff;
+		XftTextExtentsUtf8(dpy, currfont, (XftChar8 *)text, len, &ext);
+		textwidth += ext.xOff;
 
 		if (draw) {
 			if (!fflag)
 				texty = y + (h - (currfont->ascent + currfont->descent))/2 + currfont->ascent;
-			XftDrawStringUtf8(draw, color, currfont, x, texty,
-			                  (XftChar8 *)s, len);
+			XftDrawStringUtf8(draw, color, currfont, x, texty, (XftChar8 *)text, len);
 			x += ext.xOff;
 		}
 
-		s = nexts;
+		text = next;
 	}
 
-	return textlen;
+	return textwidth;
 }
 
 /* setup the height, width and icon of the items of a menu */