t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 36672d0401299a5230b516ca4575365d9f45dd35
   DIR parent b18e6840152b300f2db8ff8dca16aee0839f864b
   URI Author: Anselm R. Garbe <garbeam@gmail.com>
       Date:   Wed, 22 Aug 2007 19:01:05 +0200
       
       removed the _DWM_PROPERTIES handling, reverted ban/unban to XMoveWindow(), and changed argument of setlayout to layout[N].symbol check
       Diffstat:
         M client.c                            |      50 +++++--------------------------
         M config.mk                           |       4 ++--
         M dwm.h                               |       8 ++------
         M event.c                             |       8 +++-----
         M main.c                              |       6 ++----
         M screen.c                            |      48 +++++--------------------------
       
       6 files changed, 23 insertions(+), 101 deletions(-)
       ---
   DIR diff --git a/client.c b/client.c
       t@@ -1,14 +1,11 @@
        /* See LICENSE file for copyright and license details. */
        #include "dwm.h"
        #include <stdlib.h>
       -#include <string.h>
        #include <X11/Xatom.h>
        #include <X11/Xutil.h>
        
        /* static */
        
       -static char buf[128];
       -
        static void
        attachstack(Client *c) {
                c->snext = stack;
       t@@ -102,10 +99,8 @@ void
        ban(Client *c) {
                if(c->isbanned)
                        return;
       -        XUnmapWindow(dpy, c->win);
       -        setclientstate(c, IconicState);
       +        XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
                c->isbanned = True;
       -        c->unmapped++;
        }
        
        void
       t@@ -181,21 +176,6 @@ killclient(const char *arg) {
                        XKillClient(dpy, sel->win);
        }
        
       -Bool
       -getprops(Client *c) {
       -        unsigned int i;
       -        Bool result = False;
       -
       -        if(gettextprop(c->win, dwmprops, buf, sizeof buf)) {
       -                for(i = 0; i < ntags && i < sizeof buf - 1 && buf[i] != '\0'; i++)
       -                        if((c->tags[i] = buf[i] == '1'))
       -                                result = True;
       -                if(i < sizeof buf - 1 && buf[i] != '\0')
       -                        c->isfloating = buf[i] == '1';
       -        }
       -        return result;
       -}
       -
        void
        manage(Window w, XWindowAttributes *wa) {
                unsigned int i;
       t@@ -242,15 +222,14 @@ manage(Window w, XWindowAttributes *wa) {
                if(t)
                        for(i = 0; i < ntags; i++)
                                c->tags[i] = t->tags[i];
       -        if(!getprops(c))
       -                applyrules(c);
       +        applyrules(c);
                if(!c->isfloating)
                        c->isfloating = (rettrans == Success) || c->isfixed;
       -        setprops(c);
                attach(c);
                attachstack(c);
                XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); /* some windows require this */
                ban(c);
       +        XMapWindow(dpy, c->win);
                arrange();
        }
        
       t@@ -318,29 +297,15 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
        }
        
        void
       -setprops(Client *c) {
       -        unsigned int i;
       -
       -        for(i = 0; i < ntags && i < sizeof buf - 1; i++)
       -                buf[i] = c->tags[i] ? '1' : '0';
       -        if(i < sizeof buf - 1)
       -                buf[i++] = c->isfloating ? '1' : '0';
       -        buf[i] = '\0';
       -        XChangeProperty(dpy, c->win, dwmprops, XA_STRING, 8,
       -                        PropModeReplace, (unsigned char *)buf, i);
       -}
       -
       -void
        unban(Client *c) {
                if(!c->isbanned)
                        return;
       -        XMapWindow(dpy, c->win);
       -        setclientstate(c, NormalState);
       +        XMoveWindow(dpy, c->win, c->x, c->y);
                c->isbanned = False;
        }
        
        void
       -unmanage(Client *c, long state) {
       +unmanage(Client *c) {
                XWindowChanges wc;
        
                wc.border_width = c->oldborder;
       t@@ -353,14 +318,13 @@ unmanage(Client *c, long state) {
                if(sel == c)
                        focus(NULL);
                XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
       -        setclientstate(c, state);
       +        setclientstate(c, WithdrawnState);
                free(c->tags);
                free(c);
                XSync(dpy, False);
                XSetErrorHandler(xerror);
                XUngrabServer(dpy);
       -        if(state != NormalState)
       -                arrange();
       +        arrange();
        }
        
        void
   DIR diff --git a/config.mk b/config.mk
       t@@ -20,8 +20,8 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
        # flags
        CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
        LDFLAGS = -s ${LIBS}
       -#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
       -#LDFLAGS = -g ${LIBS}
       +CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
       +LDFLAGS = -g ${LIBS}
        
        # Solaris
        #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
   DIR diff --git a/dwm.h b/dwm.h
       t@@ -48,7 +48,6 @@ struct Client {
                int rx, ry, rw, rh; /* revert geometry */
                int basew, baseh, incw, inch, maxw, maxh, minw, minh;
                int minax, maxax, minay, maxay;
       -        int unmapped;
                long flags; 
                unsigned int border, oldborder;
                Bool isbanned, isfixed, ismax, isfloating;
       t@@ -81,7 +80,7 @@ extern int wax, way, wah, waw;                        /* windowarea geometry */
        extern unsigned int bh, blw, bpos;                /* bar height, bar layout label width, bar position */
        extern unsigned int ntags, numlockmask;                /* number of tags, numlock mask */
        extern void (*handler[LASTEvent])(XEvent *);        /* event handler */
       -extern Atom dwmprops, wmatom[WMLast], netatom[NetLast];
       +extern Atom wmatom[WMLast], netatom[NetLast];
        extern Bool selscreen, *seltags;                /* seltags is array of Bool */
        extern Client *clients, *sel, *stack;                /* global client list and stack */
        extern Cursor cursor[CurLast];
       t@@ -96,13 +95,11 @@ void configure(Client *c);                /* send synthetic configure event */
        void detach(Client *c);                        /* detaches c from global client list */
        void focus(Client *c);                        /* focus c if visible && !NULL, or focus top visible */
        void killclient(const char *arg);        /* kill sel  nicely */
       -Bool getprops(Client *c);                /* gets client properties */
        void manage(Window w, XWindowAttributes *wa);        /* manage new client */
        void resize(Client *c, int x, int y,
                        int w, int h, Bool sizehints);        /* resize with given coordinates c*/
       -void setprops(Client *c);                /* sets client properties */
        void unban(Client *c);                        /* unbans c */
       -void unmanage(Client *c, long state);        /* unmanage c */
       +void unmanage(Client *c);                /* unmanage c */
        void updatesizehints(Client *c);        /* update the size hint variables of c */
        void updatetitle(Client *c);                /* update the name of c */
        
       t@@ -131,7 +128,6 @@ void initlayouts(void);                        /* initialize layout array */
        Bool isarrange(void (*func)());                /* returns True if func is the layout function in use */
        Bool isfloating(void);                        /* returns True if floating layout is enabled */
        Bool isvisible(Client *c);                /* returns True if client is visible */
       -void getdwmprops(void);                        /* gets dwm properties */
        Client *nexttiled(Client *c);                /* returns tiled successor of c */
        void restack(void);                        /* restores z layers of all clients */
        void setlayout(const char *arg);        /* sets layout, NULL means next layout */
   DIR diff --git a/event.c b/event.c
       t@@ -221,7 +221,7 @@ destroynotify(XEvent *e) {
                XDestroyWindowEvent *ev = &e->xdestroywindow;
        
                if((c = getclient(ev->window)))
       -                unmanage(c, WithdrawnState);
       +                unmanage(c);
        }
        
        static void
       t@@ -332,10 +332,8 @@ unmapnotify(XEvent *e) {
                Client *c;
                XUnmapEvent *ev = &e->xunmap;
        
       -        if((c = getclient(ev->window)) && (ev->event == root)) {
       -                if(ev->send_event || c->unmapped-- == 0)
       -                        unmanage(c, WithdrawnState);
       -        }
       +        if((c = getclient(ev->window)))
       +                unmanage(c);
        }
        
        /* extern */
   DIR diff --git a/main.c b/main.c
       t@@ -20,7 +20,7 @@ int screen, sx, sy, sw, sh, wax, way, waw, wah;
        unsigned int bh, ntags;
        unsigned int bpos = BARPOS;
        unsigned int numlockmask = 0;
       -Atom dwmprops, wmatom[WMLast], netatom[NetLast];
       +Atom wmatom[WMLast], netatom[NetLast];
        Bool *seltags;
        Bool selscreen = True;
        Client *clients = NULL;
       t@@ -42,7 +42,7 @@ cleanup(void) {
                close(STDIN_FILENO);
                while(stack) {
                        unban(stack);
       -                unmanage(stack, NormalState);
       +                unmanage(stack);
                }
                if(dc.font.set)
                        XFreeFontSet(dpy, dc.font.set);
       t@@ -165,7 +165,6 @@ setup(void) {
                XSetWindowAttributes wa;
        
                /* init atoms */
       -        dwmprops = XInternAtom(dpy, "_DWM_PROPERTIES", False);
                wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
                wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
                wmatom[WMName] = XInternAtom(dpy, "WM_NAME", False);
       t@@ -231,7 +230,6 @@ setup(void) {
                        XSetFont(dpy, dc.gc, dc.font.xfont->fid);
                /* multihead support */
                selscreen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
       -        getdwmprops();
        }
        
        /*
   DIR diff --git a/screen.c b/screen.c
       t@@ -3,8 +3,6 @@
        #include <regex.h>
        #include <stdio.h>
        #include <stdlib.h>
       -#include <string.h>
       -#include <X11/Xatom.h>
        #include <X11/Xutil.h>
        
        /* static */
       t@@ -28,7 +26,6 @@ typedef struct {
        TAGS
        RULES
        
       -static char buf[512];
        static unsigned int nrules = 0;
        static unsigned int nlayouts = 0;
        static unsigned int ltidx = 0; /* default */
       t@@ -53,19 +50,6 @@ floating(void) { /* default floating layout */
                                resize(c, c->x, c->y, c->w, c->h, True);
        }
        
       -static void
       -setdwmprops(void) {
       -        unsigned int i;
       -
       -        for(i = 0; i < ntags && i < sizeof buf - 1; i++)
       -                buf[i] = seltags[i] ? '1' : '0';
       -        if(i < sizeof buf - 1)
       -                buf[i++] = (char)ltidx + '0';
       -        buf[i] = '\0';
       -        XChangeProperty(dpy, root, dwmprops, XA_STRING, 8,
       -                        PropModeReplace, (unsigned char *)buf, i);
       -}
       -
        LAYOUTS
        
        /* extern */
       t@@ -74,6 +58,7 @@ unsigned int blw = 0;
        
        void
        applyrules(Client *c) {
       +        static char buf[512];
                unsigned int i, j;
                regmatch_t tmp;
                Bool matched = False;
       t@@ -215,20 +200,6 @@ isvisible(Client *c) {
                return False;
        }
        
       -void
       -getdwmprops(void) {
       -        unsigned int i;
       -
       -        if(gettextprop(root, dwmprops, buf, sizeof buf)) {
       -                for(i = 0; i < ntags && i < sizeof buf - 1 && buf[i] != '\0'; i++)
       -                        seltags[i] = buf[i] == '1';
       -                if(i < sizeof buf - 1 && buf[i] != '\0') {
       -                        if((unsigned int)(buf[i] - '0') < nlayouts)
       -                                ltidx = buf[i] - '0';
       -                }
       -        }
       -}
       -
        Client *
        nexttiled(Client *c) {
                for(; c && (c->isfloating || !isvisible(c)); c = c->next);
       t@@ -266,15 +237,17 @@ restack(void) {
        
        void
        setlayout(const char *arg) {
       -        int i;
       +        unsigned int i;
        
                if(!arg) {
                        if(++ltidx == nlayouts)
                                ltidx = 0;;
                }
                else {
       -                i = atoi(arg);
       -                if(i < 0 || i >= nlayouts)
       +                for(i = 0; i < nlayouts; i++)
       +                        if(arg == layouts[i].symbol)
       +                                break;
       +                if(i == nlayouts)
                                return;
                        ltidx = i;
                }
       t@@ -282,7 +255,6 @@ setlayout(const char *arg) {
                        arrange();
                else
                        drawstatus();
       -        setdwmprops();
        }
        
        void
       t@@ -296,7 +268,6 @@ tag(const char *arg) {
                i = idxoftag(arg);
                if(i >= 0 && i < ntags)
                        sel->tags[i] = True;
       -        setprops(sel);
                arrange();
        }
        
       t@@ -315,10 +286,8 @@ togglefloating(const char *arg) {
                if(!sel || isfloating())
                        return;
                sel->isfloating = !sel->isfloating;
       -        if(sel->isfloating) {
       +        if(sel->isfloating)
                        resize(sel, sel->x, sel->y, sel->w, sel->h, True);
       -                setprops(sel);
       -        }
                arrange();
        }
        
       t@@ -352,7 +321,6 @@ toggletag(const char *arg) {
                for(j = 0; j < ntags && !sel->tags[j]; j++);
                if(j == ntags)
                        sel->tags[i] = True;
       -        setprops(sel);
                arrange();
        }
        
       t@@ -365,7 +333,6 @@ toggleview(const char *arg) {
                for(j = 0; j < ntags && !seltags[j]; j++);
                if(j == ntags)
                        seltags[i] = True; /* cannot toggle last view */
       -        setdwmprops();
                arrange();
        }
        
       t@@ -404,6 +371,5 @@ view(const char *arg) {
                i = idxoftag(arg);
                if(i >= 0 && i < ntags)
                        seltags[i] = True;
       -        setdwmprops();
                arrange();
        }