t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit f8415019d4edc1cd4f310adb256e6656e85bfe75
   DIR parent 238dd5d2b15b8bdc0f05d5be7f86a1ca03d2920b
   URI Author: Anselm R. Garbe <arg@suckless.org>
       Date:   Mon, 19 Feb 2007 15:17:31 +0100
       
       draw.c is useless (belongs to main.c now)
       Diffstat:
         M Makefile                            |       2 +-
         M client.c                            |      12 +-----------
         D draw.c                              |     175 -------------------------------
         M dwm.h                               |      11 +++--------
         M event.c                             |       8 ++++++++
         M main.c                              |     165 +++++++++++++++++++++++++++++++
       
       6 files changed, 178 insertions(+), 195 deletions(-)
       ---
   DIR diff --git a/Makefile b/Makefile
       t@@ -3,7 +3,7 @@
        
        include config.mk
        
       -SRC = client.c draw.c event.c main.c screen.c util.c
       +SRC = client.c event.c main.c screen.c util.c
        OBJ = ${SRC:.c=.o}
        
        all: options dwm
   DIR diff --git a/client.c b/client.c
       t@@ -200,16 +200,6 @@ focusprev(Arg *arg) {
                }
        }
        
       -Client *
       -getclient(Window w) {
       -        Client *c;
       -
       -        for(c = clients; c; c = c->next)
       -                if(c->win == w)
       -                        return c;
       -        return NULL;
       -}
       -
        void
        killclient(Arg *arg) {
                if(!sel)
       t@@ -259,7 +249,7 @@ manage(Window w, XWindowAttributes *wa) {
                XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
                configure(c); /* propagates border_width, if size doesn't change */
                updatetitle(c);
       -        t = getclient(trans);
       +        for(t = clients; t && t->win != c->win; t = t->next);
                settags(c, t);
                if(!c->isfloat)
                        c->isfloat = (t != 0) || c->isfixed;
   DIR diff --git a/draw.c b/draw.c
       t@@ -1,175 +0,0 @@
       -/* (C)opyright MMIV-MMVII Anselm R. Garbe <garbeam at gmail dot com>
       - * See LICENSE file for license details.
       - */
       -#include "dwm.h"
       -#include <stdio.h>
       -#include <string.h>
       -
       -/* static */
       -
       -static Bool
       -isoccupied(unsigned int t)
       -{
       -        Client *c;
       -        for(c = clients; c; c = c->next)
       -                if(c->tags[t])
       -                        return True;
       -        return False;
       -}
       -
       -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
       -drawtext(const char *text, unsigned long col[ColLast], Bool filledsquare, Bool emptysquare) {
       -        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);
       -        }
       -        x = (h + 2) / 4;
       -        r.x = dc.x + 1;
       -        r.y = dc.y + 1;
       -        if(filledsquare) {
       -                r.width = r.height = x + 1;
       -                XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
       -        }
       -        else if(emptysquare) {
       -                r.width = r.height = x;
       -                XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1);
       -        }
       -}
       -
       -/* 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, sel && sel->tags[i], isoccupied(i));
       -                else
       -                        drawtext(tags[i], dc.norm, sel && sel->tags[i], isoccupied(i));
       -                dc.x += dc.w;
       -        }
       -        dc.w = bmw;
       -        drawtext(arrange == dofloat ? FLOATSYMBOL : TILESYMBOL, dc.norm, False, False);
       -        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, False, False);
       -        if((dc.w = dc.x - x) > bh) {
       -                dc.x = x;
       -                drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm, False, False);
       -        }
       -        XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0);
       -        XSync(dpy, False);
       -}
       -
       -unsigned long
       -getcolor(const char *colstr) {
       -        Colormap cmap = DefaultColormap(dpy, screen);
       -        XColor color;
       -
       -        if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
       -                eprint("error, cannot allocate color '%s'\n", colstr);
       -        return color.pixel;
       -}
       -
       -void
       -setfont(const char *fontstr) {
       -        char *def, **missing;
       -        int i, n;
       -
       -        missing = NULL;
       -        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(dc.font.set) {
       -                XFontSetExtents *font_extents;
       -                XFontStruct **xfonts;
       -                char **font_names;
       -                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(dc.font.xfont)
       -                        XFreeFont(dpy, dc.font.xfont);
       -                dc.font.xfont = NULL;
       -                if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)))
       -                        eprint("error, cannot load font: '%s'\n", fontstr);
       -                dc.font.ascent = dc.font.xfont->ascent;
       -                dc.font.descent = dc.font.xfont->descent;
       -        }
       -        dc.font.height = dc.font.ascent + dc.font.descent;
       -}
       -
       -unsigned int
       -textw(const char *text) {
       -        return textnw(text, strlen(text)) + dc.font.height;
       -}
   DIR diff --git a/dwm.h b/dwm.h
       t@@ -103,28 +103,23 @@ extern void configure(Client *c);                /* send synthetic configure event */
        extern void focus(Client *c);                        /* focus c, c may be NULL */
        extern void focusnext(Arg *arg);                /* focuses next visible client, arg is ignored  */
        extern void focusprev(Arg *arg);                /* focuses previous visible client, arg is ignored */
       -extern Client *getclient(Window w);                /* return client of w */
        extern void killclient(Arg *arg);                /* kill c nicely */
        extern void manage(Window w, XWindowAttributes *wa);        /* manage new client */
        Client *nexttiled(Client *c);                        /* returns tiled successor of c */
        extern void resize(Client *c, int x, int y,
       -                int w, int h, Bool sizehints);        /* resize c*/
       +                int w, int h, Bool sizehints);        /* resize with given coordinates c*/
        extern void updatesizehints(Client *c);                /* update the size hint variables of c */
        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 unsigned long getcolor(const char *colstr);        /* return color of colstr */
       -extern void setfont(const char *fontstr);        /* set the font for DC */
       -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 */
        extern void procevent(void);                        /* process pending X events */
        
        /* main.c */
       +extern void drawstatus(void);                        /* draw the bar */
       +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/event.c b/event.c
       t@@ -20,6 +20,14 @@ KEYS
        #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))
        #define MOUSEMASK                (BUTTONMASK | PointerMotionMask)
        
       +static Client *
       +getclient(Window w) {
       +        Client *c;
       +
       +        for(c = clients; c && c->win != w; c = c->next);
       +        return c;
       +}
       +
        static void
        movemouse(Client *c) {
                int x1, y1, ocx, ocy, di, nx, ny;
   DIR diff --git a/main.c b/main.c
       t@@ -61,6 +61,94 @@ 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
       +drawtext(const char *text, unsigned long col[ColLast], Bool filledsquare, Bool emptysquare) {
       +        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);
       +        }
       +        x = (h + 2) / 4;
       +        r.x = dc.x + 1;
       +        r.y = dc.y + 1;
       +        if(filledsquare) {
       +                r.width = r.height = x + 1;
       +                XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
       +        }
       +        else if(emptysquare) {
       +                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);
       +        XColor color;
       +
       +        if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
       +                eprint("error, cannot allocate color '%s'\n", 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@@ -82,6 +170,47 @@ scan(void) {
        }
        
        static void
       +setfont(const char *fontstr) {
       +        char *def, **missing;
       +        int i, n;
       +
       +        missing = NULL;
       +        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(dc.font.set) {
       +                XFontSetExtents *font_extents;
       +                XFontStruct **xfonts;
       +                char **font_names;
       +                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(dc.font.xfont)
       +                        XFreeFont(dpy, dc.font.xfont);
       +                dc.font.xfont = NULL;
       +                if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)))
       +                        eprint("error, cannot load font: '%s'\n", fontstr);
       +                dc.font.ascent = dc.font.xfont->ascent;
       +                dc.font.descent = dc.font.xfont->descent;
       +        }
       +        dc.font.height = dc.font.ascent + dc.font.descent;
       +}
       +
       +static void
        setup(void) {
                int i, j;
                unsigned int mask;
       t@@ -171,6 +300,37 @@ 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, sel && sel->tags[i], isoccupied(i));
       +                else
       +                        drawtext(tags[i], dc.norm, sel && sel->tags[i], isoccupied(i));
       +                dc.x += dc.w;
       +        }
       +        dc.w = bmw;
       +        drawtext(arrange == dofloat ? FLOATSYMBOL : TILESYMBOL, dc.norm, False, False);
       +        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, False, False);
       +        if((dc.w = dc.x - x) > bh) {
       +                dc.x = x;
       +                drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm, False, False);
       +        }
       +        XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0);
       +        XSync(dpy, False);
       +}
       +
       +void
        sendevent(Window w, Atom a, long value) {
                XEvent e;
        
       t@@ -184,6 +344,11 @@ 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;