t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit e7508783e85aba0ce4ab09b0dd76c40342113aed
   DIR parent f4d15b1fec52bdd6d512577fd96490efaddb55eb
   URI Author: Anselm R. Garbe <arg@suckless.org>
       Date:   Tue, 20 Feb 2007 13:46:21 +0100
       
       added draw.c again (except getcolor and setfont which are helpers in main.c)
       Diffstat:
         M Makefile                            |       2 +-
         A draw.c                              |     137 +++++++++++++++++++++++++++++++
         M dwm.h                               |      10 ++++++----
         M main.c                              |     128 -------------------------------
       
       4 files changed, 144 insertions(+), 133 deletions(-)
       ---
   DIR diff --git a/Makefile b/Makefile
       t@@ -3,7 +3,7 @@
        
        include config.mk
        
       -SRC = client.c event.c layout.c main.c tag.c util.c
       +SRC = client.c draw.c event.c layout.c main.c tag.c util.c
        OBJ = ${SRC:.c=.o}
        
        all: options dwm
   DIR diff --git a/draw.c b/draw.c
       t@@ -0,0 +1,137 @@
       +/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
       + * See LICENSE file for license details.
       + */
       +#include "dwm.h"
       +#include <string.h>
       +
       +/* static */
       +
       +static unsigned int
       +textnw(const 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
       +drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) {
       +        int x;
       +        XGCValues gcv;
       +        XRectangle r = { dc.x, dc.y, dc.w, dc.h };
       +
       +        gcv.foreground = col[ColFG];
       +        XChangeGC(dpy, dc.gc, GCForeground, &gcv);
       +        x = (dc.font.ascent + dc.font.descent + 2) / 4;
       +        r.x = dc.x + 1;
       +        r.y = dc.y + 1;
       +        if(filled) {
       +                r.width = r.height = x + 1;
       +                XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
       +        }
       +        else if(empty) {
       +                r.width = r.height = x;
       +                XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1);
       +        }
       +}
       +
       +static Bool
       +isoccupied(unsigned int t) {
       +        Client *c;
       +
       +        for(c = clients; c; c = c->next)
       +                if(c->tags[t])
       +                        return True;
       +        return False;
       +}
       +
       +/* extern */
       +
       +void
       +drawstatus(void) {
       +        int i, x;
       +
       +        dc.x = dc.y = 0;
       +        for(i = 0; i < ntags; i++) {
       +                dc.w = textw(tags[i]);
       +                if(seltag[i]) {
       +                        drawtext(tags[i], dc.sel);
       +                        drawsquare(sel && sel->tags[i], isoccupied(i), dc.sel);
       +                }
       +                else {
       +                        drawtext(tags[i], dc.norm);
       +                        drawsquare(sel && sel->tags[i], isoccupied(i), dc.norm);
       +                }
       +                dc.x += dc.w;
       +        }
       +        dc.w = blw;
       +        drawtext(lt->symbol, dc.norm);
       +        x = dc.x + dc.w;
       +        dc.w = textw(stext);
       +        dc.x = sw - dc.w;
       +        if(dc.x < x) {
       +                dc.x = x;
       +                dc.w = sw - x;
       +        }
       +        drawtext(stext, dc.norm);
       +        if((dc.w = dc.x - x) > bh) {
       +                dc.x = x;
       +                drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm);
       +        }
       +        XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0);
       +        XSync(dpy, False);
       +}
       +
       +void
       +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] = '.';
       +        }
       +        if(w > dc.w)
       +                return; /* too long */
       +        gcv.foreground = col[ColFG];
       +        if(dc.font.set) {
       +                XChangeGC(dpy, dc.gc, GCForeground, &gcv);
       +                XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
       +        }
       +        else {
       +                gcv.font = dc.font.xfont->fid;
       +                XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv);
       +                XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
       +        }
       +}
       +
       +unsigned int
       +textw(const char *text) {
       +        return textnw(text, strlen(text)) + dc.font.height;
       +}
   DIR diff --git a/dwm.h b/dwm.h
       t@@ -117,6 +117,12 @@ extern void updatetitle(Client *c);                /* update the name of c */
        extern void unmanage(Client *c);                /* destroy c */
        extern void zoom(Arg *arg);                        /* zooms the focused client to master area, arg is ignored */
        
       +/* draw.c */
       +extern void drawstatus(void);                        /* draw the bar */
       +extern void drawtext(const char *text,
       +                unsigned long col[ColLast]);        /* draw text */
       +extern unsigned int textw(const char *text);        /* return the width of text in px*/
       +
        /* event.c */
        extern void grabkeys(void);                        /* grab all keys defined in config.h */
        
       t@@ -130,10 +136,6 @@ extern void toggleversatile(Arg *arg);                /* toggles focusesd client between versa
        extern void versatile(void);                        /* arranges all windows versatile */
        
        /* main.c */
       -extern void drawstatus(void);                        /* draw the bar */
       -extern void drawtext(const char *text,
       -                unsigned long col[ColLast]);        /* draw text */
       -extern unsigned int textw(const char *text);        /* return the width of text in px*/
        extern void quit(Arg *arg);                        /* quit dwm nicely */
        extern void sendevent(Window w, Atom a, long value);        /* send synthetic event to w */
        extern int xerror(Display *dsply, XErrorEvent *ee);        /* dwm's X error handler */
   DIR diff --git a/main.c b/main.c
       t@@ -61,38 +61,6 @@ cleanup(void) {
                free(seltag);
        }
        
       -static unsigned int
       -textnw(const 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
       -drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) {
       -        int x;
       -        XGCValues gcv;
       -        XRectangle r = { dc.x, dc.y, dc.w, dc.h };
       -
       -        gcv.foreground = col[ColFG];
       -        XChangeGC(dpy, dc.gc, GCForeground, &gcv);
       -        x = (dc.font.ascent + dc.font.descent + 2) / 4;
       -        r.x = dc.x + 1;
       -        r.y = dc.y + 1;
       -        if(filled) {
       -                r.width = r.height = x + 1;
       -                XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
       -        }
       -        else if(empty) {
       -                r.width = r.height = x;
       -                XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1);
       -        }
       -}
       -
        static unsigned long
        getcolor(const char *colstr) {
                Colormap cmap = DefaultColormap(dpy, screen);
       t@@ -103,16 +71,6 @@ getcolor(const char *colstr) {
                return color.pixel;
        }
        
       -static Bool
       -isoccupied(unsigned int t) {
       -        Client *c;
       -
       -        for(c = clients; c; c = c->next)
       -                if(c->tags[t])
       -                        return True;
       -        return False;
       -}
       -
        static void
        scan(void) {
                unsigned int i, num;
       t@@ -264,87 +222,6 @@ xerrorstart(Display *dsply, XErrorEvent *ee) {
        /* extern */
        
        void
       -drawstatus(void) {
       -        int i, x;
       -
       -        dc.x = dc.y = 0;
       -        for(i = 0; i < ntags; i++) {
       -                dc.w = textw(tags[i]);
       -                if(seltag[i]) {
       -                        drawtext(tags[i], dc.sel);
       -                        drawsquare(sel && sel->tags[i], isoccupied(i), dc.sel);
       -                }
       -                else {
       -                        drawtext(tags[i], dc.norm);
       -                        drawsquare(sel && sel->tags[i], isoccupied(i), dc.norm);
       -                }
       -                dc.x += dc.w;
       -        }
       -        dc.w = blw;
       -        drawtext(lt->symbol, dc.norm);
       -        x = dc.x + dc.w;
       -        dc.w = textw(stext);
       -        dc.x = sw - dc.w;
       -        if(dc.x < x) {
       -                dc.x = x;
       -                dc.w = sw - x;
       -        }
       -        drawtext(stext, dc.norm);
       -        if((dc.w = dc.x - x) > bh) {
       -                dc.x = x;
       -                drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm);
       -        }
       -        XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0);
       -        XSync(dpy, False);
       -}
       -
       -void
       -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] = '.';
       -        }
       -        if(w > dc.w)
       -                return; /* too long */
       -        gcv.foreground = col[ColFG];
       -        if(dc.font.set) {
       -                XChangeGC(dpy, dc.gc, GCForeground, &gcv);
       -                XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
       -        }
       -        else {
       -                gcv.font = dc.font.xfont->fid;
       -                XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv);
       -                XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
       -        }
       -}
       -
       -void
        sendevent(Window w, Atom a, long value) {
                XEvent e;
        
       t@@ -358,11 +235,6 @@ sendevent(Window w, Atom a, long value) {
                XSync(dpy, False);
        }
        
       -unsigned int
       -textw(const char *text) {
       -        return textnw(text, strlen(text)) + dc.font.height;
       -}
       -
        void
        quit(Arg *arg) {
                readin = running = False;