t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 10d13f01ff764ba0e875adf5d2b83c49aa08d148
   DIR parent 8fcc4ff0ae2b20f9605370cee02ebcda50f8777c
   URI Author: Anselm R. Garbe <garbeam@gmail.com>
       Date:   Wed, 15 Aug 2007 19:27:32 +0200
       
       fififi
       Diffstat:
         M Makefile                            |       2 +-
         M client.c                            |      14 ++------------
         M dwm.h                               |       6 +++---
         M event.c                             |       5 +++--
         M main.c                              |       7 ++++---
         M tag.c                               |      31 ++++++++++++++++++++++---------
       
       6 files changed, 35 insertions(+), 30 deletions(-)
       ---
   DIR diff --git a/Makefile b/Makefile
       t@@ -36,7 +36,7 @@ dist: clean
                @echo creating dist tarball
                @mkdir -p dwm-${VERSION}
                @cp -R LICENSE Makefile README config.*.h config.mk \
       -                dwm.1 dwm.h ${SRC} dwm-${VERSION}
       +                dwm.1 dwm.h tile.h ${SRC} dwm-${VERSION}
                @tar -cf dwm-${VERSION}.tar dwm-${VERSION}
                @gzip dwm-${VERSION}.tar
                @rm -rf dwm-${VERSION}
   DIR diff --git a/client.c b/client.c
       t@@ -297,16 +297,6 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
        }
        
        void
       -togglefloating(const char *arg) {
       -        if(!sel || isfloating())
       -                return;
       -        sel->isfloating = !sel->isfloating;
       -        if(sel->isfloating)
       -                resize(sel, sel->x, sel->y, sel->w, sel->h, True);
       -        arrange();
       -}
       -
       -void
        unban(Client *c) {
                if(!c->isbanned)
                        return;
       t@@ -316,7 +306,7 @@ unban(Client *c) {
        }
        
        void
       -unmanage(Client *c) {
       +unmanage(Client *c, long state) {
                XWindowChanges wc;
        
                wc.border_width = c->oldborder;
       t@@ -329,7 +319,7 @@ unmanage(Client *c) {
                if(sel == c)
                        focus(NULL);
                XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
       -        setclientstate(c, WithdrawnState);
       +        setclientstate(c, state);
                free(c->tags);
                free(c);
                XSync(dpy, False);
   DIR diff --git a/dwm.h b/dwm.h
       t@@ -81,7 +81,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 dwmtags, wmatom[WMLast], netatom[NetLast];
       +extern Atom dwmconfig, wmatom[WMLast], netatom[NetLast];
        extern Bool selscreen, *seltag;                        /* seltag is array of Bool */
        extern Client *clients, *sel, *stack;                /* global client list and stack */
        extern Cursor cursor[CurLast];
       t@@ -99,9 +99,8 @@ void killclient(const char *arg);        /* kill sel  nicely */
        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 togglefloating(const char *arg);        /* toggles sel between floating/tiled state */
        void unban(Client *c);                        /* unbans c */
       -void unmanage(Client *c);                /* destroy c */
       +void unmanage(Client *c, long state);        /* unmanage c */
        void updatesizehints(Client *c);        /* update the size hint variables of c */
        void updatetitle(Client *c);                /* update the name of c */
        
       t@@ -136,6 +135,7 @@ void compileregs(void);                        /* initialize regexps of rules defined in config.h */
        Bool isvisible(Client *c);                /* returns True if client is visible */
        void settags(Client *c, Client *trans);        /* sets tags of c */
        void tag(const char *arg);                /* tags sel with arg's index */
       +void togglefloating(const char *arg);        /* toggles sel between floating/tiled state */
        void toggletag(const char *arg);        /* toggles sel tags with arg's index */
        void toggleview(const char *arg);        /* toggles the tag with arg's index (in)visible */
        void view(const char *arg);                /* views the tag with arg's index */
   DIR diff --git a/event.c b/event.c
       t@@ -4,6 +4,7 @@
        #include <stdlib.h>
        #include <X11/keysym.h>
        #include <X11/Xatom.h>
       +#include <X11/Xutil.h>
        
        /* static */
        
       t@@ -226,7 +227,7 @@ destroynotify(XEvent *e) {
                XDestroyWindowEvent *ev = &e->xdestroywindow;
        
                if((c = getclient(ev->window)))
       -                unmanage(c);
       +                unmanage(c, WithdrawnState);
        }
        
        static void
       t@@ -338,7 +339,7 @@ unmapnotify(XEvent *e) {
        
                if((c = getclient(ev->window)) && (ev->event == root)) {
                        if(ev->send_event || c->unmapped-- == 0)
       -                        unmanage(c);
       +                        unmanage(c, WithdrawnState);
                }
        }
        
   DIR diff --git a/main.c b/main.c
       t@@ -11,6 +11,7 @@
        #include <X11/keysym.h>
        #include <X11/Xatom.h>
        #include <X11/Xproto.h>
       +#include <X11/Xutil.h>
        
        /* extern */
        
       t@@ -19,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 dwmtags, wmatom[WMLast], netatom[NetLast];
       +Atom dwmconfig, wmatom[WMLast], netatom[NetLast];
        Bool *seltag;
        Bool selscreen = True;
        Client *clients = NULL;
       t@@ -41,7 +42,7 @@ cleanup(void) {
                close(STDIN_FILENO);
                while(stack) {
                        unban(stack);
       -                unmanage(stack);
       +                unmanage(stack, NormalState);
                }
                if(dc.font.set)
                        XFreeFontSet(dpy, dc.font.set);
       t@@ -139,7 +140,7 @@ setup(void) {
                XSetWindowAttributes wa;
        
                /* init atoms */
       -        dwmtags = XInternAtom(dpy, "__DWM_TAGS", False);
       +        dwmconfig = XInternAtom(dpy, "_DWM_CONFIG", False);
                wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
                wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
                wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
   DIR diff --git a/tag.c b/tag.c
       t@@ -28,14 +28,15 @@ static unsigned int nrules = 0;
        static char prop[512];
        
        static void
       -persisttags(Client *c)
       -{
       +persistconfig(Client *c) {
                unsigned int i;
        
                for(i = 0; i < ntags && i < sizeof prop - 1; i++)
       -                prop[i] = c->tags[i] ? '+' : '-';
       +                prop[i] = c->tags[i] ? '1' : '0';
       +        if(i < sizeof prop - 1)
       +                prop[i++] = c->isfloating ? '1' : '0';
                prop[i] = '\0';
       -        XChangeProperty(dpy, c->win, dwmtags, XA_STRING, 8,
       +        XChangeProperty(dpy, c->win, dwmconfig, XA_STRING, 8,
                                PropModeReplace, (unsigned char *)prop, i);
        }
        
       t@@ -93,14 +94,16 @@ settags(Client *c, Client *trans) {
                else {
                        /* check if window has set a property */
                        name.nitems = 0;
       -                XGetTextProperty(dpy, c->win, &name, dwmtags);
       +                XGetTextProperty(dpy, c->win, &name, dwmconfig);
                        if(name.nitems && name.encoding == XA_STRING) {
                                strncpy(prop, (char *)name.value, sizeof prop - 1);
                                prop[sizeof prop - 1] = '\0';
                                XFree(name.value);
                                for(i = 0; i < ntags && i < sizeof prop - 1 && prop[i] != '\0'; i++)
       -                                if((c->tags[i] = prop[i] == '+'))
       +                                if((c->tags[i] = prop[i] == '1'))
                                                matched = True;
       +                        if(i < sizeof prop - 1 && prop[i] != '\0')
       +                                c->isfloating = prop[i] == '1';
                        }
                }
                if(!matched) {
       t@@ -127,7 +130,7 @@ settags(Client *c, Client *trans) {
                if(!matched)
                        for(i = 0; i < ntags; i++)
                                c->tags[i] = seltag[i];
       -        persisttags(c);
       +        persistconfig(c);
        }
        
        void
       t@@ -142,7 +145,17 @@ tag(const char *arg) {
                if(i >= 0 && i < ntags)
                        sel->tags[i] = True;
                if(sel)
       -                persisttags(sel);
       +                persistconfig(sel);
       +        arrange();
       +}
       +
       +void
       +togglefloating(const char *arg) {
       +        if(!sel || isfloating())
       +                return;
       +        sel->isfloating = !sel->isfloating;
       +        if(sel->isfloating)
       +                resize(sel, sel->x, sel->y, sel->w, sel->h, True);
                arrange();
        }
        
       t@@ -158,7 +171,7 @@ toggletag(const char *arg) {
                if(j == ntags)
                        sel->tags[i] = True;
                if(sel)
       -                persisttags(sel);
       +                persistconfig(sel);
                arrange();
        }