X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=draw.c;h=76f0c54eeff3086399a10d1698e0c47ea7ff056b;hb=13a529ce63364544bdc851dfd5d3aa2ef8740914;hp=351a43da6cf49d0cdddd947740ac157986a284d1;hpb=11ea52d1709423e0f4e6702aaee2dff2a3b0107e;p=dmenu.git diff --git a/draw.c b/draw.c index 351a43d..76f0c54 100644 --- a/draw.c +++ b/draw.c @@ -9,21 +9,17 @@ #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define DEFFONT "fixed" +#define DEFAULTFN "fixed" static Bool loadfont(DC *dc, const char *fontstr); void drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color) { - XRectangle r; - - r.x = dc->x + x; - r.y = dc->y + y; - r.width = fill ? w : w-1; - r.height = fill ? h : h-1; - XSetForeground(dc->dpy, dc->gc, color); - (fill ? XFillRectangles : XDrawRectangles)(dc->dpy, dc->canvas, dc->gc, &r, 1); + if(fill) + XFillRectangle(dc->dpy, dc->canvas, dc->gc, dc->x + x, dc->y + y, w, h); + else + XDrawRectangle(dc->dpy, dc->canvas, dc->gc, dc->x + x, dc->y + y, w-1, h-1); } void @@ -65,7 +61,7 @@ eprintf(const char *fmt, ...) { vfprintf(stderr, fmt, ap); va_end(ap); - if(fmt[strlen(fmt)-1] == ':') { + if(fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':') { fputc(' ', stderr); perror(NULL); } @@ -100,7 +96,7 @@ initdc(void) { DC *dc; if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fprintf(stderr, "no locale support\n"); + fputs("no locale support\n", stderr); if(!(dc = calloc(1, sizeof *dc))) eprintf("cannot malloc %u bytes:", sizeof *dc); if(!(dc->dpy = XOpenDisplay(NULL))) @@ -113,39 +109,39 @@ initdc(void) { void initfont(DC *dc, const char *fontstr) { - if(!loadfont(dc, fontstr ? fontstr : DEFFONT)) { + if(!loadfont(dc, fontstr ? fontstr : DEFAULTFN)) { if(fontstr != NULL) fprintf(stderr, "cannot load font '%s'\n", fontstr); - if(fontstr == NULL || !loadfont(dc, DEFFONT)) - eprintf("cannot load font '%s'\n", DEFFONT); + if(fontstr == NULL || !loadfont(dc, DEFAULTFN)) + eprintf("cannot load font '%s'\n", DEFAULTFN); } dc->font.height = dc->font.ascent + dc->font.descent; } Bool loadfont(DC *dc, const char *fontstr) { - char *def, **missing; + char *def, **missing, **names; int i, n; + XFontStruct **xfonts; if(!*fontstr) return False; if((dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def))) { - char **names; - XFontStruct **xfonts; - n = XFontsOfFontSet(dc->font.set, &xfonts, &names); - for(i = dc->font.ascent = dc->font.descent = 0; i < n; i++) { - dc->font.ascent = MAX(dc->font.ascent, xfonts[i]->ascent); + for(i = 0; i < n; i++) { + dc->font.ascent = MAX(dc->font.ascent, xfonts[i]->ascent); dc->font.descent = MAX(dc->font.descent, xfonts[i]->descent); + dc->font.width = MAX(dc->font.width, xfonts[i]->max_bounds.width); } } else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) { - dc->font.ascent = dc->font.xfont->ascent; + dc->font.ascent = dc->font.xfont->ascent; dc->font.descent = dc->font.xfont->descent; + dc->font.width = dc->font.xfont->max_bounds.width; } if(missing) XFreeStringList(missing); - return (dc->font.set || dc->font.xfont); + return dc->font.set || dc->font.xfont; } void @@ -158,10 +154,10 @@ resizedc(DC *dc, unsigned int w, unsigned int h) { if(dc->canvas) XFreePixmap(dc->dpy, dc->canvas); - dc->canvas = XCreatePixmap(dc->dpy, DefaultRootWindow(dc->dpy), w, h, - DefaultDepth(dc->dpy, DefaultScreen(dc->dpy))); dc->w = w; dc->h = h; + dc->canvas = XCreatePixmap(dc->dpy, DefaultRootWindow(dc->dpy), w, h, + DefaultDepth(dc->dpy, DefaultScreen(dc->dpy))); } int