-drawtext(const char *text, unsigned long col[ColLast]) {
- int x, y, w, h;
- static char buf[256];
- unsigned int len, olen;
- XGCValues gcv;
- XRectangle r = { dc.x, dc.y, dc.w, dc.h };
-
- XSetForeground(dpy, dc.gc, col[ColBG]);
- XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
- if(!text)
- return;
- w = 0;
- olen = len = strlen(text);
- if(len >= sizeof buf)
- len = sizeof buf - 1;
- memcpy(buf, text, len);
- buf[len] = 0;
- h = dc.font.ascent + dc.font.descent;
- y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
- x = dc.x + (h / 2);
- /* shorten text if necessary */
- while(len && (w = textnw(buf, len)) > dc.w - h)
- buf[--len] = 0;
- if(len < olen) {
- if(len > 1)
- buf[len - 1] = '.';
- if(len > 2)
- buf[len - 2] = '.';
- if(len > 3)
- buf[len - 3] = '.';
+freedc(DC *dc) {
+ if(dc->font.set)
+ XFreeFontSet(dc->dpy, dc->font.set);
+ if(dc->font.xfont)
+ XFreeFont(dc->dpy, dc->font.xfont);
+ if(dc->canvas)
+ XFreePixmap(dc->dpy, dc->canvas);
+ XFreeGC(dc->dpy, dc->gc);
+ XCloseDisplay(dc->dpy);
+ free(dc);
+}
+
+unsigned long
+getcolor(DC *dc, const char *colstr) {
+ Colormap cmap = DefaultColormap(dc->dpy, DefaultScreen(dc->dpy));
+ XColor color;
+
+ if(!XAllocNamedColor(dc->dpy, cmap, colstr, &color, &color))
+ eprintf("cannot allocate color '%s'\n", colstr);
+ return color.pixel;
+}
+
+DC *
+initdc(void) {
+ DC *dc;
+
+ if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())
+ fprintf(stderr, "no locale support\n");
+ if(!(dc = calloc(1, sizeof *dc)))
+ eprintf("cannot malloc %u bytes:", sizeof *dc);
+ if(!(dc->dpy = XOpenDisplay(NULL)))
+ eprintf("cannot open display\n");
+
+ dc->gc = XCreateGC(dc->dpy, DefaultRootWindow(dc->dpy), 0, NULL);
+ XSetLineAttributes(dc->dpy, dc->gc, 1, LineSolid, CapButt, JoinMiter);
+ return dc;
+}
+
+void
+initfont(DC *dc, const char *fontstr) {
+ if(!loadfont(dc, fontstr ? fontstr : DEFAULTFN)) {
+ if(fontstr != NULL)
+ fprintf(stderr, "cannot load font '%s'\n", fontstr);
+ if(fontstr == NULL || !loadfont(dc, DEFAULTFN))
+ eprintf("cannot load font '%s'\n", DEFAULTFN);