+/* 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);
+}