JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
some cleanups
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index d47da3f..9e049c6 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -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.
@@ -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]);
@@ -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);
@@ -237,7 +237,7 @@ static void zoom(const Arg *arg);
 /* variables */
 static char stext[256];
 static int screen;
-static int sw, sh;   /* X display screen geometry x, y, width, height */
+static int sw, sh;           /* X display screen geometry x, y, width, height */
 static int bh, blw = 0;      /* bar geometry */
 static int (*xerrorxlib)(Display *, XErrorEvent *);
 static unsigned int numlockmask = 0;
@@ -264,6 +264,7 @@ static DC dc;
 static Layout *lt[] = { NULL, NULL };
 static Monitor *mons = NULL, *selmon = NULL;
 static Window root;
+
 /* configuration, allows nested code to access above variables */
 #include "config.h"
 
@@ -284,7 +285,8 @@ applyrules(Client *c) {
                        r = &rules[i];
                        if((!r->title || strstr(c->name, r->title))
                        && (!r->class || (ch.res_class && strstr(ch.res_class, r->class)))
-                       && (!r->instance || (ch.res_name && strstr(ch.res_name, r->instance)))) {
+                       && (!r->instance || (ch.res_name && strstr(ch.res_name, r->instance))))
+                       {
                                c->isfloating = r->isfloating;
                                c->tags |= r->tags;
                        }
@@ -305,7 +307,6 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact) {
        /* set minimum possible */
        *w = MAX(1, *w);
        *h = MAX(1, *h);
-
        if(interact) {
                if(*x > sw)
                        *x = sw - WIDTH(c);
@@ -621,6 +622,23 @@ 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;
@@ -797,10 +815,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);
@@ -885,7 +904,8 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) {
                strncpy(text, (char *)name.value, size - 1);
        else {
                if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
-               && n > 0 && *list) {
+               && n > 0 && *list)
+               {
                        strncpy(text, *list, size - 1);
                        XFreeStringList(list);
                }
@@ -910,7 +930,8 @@ grabbuttons(Client *c, Bool focused) {
                                                            buttons[i].mask | modifiers[j],
                                                            c->win, False, BUTTONMASK,
                                                            GrabModeAsync, GrabModeSync, None, None);
-               } else
+               }
+               else
                        XGrabButton(dpy, AnyButton, AnyModifier, c->win, False,
                                    BUTTONMASK, GrabModeAsync, GrabModeSync, None, None);
        }
@@ -934,15 +955,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;
@@ -1376,7 +1388,7 @@ sendmon(Client *c, Monitor *m) {
 
 void
 setclientstate(Client *c, long state) {
-       long data[] = {state, None};
+       long data[] = { state, None };
 
        XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32,
                        PropModeReplace, (unsigned char *)data, 2);
@@ -1512,11 +1524,9 @@ tag(const Arg *arg) {
 
 void
 tagmon(const Arg *arg) {
-       Monitor *m;
-
-       if(!selmon->sel || !(m = idxtomon(arg->ui)))
+       if(!selmon->sel || !mons->next)
                return;
-       sendmon(selmon->sel, m);
+       sendmon(selmon->sel, dirtomon(arg->i));
 }
 
 int