[SEL_RECTANGULAR] = Mod1Mask,
 };
 
+/*
+ * Printable characters in ASCII, used to estimate the advance width
+ * of single wide characters.
+ */
+static char ascii_printable[] =
+       " !\"#$%&'()*+,-./0123456789:;<=>?"
+       "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
+       "`abcdefghijklmnopqrstuvwxyz{|}~";
 
 #define LEN(a)                 (sizeof(a) / sizeof(a)[0])
 #define DEFAULT(a, b)          (a) = (a) ? (a) : (b)
 #define BETWEEN(x, a, b)       ((a) <= (x) && (x) <= (b))
+#define DIVCEIL(n, d)          (((n) + ((d) - 1)) / (d))
 #define ISCONTROLC0(c)         (BETWEEN(c, 0, 0x1f) || (c) == '\177')
 #define ISCONTROLC1(c)         (BETWEEN(c, 0x80, 0x9f))
 #define ISCONTROL(c)           (ISCONTROLC0(c) || ISCONTROLC1(c))
 {
        FcPattern *match;
        FcResult result;
+       XGlyphInfo extents;
 
        match = FcFontMatch(NULL, pattern, &result);
        if (!match)
                return 1;
        }
 
+       XftTextExtentsUtf8(xw.dpy, f->match,
+               (const FcChar8 *) ascii_printable,
+               LEN(ascii_printable), &extents);
+
        f->set = NULL;
        f->pattern = FcPatternDuplicate(pattern);
 
        f->rbearing = f->match->max_advance_width;
 
        f->height = f->ascent + f->descent;
-       f->width = f->lbearing + f->rbearing;
+       f->width = DIVCEIL(extents.xOff, LEN(ascii_printable));
 
        return 0;
 }