JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
removed the <M> togglelayout call
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index 25bc926..28b8fdf 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -97,6 +97,7 @@ typedef struct {
 typedef struct {
        const char *symbol;
        void (*arrange)(void);
+       void (*updategeom)(void);
 } Layout;
 
 typedef struct {
@@ -144,15 +145,14 @@ void initfont(const char *fontstr);
 Bool isoccupied(unsigned int t);
 Bool isprotodel(Client *c);
 Bool isurgent(unsigned int t);
-Bool isvisible(Client *c, Bool *cmp);
+Bool isvisible(Client *c);
 void keypress(XEvent *e);
 void killclient(const char *arg);
 void manage(Window w, XWindowAttributes *wa);
 void mappingnotify(XEvent *e);
 void maprequest(XEvent *e);
-void monocle(void);
 void movemouse(Client *c);
-Client *nexttiled(Client *c);
+Client *nextunfloating(Client *c);
 void propertynotify(XEvent *e);
 void quit(const char *arg);
 void resize(Client *c, int x, int y, int w, int h, Bool sizehints);
@@ -161,14 +161,11 @@ void restack(void);
 void run(void);
 void scan(void);
 void setclientstate(Client *c, long state);
-void setmfact(const char *arg);
 void setup(void);
 void spawn(const char *arg);
 void tag(const char *arg);
 unsigned int textnw(const char *text, unsigned int len);
 unsigned int textw(const char *text);
-void tileresize(Client *c, int x, int y, int w, int h);
-void tile(void);
 void togglefloating(const char *arg);
 void togglelayout(const char *arg);
 void toggletag(const char *arg);
@@ -192,9 +189,8 @@ void zoom(const char *arg);
 char stext[256];
 int screen, sx, sy, sw, sh;
 int (*xerrorxlib)(Display *, XErrorEvent *);
-int bx, by, bw, bh, blw, mx, my, mw, mh, tx, ty, tw, th, wx, wy, ww, wh;
+int bx, by, bw, bh, blw, wx, wy, ww, wh;
 int seltags = 0;
-double mfact;
 unsigned int numlockmask = 0;
 void (*handler[LASTEvent]) (XEvent *) = {
        [ButtonPress] = buttonpress,
@@ -264,7 +260,7 @@ arrange(void) {
        Client *c;
 
        for(c = clients; c; c = c->next)
-               if(isvisible(c, NULL)) {
+               if(isvisible(c)) {
                        unban(c);
                        if(!lt->arrange || c->isfloating)
                                resize(c, c->x, c->y, c->w, c->h, True);
@@ -340,8 +336,6 @@ buttonpress(XEvent *e) {
                else if(ev->button == Button2) {
                        if(lt->arrange && c->isfloating)
                                togglefloating(NULL);
-                       else
-                               zoom(NULL);
                }
                else if(ev->button == Button3 && !c->isfixed) {
                        restack();
@@ -444,7 +438,7 @@ configurerequest(XEvent *e) {
                        if((ev->value_mask & (CWX|CWY))
                        && !(ev->value_mask & (CWWidth|CWHeight)))
                                configure(c);
-                       if(isvisible(c, NULL))
+                       if(isvisible(c))
                                XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
                }
                else
@@ -497,7 +491,7 @@ drawbar(void) {
        Client *c;
 
        dc.x = 0;
-       for(c = stack; c && !isvisible(c, NULL); c = c->snext);
+       for(c = stack; c && !isvisible(c); c = c->snext);
        for(i = 0; i < LENGTH(tags); i++) {
                dc.w = textw(tags[i]);
                if(tagset[seltags][i]) {
@@ -637,8 +631,8 @@ expose(XEvent *e) {
 
 void
 focus(Client *c) {
-       if(!c || (c && !isvisible(c, NULL)))
-               for(c = stack; c && !isvisible(c, NULL); c = c->snext);
+       if(!c || (c && !isvisible(c)))
+               for(c = stack; c && !isvisible(c); c = c->snext);
        if(sel && sel != c) {
                grabbuttons(sel, False);
                XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
@@ -672,9 +666,9 @@ focusnext(const char *arg) {
 
        if(!sel)
                return;
-       for(c = sel->next; c && !isvisible(c, arg ? sel->tags : NULL); c = c->next);
+       for(c = sel->next; c && !isvisible(c); c = c->next);
        if(!c)
-               for(c = clients; c && !isvisible(c, arg ? sel->tags : NULL); c = c->next);
+               for(c = clients; c && !isvisible(c); c = c->next);
        if(c) {
                focus(c);
                restack();
@@ -687,10 +681,10 @@ focusprev(const char *arg) {
 
        if(!sel)
                return;
-       for(c = sel->prev; c && !isvisible(c, arg ? sel->tags : NULL); c = c->prev);
+       for(c = sel->prev; c && !isvisible(c); c = c->prev);
        if(!c) {
                for(c = clients; c && c->next; c = c->next);
-               for(; c && !isvisible(c, arg ? sel->tags : NULL); c = c->prev);
+               for(; c && !isvisible(c); c = c->prev);
        }
        if(c) {
                focus(c);
@@ -891,13 +885,11 @@ isurgent(unsigned int t) {
 }
 
 Bool
-isvisible(Client *c, Bool *cmp) {
+isvisible(Client *c) {
        unsigned int i;
 
-       if(!cmp)
-               cmp = tagset[seltags];
        for(i = 0; i < LENGTH(tags); i++)
-               if(c->tags[i] && cmp[i])
+               if(c->tags[i] && tagset[seltags][i])
                        return True;
        return False;
 }
@@ -1018,15 +1010,6 @@ maprequest(XEvent *e) {
 }
 
 void
-monocle(void) {
-       Client *c;
-
-       for(c = clients; c; c = c->next)
-               if(!c->isfloating && isvisible(c, NULL))
-                       resize(c, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw, RESIZEHINTS);
-}
-
-void
 movemouse(Client *c) {
        int x1, y1, ocx, ocy, di, nx, ny;
        unsigned int dui;
@@ -1072,8 +1055,8 @@ movemouse(Client *c) {
 }
 
 Client *
-nexttiled(Client *c) {
-       for(; c && (c->isfloating || !isvisible(c, NULL)); c = c->next);
+nextunfloating(Client *c) {
+       for(; c && (c->isfloating || !isvisible(c)); c = c->next);
        return c;
 }
 
@@ -1233,7 +1216,7 @@ restack(void) {
                wc.stack_mode = Below;
                wc.sibling = barwin;
                for(c = stack; c; c = c->snext)
-                       if(!c->isfloating && isvisible(c, NULL)) {
+                       if(!c->isfloating && isvisible(c)) {
                                XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc);
                                wc.sibling = c->win;
                        }
@@ -1337,27 +1320,6 @@ setclientstate(Client *c, long state) {
                        PropModeReplace, (unsigned char *)data, 2);
 }
 
-/* TODO: move this into tile.c */
-void
-setmfact(const char *arg) {
-       double d;
-
-       if(!lt->arrange) /* TODO: check this against the actual tile() function */
-               return;
-       if(!arg)
-               mfact = MFACT;
-       else {
-               d = strtod(arg, NULL);
-               if(arg[0] == '-' || arg[0] == '+')
-                       d += mfact;
-               if(d < 0.1 || d > 0.9)
-                       return;
-               mfact = d;
-       }
-       updategeom();
-       arrange();
-}
-
 void
 setup(void) {
        unsigned int i, w;
@@ -1372,7 +1334,6 @@ setup(void) {
        sw = DisplayWidth(dpy, screen);
        sh = DisplayHeight(dpy, screen);
        bh = dc.font.height + 2;
-       mfact = MFACT;
        updategeom();
 
        /* init atoms */
@@ -1494,51 +1455,6 @@ textw(const char *text) {
 }
 
 void
-tileresize(Client *c, int x, int y, int w, int h) {
-       resize(c, x, y, w, h, RESIZEHINTS);
-       if((RESIZEHINTS) && ((c->h < bh) || (c->h > h) || (c->w < bh) || (c->w > w)))
-               /* client doesn't accept size constraints */
-               resize(c, x, y, w, h, False);
-}
-
-void
-tile(void) {
-       int y, h;
-       unsigned int i, n;
-       Client *c;
-
-       for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next), n++);
-       if(n == 0)
-               return;
-
-       /* master */
-       c = nexttiled(clients);
-
-       if(n == 1)
-               tileresize(c, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw);
-       else
-               tileresize(c, mx, my, mw - 2 * c->bw, mh - 2 * c->bw);
-
-       if(--n == 0)
-               return;
-
-       /* tile stack */
-       y = ty;
-       h = th / n;
-       if(h < bh)
-               h = th;
-
-       for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
-               if(i + 1 == n) /* remainder */
-                       tileresize(c, tx, y, tw - 2 * c->bw, (ty + th) - y - 2 * c->bw);
-               else
-                       tileresize(c, tx, y, tw - 2 * c->bw, h - 2 * c->bw);
-               if(h != th)
-                       y = c->y + c->h + 2 * c->bw;
-       }
-}
-
-void
 togglefloating(const char *arg) {
        if(!sel)
                return;
@@ -1646,6 +1562,7 @@ updatebar(void) {
 
 void
 updategeom(void) {
+       unsigned int i;
 
        /* bar geometry */
        bx = 0;
@@ -1658,17 +1575,10 @@ updategeom(void) {
        ww = sw;
        wh = sh - bh;
 
-       /* master area geometry */
-       mx = wx;
-       my = wy;
-       mw = mfact * ww;
-       mh = wh;
-
-       /* tile area geometry */
-       tx = mx + mw;
-       ty = wy;
-       tw = ww - mw;
-       th = wh;
+       /* update layout geometries */
+       for(i = 0; i < LENGTH(layouts); i++)
+               if(layouts[i].updategeom)
+                       layouts[i].updategeom();
 }
 
 void
@@ -1789,22 +1699,6 @@ xerrorstart(Display *dpy, XErrorEvent *ee) {
        return -1;
 }
 
-/* TODO: move this into tile.c */
-void
-zoom(const char *arg) {
-       Client *c = sel;
-
-       if(c == nexttiled(clients))
-               if(!c || !(c = nexttiled(c->next)))
-                       return;
-       if(lt->arrange && !sel->isfloating) { /* TODO: check this against tile() */
-               detach(c);
-               attach(c);
-               focus(c);
-       }
-       arrange();
-}
-
 int
 main(int argc, char *argv[]) {
        if(argc == 2 && !strcmp("-v", argv[1]))