+/* enums */
+enum { ColFG, ColBG, ColLast };
+
+/* typedefs */
+typedef struct {
+       int x, y, w, h;
+       unsigned long norm[ColLast];
+       unsigned long sel[ColLast];
+       Drawable drawable;
+       GC gc;
+       struct {
+               XFontStruct *xfont;
+               XFontSet set;
+               int ascent;
+               int descent;
+               int height;
+       } font;
+} DC; /* draw context */
+
+/* forward declarations */
+static void dccleanup(void);
+static void dcsetup(void);
+static void drawtext(const char *text, unsigned long col[ColLast]);
+static unsigned long getcolor(const char *colstr);
+static void initfont(const char *fontstr);
+static int textnw(const char *text, unsigned int len);
+static int textw(const char *text);
+
+static DC dc;
+
+void
+dccleanup(void) {
+       if(dc.font.set)
+               XFreeFontSet(dpy, dc.font.set);
+       else
+               XFreeFont(dpy, dc.font.xfont);
+       XFreePixmap(dpy, dc.drawable);
+       XFreeGC(dpy, dc.gc);
+}
+
+void
+dcsetup(void) {
+       /* style */
+       dc.norm[ColBG] = getcolor(normbgcolor);
+       dc.norm[ColFG] = getcolor(normfgcolor);
+       dc.sel[ColBG] = getcolor(selbgcolor);
+       dc.sel[ColFG] = getcolor(selfgcolor);
+
+       /* pixmap */
+       dc.drawable = XCreatePixmap(dpy, parent, mw, mh, DefaultDepth(dpy, screen));
+       dc.gc = XCreateGC(dpy, parent, 0, NULL);
+       XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
+       if(!dc.font.set)
+               XSetFont(dpy, dc.gc, dc.font.xfont->fid);
+}