X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=draw.c;h=de4bdb0e4feb377d2a3803d8c9076d35f7ebd9dd;hp=455c137e5b64aa128c2e4fb9d0264ea67cd18f9f;hb=1f9614f82e14fa3a46e0db05346b41d6be611f88;hpb=650a1fb4e1a798aca48a53739f5bb2649191bc1c diff --git a/draw.c b/draw.c index 455c137..de4bdb0 100644 --- a/draw.c +++ b/draw.c @@ -2,13 +2,13 @@ * (C)opyright MMIV-MMVI Anselm R. Garbe * See LICENSE file for license details. */ +#include "dwm.h" #include #include - #include -#include "wm.h" +/* static */ static void drawborder(void) @@ -29,8 +29,19 @@ drawborder(void) XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); } -void -draw(Bool border, const char *text) +static unsigned int +textnw(char *text, unsigned int len) +{ + XRectangle r; + if(dc.font.set) { + XmbTextExtents(dc.font.set, text, len, NULL, &r); + return r.width; + } + return XTextWidth(dc.font.xfont, text, len); +} + +static void +drawtext(const char *text, Bool invert, Bool border) { int x, y, w, h; unsigned int len; @@ -38,7 +49,7 @@ draw(Bool border, const char *text) XGCValues gcv; XRectangle r = { dc.x, dc.y, dc.w, dc.h }; - XSetForeground(dpy, dc.gc, dc.bg); + XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); w = 0; @@ -59,14 +70,14 @@ draw(Bool border, const char *text) x = dc.x + (h / 2); /* shorten text if necessary */ - while(len && (w = textnw(&dc.font, buf, len)) > dc.w - h) + while(len && (w = textnw(buf, len)) > dc.w - h) buf[--len] = 0; if(w > dc.w) return; /* too long */ - gcv.foreground = dc.fg; - gcv.background = dc.bg; + gcv.foreground = invert ? dc.bg : dc.fg; + gcv.background = invert ? dc.fg : dc.bg; if(dc.font.set) { XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc, @@ -79,93 +90,146 @@ draw(Bool border, const char *text) } } -static unsigned long -xinitcolors(Colormap cmap, const char *colstr) -{ - XColor color; - XAllocNamedColor(dpy, cmap, colstr, &color, &color); - return color.pixel; -} +/* extern */ void -initcolors(const char *bg, const char *fg, const char *border) +drawall() { - Colormap cmap = DefaultColormap(dpy, screen); - dc.bg = xinitcolors(cmap, bg); - dc.fg = xinitcolors(cmap, fg); - dc.border = xinitcolors(cmap, border); + Client *c; + + for(c = clients; c; c = getnext(c->next, tsel)) + drawtitle(c); + drawstatus(); } -unsigned int -textnw(Fnt *font, char *text, unsigned int len) +void +drawstatus() { - XRectangle r; - if(font->set) { - XmbTextExtents(font->set, text, len, NULL, &r); - return r.width; + int i; + Bool istile = arrange == dotile; + + dc.x = dc.y = 0; + dc.w = bw; + drawtext(NULL, !istile, False); + + dc.w = 0; + for(i = 0; i < TLast; i++) { + dc.x += dc.w; + dc.w = textw(tags[i]); + if(istile) + drawtext(tags[i], (i == tsel), True); + else + drawtext(tags[i], (i != tsel), True); + } + if(sel) { + dc.x += dc.w; + dc.w = textw(sel->name); + drawtext(sel->name, istile, True); } - return XTextWidth(font->xfont, text, len); + dc.w = textw(stext); + dc.x = bx + bw - dc.w; + drawtext(stext, !istile, False); + + XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0); + XSync(dpy, False); } -unsigned int -textw(Fnt *font, char *text) +void +drawtitle(Client *c) { - return textnw(font, text, strlen(text)); + int i; + Bool istile = arrange == dotile; + + if(c == sel) { + drawstatus(); + XUnmapWindow(dpy, c->title); + XSetWindowBorder(dpy, c->win, dc.fg); + return; + } + + XSetWindowBorder(dpy, c->win, dc.bg); + XMapWindow(dpy, c->title); + + dc.x = dc.y = 0; + + dc.w = 0; + for(i = 0; i < TLast; i++) { + if(c->tags[i]) { + dc.x += dc.w; + dc.w = textw(c->tags[i]); + drawtext(c->tags[i], !istile, True); + } + } + dc.x += dc.w; + dc.w = textw(c->name); + drawtext(c->name, !istile, True); + XCopyArea(dpy, dc.drawable, c->title, dc.gc, 0, 0, c->tw, c->th, 0, 0); + XSync(dpy, False); } -unsigned int -texth(Fnt *font) +unsigned long +getcolor(const char *colstr) { - return font->height + 4; + XColor color; + Colormap cmap = DefaultColormap(dpy, screen); + + XAllocNamedColor(dpy, cmap, colstr, &color, &color); + return color.pixel; } void -initfont(Fnt *font, const char *fontstr) +setfont(const char *fontstr) { char **missing, *def; int i, n; missing = NULL; setlocale(LC_ALL, ""); - if(font->set) - XFreeFontSet(dpy, font->set); - font->set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); + if(dc.font.set) + XFreeFontSet(dpy, dc.font.set); + dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); if(missing) { while(n--) fprintf(stderr, "missing fontset: %s\n", missing[n]); XFreeStringList(missing); - if(font->set) { - XFreeFontSet(dpy, font->set); - font->set = NULL; + if(dc.font.set) { + XFreeFontSet(dpy, dc.font.set); + dc.font.set = NULL; } } - if(font->set) { + if(dc.font.set) { XFontSetExtents *font_extents; XFontStruct **xfonts; char **font_names; - font->ascent = font->descent = 0; - font_extents = XExtentsOfFontSet(font->set); - n = XFontsOfFontSet(font->set, &xfonts, &font_names); - for(i = 0, font->ascent = 0, font->descent = 0; i < n; i++) { - if(font->ascent < (*xfonts)->ascent) - font->ascent = (*xfonts)->ascent; - if(font->descent < (*xfonts)->descent) - font->descent = (*xfonts)->descent; + dc.font.ascent = dc.font.descent = 0; + font_extents = XExtentsOfFontSet(dc.font.set); + n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); + for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) { + if(dc.font.ascent < (*xfonts)->ascent) + dc.font.ascent = (*xfonts)->ascent; + if(dc.font.descent < (*xfonts)->descent) + dc.font.descent = (*xfonts)->descent; xfonts++; } } else { - if(font->xfont) - XFreeFont(dpy, font->xfont); - font->xfont = NULL; - font->xfont = XLoadQueryFont(dpy, fontstr); - if (!font->xfont) - font->xfont = XLoadQueryFont(dpy, "fixed"); - if (!font->xfont) - error("error, cannot init 'fixed' font\n"); - font->ascent = font->xfont->ascent; - font->descent = font->xfont->descent; + if(dc.font.xfont) + XFreeFont(dpy, dc.font.xfont); + dc.font.xfont = NULL; + dc.font.xfont = XLoadQueryFont(dpy, fontstr); + if (!dc.font.xfont) + dc.font.xfont = XLoadQueryFont(dpy, "fixed"); + if (!dc.font.xfont) + eprint("error, cannot init 'fixed' font\n"); + dc.font.ascent = dc.font.xfont->ascent; + dc.font.descent = dc.font.xfont->descent; } - font->height = font->ascent + font->descent; + dc.font.height = dc.font.ascent + dc.font.descent; +} + +unsigned int +textw(char *text) +{ + return textnw(text, strlen(text)) + dc.font.height; }