t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 4641aa2925731ac180b08c80f57db176391ea4a9
   DIR parent dfd84f9bf3b9d949412a73bc62a43109b340d395
   URI Author: Anselm R. Garbe <garbeam@wmii.de>
       Date:   Wed, 12 Jul 2006 16:00:51 +0200
       
       added grid mode on Mod1Mask g
       
       Diffstat:
         M Makefile                            |       2 +-
         M client.c                            |      70 ++++++++++++++++++++++++++++++-
         D cmd.c                               |      52 -------------------------------
         M config.mk                           |       2 +-
         M kb.c                                |      12 +++++++-----
         M wm.c                                |      12 ++++++++++++
         M wm.h                                |      13 +++++++------
       
       7 files changed, 97 insertions(+), 66 deletions(-)
       ---
   DIR diff --git a/Makefile b/Makefile
       t@@ -3,7 +3,7 @@
        
        include config.mk
        
       -WMSRC = bar.c client.c cmd.c draw.c event.c kb.c mouse.c util.c wm.c
       +WMSRC = bar.c client.c draw.c event.c kb.c mouse.c util.c wm.c
        WMOBJ = ${WMSRC:.c=.o}
        MENSRC = menu.c draw.c util.c
        MENOBJ = ${MENSRC:.c=.o}
   DIR diff --git a/client.c b/client.c
       t@@ -3,6 +3,7 @@
         * See LICENSE file for license details.
         */
        
       +#include <math.h>
        #include <stdlib.h>
        #include <string.h>
        #include <X11/Xatom.h>
       t@@ -10,6 +11,73 @@
        #include "util.h"
        #include "wm.h"
        
       +void
       +arrange(void *aux)
       +{
       +        Client *c;
       +        int n, cols, rows, gw, gh, i, j;
       +    float rt, fd;
       +
       +        if(!clients)
       +                return;
       +        for(n = 0, c = clients; c; c = c->next, n++);
       +        rt = sqrt(n);
       +        if(modff(rt, &fd) < 0.5)
       +                rows = floor(rt);
       +        else
       +                rows = ceil(rt);
       +        if(rows * rows < n)
       +                cols = rows + 1;
       +        else
       +                cols = rows;
       +
       +        gw = (sw - 1)  / cols;
       +        gh = (sh - bh - 1) / rows;
       +
       +        for(i = j = 0, c = clients; c; c = c->next) {
       +                c->x = i * gw;
       +                c->y = j * gh + bh;
       +                c->w = gw;
       +                c->h = gh;
       +                resize(c);
       +                if(++i == cols) {
       +                        j++;
       +                        i = 0;
       +                }
       +        }
       +}
       +
       +void
       +sel(void *aux)
       +{
       +        const char *arg = aux;
       +        Client *c = NULL;
       +
       +        if(!arg || !stack)
       +                return;
       +        if(!strncmp(arg, "next", 5))
       +                c = stack->snext ? stack->snext : stack;
       +        else if(!strncmp(arg, "prev", 5))
       +                for(c = stack; c && c->snext; c = c->snext);
       +        if(!c)
       +                c = stack;
       +        raise(c);
       +        focus(c);
       +}
       +
       +void
       +kill(void *aux)
       +{
       +        Client *c = stack;
       +
       +        if(!c)
       +                return;
       +        if(c->proto & WM_PROTOCOL_DELWIN)
       +                send_message(c->win, wm_atom[WMProtocols], wm_atom[WMDelete]);
       +        else
       +                XKillClient(dpy, c->win);
       +}
       +
        static void
        resize_title(Client *c)
        {
       t@@ -113,7 +181,7 @@ focus(Client *c)
                        draw_client(old);
                }
                XUnmapWindow(dpy, c->title);
       -        draw_client(old);
       +        draw_client(c);
                XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
                XFlush(dpy);
        }
   DIR diff --git a/cmd.c b/cmd.c
       t@@ -1,52 +0,0 @@
       -/*
       - * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
       - * See LICENSE file for license details.
       - */
       -
       -#include "wm.h"
       -#include <stdio.h>
       -#include <string.h>
       -
       -void
       -run(void *aux)
       -{
       -        spawn(dpy, aux);
       -}
       -
       -void
       -quit(void *aux)
       -{
       -        running = False;
       -}
       -
       -void
       -sel(void *aux)
       -{
       -        const char *arg = aux;
       -        Client *c = NULL;
       -
       -        if(!arg || !stack)
       -                return;
       -        if(!strncmp(arg, "next", 5))
       -                c = stack->snext ? stack->snext : stack;
       -        else if(!strncmp(arg, "prev", 5))
       -                for(c = stack; c && c->snext; c = c->snext);
       -        if(!c)
       -                c = stack;
       -        raise(c);
       -        focus(c);
       -}
       -
       -void
       -kill(void *aux)
       -{
       -        Client *c = stack;
       -
       -        if(!c)
       -                return;
       -        if(c->proto & WM_PROTOCOL_DELWIN)
       -                send_message(c->win, wm_atom[WMProtocols], wm_atom[WMDelete]);
       -        else
       -                XKillClient(dpy, c->win);
       -}
       -
   DIR diff --git a/config.mk b/config.mk
       t@@ -11,7 +11,7 @@ X11LIB = /usr/X11R6/lib
        VERSION = 0.0
        
        # includes and libs
       -LIBS = -L${PREFIX}/lib -L/usr/lib -lc -L${X11LIB} -lX11
       +LIBS = -L${PREFIX}/lib -L/usr/lib -lc -lm -L${X11LIB} -lX11
        
        # Linux/BSD
        CFLAGS = -g -Wall -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
   DIR diff --git a/kb.c b/kb.c
       t@@ -13,16 +13,18 @@ static const char *term[] = {
        };
        
        static const char *proglist[] = {
       -                "sh", "-c", "exec `ls -lL /bin /sbin /usr/bin /usr/local/bin 2>/dev/null | awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | gridmenu`", 0
       +                "sh", "-c", "exec `ls -lL /bin /sbin /usr/bin /usr/local/bin 2>/dev/null "
       +                "| awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | gridmenu`", 0
        };
        
        static Key key[] = {
                { Mod1Mask, XK_Return, run, term },
                { Mod1Mask, XK_p, run, proglist }, 
       -        { Mod1Mask, XK_k, sel, "prev"}, 
       -        { Mod1Mask, XK_j, sel, "next"}, 
       -        { Mod1Mask | ShiftMask, XK_c, kill, NULL}, 
       -        { Mod1Mask | ShiftMask, XK_q, quit, NULL},
       +        { Mod1Mask, XK_k, sel, "prev" }, 
       +        { Mod1Mask, XK_j, sel, "next" }, 
       +        { Mod1Mask, XK_g, arrange, NULL }, 
       +        { Mod1Mask | ShiftMask, XK_c, kill, NULL }, 
       +        { Mod1Mask | ShiftMask, XK_q, quit, NULL },
        };
        
        void
   DIR diff --git a/wm.c b/wm.c
       t@@ -175,6 +175,18 @@ cleanup()
                XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
        }
        
       +void
       +run(void *aux)
       +{
       +        spawn(dpy, aux);
       +}
       +
       +void
       +quit(void *aux)
       +{
       +        running = False;
       +}
       +
        int
        main(int argc, char *argv[])
        {
   DIR diff --git a/wm.h b/wm.h
       t@@ -58,12 +58,6 @@ extern Client *clients, *stack;
        /* bar.c */
        extern void draw_bar();
        
       -/* cmd.c */
       -extern void run(void *aux);
       -extern void quit(void *aux);
       -extern void kill(void *aux);
       -extern void sel(void *aux);
       -
        /* client.c */
        extern void manage(Window w, XWindowAttributes *wa);
        extern void unmanage(Client *c);
       t@@ -76,10 +70,15 @@ extern void update_size(Client *c);
        extern Client *gettitle(Window w);
        extern void raise(Client *c);
        extern void lower(Client *c);
       +extern void kill(void *aux);
       +extern void sel(void *aux);
        
        /* event.c */
        extern void discard_events(long even_mask);
        
       +/* grid.c */
       +extern void arrange();
       +
        /* key.c */
        extern void update_keys();
        extern void keypress(XEvent *e);
       t@@ -92,3 +91,5 @@ extern void mmove(Client *c);
        extern int error_handler(Display *dpy, XErrorEvent *error);
        extern void send_message(Window w, Atom a, long value);
        extern int win_proto(Window w);
       +extern void run(void *aux);
       +extern void quit(void *aux);