paulo@0: /* (C)opyright MMVI-MMVII Anselm R. Garbe paulo@0: * See LICENSE file for license details. paulo@0: */ paulo@0: #include "dwm.h" paulo@0: #include paulo@0: paulo@0: /* static */ paulo@0: paulo@0: static void paulo@0: drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) { paulo@0: int x; paulo@0: XGCValues gcv; paulo@0: XRectangle r = { dc.x, dc.y, dc.w, dc.h }; paulo@0: paulo@0: gcv.foreground = col[ColFG]; paulo@0: XChangeGC(dpy, dc.gc, GCForeground, &gcv); paulo@0: x = (dc.font.ascent + dc.font.descent + 2) / 4; paulo@0: r.x = dc.x + 1; paulo@0: r.y = dc.y + 1; paulo@0: if(filled) { paulo@0: r.width = r.height = x + 1; paulo@0: XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); paulo@0: } paulo@0: else if(empty) { paulo@0: r.width = r.height = x; paulo@0: XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1); paulo@0: } paulo@0: } paulo@0: paulo@0: static Bool paulo@0: isoccupied(unsigned int t) { paulo@0: Client *c; paulo@0: paulo@0: for(c = clients; c; c = c->next) paulo@0: if(c->tags[t]) paulo@0: return True; paulo@0: return False; paulo@0: } paulo@0: paulo@0: static unsigned int paulo@0: textnw(const char *text, unsigned int len) { paulo@0: XRectangle r; paulo@0: paulo@0: if(dc.font.set) { paulo@0: XmbTextExtents(dc.font.set, text, len, NULL, &r); paulo@0: return r.width; paulo@0: } paulo@0: return XTextWidth(dc.font.xfont, text, len); paulo@0: } paulo@0: paulo@0: /* extern */ paulo@0: paulo@0: void paulo@0: drawstatus(void) { paulo@0: Client *c; paulo@0: int i, j, x; paulo@0: paulo@0: dc.x = dc.y = 0; paulo@0: for(i = 0; i < ntags; i++) { paulo@0: dc.w = textw(tags[i]); paulo@0: if(seltag[i]) { paulo@0: drawtext(tags[i], dc.sel); paulo@0: drawsquare(sel && sel->tags[i], isoccupied(i), dc.sel); paulo@0: } paulo@0: else { paulo@0: drawtext(tags[i], dc.norm); paulo@0: drawsquare(sel && sel->tags[i], isoccupied(i), dc.norm); paulo@0: } paulo@0: dc.x += dc.w; paulo@0: } paulo@0: dc.w = blw; paulo@0: drawtext(lt->symbol, dc.norm); paulo@0: x = dc.x + dc.w; paulo@6: paulo@6: char *_stext = stext; paulo@6: if (getkeymode() == COMMANDMODE) { paulo@6: strcpy(cmtext, "-- CMD -- "); paulo@6: strncat(cmtext, stext, sizeof cmtext - 1 - strlen(cmtext)); paulo@6: _stext = cmtext; paulo@6: } paulo@6: dc.w = textw(_stext); paulo@0: dc.x = sw - dc.w; paulo@0: if(dc.x < x) { paulo@0: dc.x = x; paulo@0: dc.w = sw - x; paulo@0: } paulo@6: drawtext(_stext, dc.norm); paulo@6: paulo@0: if((dc.w = dc.x - x) > bh) { paulo@0: dc.x = x; paulo@3: drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm); paulo@3: } paulo@3: XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0); paulo@3: paulo@3: if (TASKBAR) { paulo@3: dc.x = dc.y = 0; paulo@3: dc.w = sw; paulo@0: for(j=0, c = clients; c; c = c->next) { paulo@0: if(isvisible(c)) paulo@0: j++; paulo@0: } paulo@0: if(j && j < MAX_TASKS) paulo@0: dc.w /= j; paulo@3: else paulo@3: drawtext("", dc.norm); paulo@3: for(c = clients; j && c && dc.x < sw; c = c->next) { paulo@0: if(isvisible(c)) { paulo@0: drawtext(c->name, (c == sel) ? dc.sel : dc.norm); paulo@0: dc.x += dc.w; paulo@0: j--; paulo@0: } paulo@0: } paulo@3: XCopyArea(dpy, dc.drawable, tbarwin, dc.gc, 0, 0, sw, bh, 0, 0); paulo@0: } paulo@3: paulo@0: XSync(dpy, False); paulo@0: } paulo@0: paulo@0: void paulo@0: drawtext(const char *text, unsigned long col[ColLast]) { paulo@0: int x, y, w, h; paulo@0: static char buf[256]; paulo@0: unsigned int len, olen; paulo@0: XGCValues gcv; paulo@0: XRectangle r = { dc.x, dc.y, dc.w, dc.h }; paulo@0: paulo@0: XSetForeground(dpy, dc.gc, col[ColBG]); paulo@0: XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); paulo@0: if(!text) paulo@0: return; paulo@0: w = 0; paulo@0: olen = len = strlen(text); paulo@0: if(len >= sizeof buf) paulo@0: len = sizeof buf - 1; paulo@0: memcpy(buf, text, len); paulo@0: buf[len] = 0; paulo@0: h = dc.font.ascent + dc.font.descent; paulo@0: y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; paulo@0: x = dc.x + (h / 2); paulo@0: /* shorten text if necessary */ paulo@0: while(len && (w = textnw(buf, len)) > dc.w - h) paulo@0: buf[--len] = 0; paulo@0: if(len < olen) { paulo@0: if(len > 1) paulo@0: buf[len - 1] = '.'; paulo@0: if(len > 2) paulo@0: buf[len - 2] = '.'; paulo@0: if(len > 3) paulo@0: buf[len - 3] = '.'; paulo@0: } paulo@0: if(w > dc.w) paulo@0: return; /* too long */ paulo@0: gcv.foreground = col[ColFG]; paulo@0: if(dc.font.set) { paulo@0: XChangeGC(dpy, dc.gc, GCForeground, &gcv); paulo@0: XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); paulo@0: } paulo@0: else { paulo@0: gcv.font = dc.font.xfont->fid; paulo@0: XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv); paulo@0: XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); paulo@0: } paulo@0: } paulo@0: paulo@0: unsigned int paulo@0: textw(const char *text) { paulo@0: return textnw(text, strlen(text)) + dc.font.height; paulo@0: }