t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit a9e145fe6d8af4848e6706131ac41e99003cd997
   DIR parent 5dd92c765570caa6d96ab125aa655e30cf82eb20
   URI Author: Anselm R Garbe <anselm@garbe.us>
       Date:   Thu,  2 Jul 2009 20:37:26 +0100
       
       changed focusmon/tagmon to work on prev/next instead (-1/+1), changed shortcuts to Mod1-, Mod1-. and Mod1-Shift-, Mod1-Shift-.
       Diffstat:
         M config.def.h                        |       8 ++++----
         M dwm.1                               |      26 +++++++++++++++++++-------
         M dwm.c                               |      46 +++++++++++++++++--------------
       
       3 files changed, 49 insertions(+), 31 deletions(-)
       ---
   DIR diff --git a/config.def.h b/config.def.h
       t@@ -71,10 +71,10 @@ static Key keys[] = {
                { MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
                { MODKEY,                       XK_0,      view,           {.ui = ~0 } },
                { MODKEY|ShiftMask,             XK_0,      tag,            {.ui = ~0 } },
       -        { MODKEY,                       XK_w,      focusmon,       {.ui = 0 } },
       -        { MODKEY,                       XK_e,      focusmon,       {.ui = 1 } },
       -        { MODKEY|ShiftMask,             XK_w,      tagmon,         {.ui = 0 } },
       -        { MODKEY|ShiftMask,             XK_e,      tagmon,         {.ui = 1 } },
       +        { MODKEY,                       XK_comma,  focusmon,       {.i = -1 } },
       +        { MODKEY,                       XK_period, focusmon,       {.i = +1 } },
       +        { MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
       +        { MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
                TAGKEYS(                        XK_1,                      0)
                TAGKEYS(                        XK_2,                      1)
                TAGKEYS(                        XK_3,                      2)
   DIR diff --git a/dwm.1 b/dwm.1
       t@@ -19,14 +19,14 @@ layout applied.
        Windows are grouped by tags. Each window can be tagged with one or multiple
        tags. Selecting certain tags displays all windows with these tags.
        .P
       -dwm contains a small status bar which displays all available tags, the layout,
       +Each screen contains a small status bar which displays all available tags, the layout,
        the title of the focused window, and the text read from the root window name
       -property. A floating window is indicated with an empty square and a maximised
       -floating window is indicated with a filled square before the windows title.
       -The selected tags are indicated with a different color. The tags of the focused
       -window are indicated with a filled square in the top left corner.  The tags
       -which are applied to one or more windows are indicated with an empty square in
       -the top left corner.
       +property, if the screen is focused. A floating window is indicated with an
       +empty square and a maximised floating window is indicated with a filled square
       +before the windows title.  The selected tags are indicated with a different
       +color. The tags of the focused window are indicated with a filled square in the
       +top left corner.  The tags which are applied to one or more windows are
       +indicated with an empty square in the top left corner.
        .P
        dwm draws a small border around windows to indicate the focus state.
        .SH OPTIONS
       t@@ -57,6 +57,18 @@ click on a tag label adds/removes that tag to/from the focused window.
        Start
        .BR xterm.
        .TP
       +.B Mod1\-,
       +Focus previous screen, if any.
       +.TP
       +.B Mod1\-.
       +Focus next screen, if any.
       +.TP
       +.B Mod1\-Shift\-,
       +Send focused window to previous screen, if any.
       +.TP
       +.B Mod1\-Shift\-,
       +Send focused window to next screen, if any.
       +.TP
        .B Mod1\-b
        Toggles bar on and off.
        .TP
   DIR diff --git a/dwm.c b/dwm.c
       t@@ -11,9 +11,9 @@
         * in O(1) time.
         *
         * Each child of the root window is called a client, except windows which have
       - * set the override_redirect flag.  Clients are organized in a global
       - * linked client list, the focus history is remembered through a global
       - * stack list. Each client contains a bit array to indicate the tags of a
       + * set the override_redirect flag.  Clients are organized in a linked client
       + * list on each monitor, the focus history is remembered through a stack list
       + * on each monitor. Each client contains a bit array to indicate the tags of a
         * client.
         *
         * Keys and tagging rules are organized as arrays and defined in config.h.
       t@@ -164,6 +164,7 @@ static void destroynotify(XEvent *e);
        static void detach(Client *c);
        static void detachstack(Client *c);
        static void die(const char *errstr, ...);
       +static Monitor *dirtomon(int dir);
        static void drawbar(Monitor *m);
        static void drawbars(void);
        static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
       t@@ -180,7 +181,6 @@ static long getstate(Window w);
        static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
        static void grabbuttons(Client *c, Bool focused);
        static void grabkeys(void);
       -static Monitor *idxtomon(unsigned int n);
        static void initfont(const char *fontstr);
        static Bool isprotodel(Client *c);
        static void keypress(XEvent *e);
       t@@ -621,6 +621,22 @@ die(const char *errstr, ...) {
                exit(EXIT_FAILURE);
        }
        
       +Monitor *
       +dirtomon(int dir) {
       +        Monitor *m = NULL;
       +
       +        if(dir > 0)
       +                if(!(m = selmon->next))
       +                        m = mons;
       +        else {
       +                if(selmon == mons)
       +                        for(m = mons; m->next; m = m->next);
       +                else
       +                        for(m = mons; m->next != selmon; m = m->next);
       +        }
       +        return m;
       +}
       +
        void
        drawbar(Monitor *m) {
                int x;
       t@@ -797,10 +813,11 @@ focusin(XEvent *e) { /* there are some broken focus acquiring clients */
        
        void
        focusmon(const Arg *arg) {
       -        Monitor *m;
       +        Monitor *m = NULL;
        
       -        if(!(m = idxtomon(arg->ui)) || m == selmon)
       +        if(!mons->next)
                        return;
       +        m = dirtomon(arg->i);
                unfocus(selmon->sel);
                selmon = m;
                focus(NULL);
       t@@ -934,15 +951,6 @@ grabkeys(void) {
                }
        }
        
       -Monitor *
       -idxtomon(unsigned int n) {
       -        unsigned int i;
       -        Monitor *m;
       -
       -        for(m = mons, i = 0; m && i != n; m = m->next, i++);
       -        return m;
       -}
       -
        void
        initfont(const char *fontstr) {
                char *def, **missing;
       t@@ -1512,11 +1520,9 @@ tag(const Arg *arg) {
        
        void
        tagmon(const Arg *arg) {
       -        Monitor *m;
       -
       -        if(!selmon->sel || !(m = idxtomon(arg->ui)))
       -                return;
       -        sendmon(selmon->sel, m);
       +        if(!selmon->sel || !mons->next)
       +                return
       +        sendmon(selmon->sel, dirtomon(arg->i));
        }
        
        int