JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
small comment
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index ca57f8e..af07638 100644 (file)
--- a/dwm.c
+++ b/dwm.c
  *
  * To understand everything else, start reading main().
  */
+#include "dwm.h"
+
 #include <errno.h>
 #include <locale.h>
-#include <regex.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 #include <sys/select.h>
+#include <sys/types.h>
 #include <sys/wait.h>
+#include <regex.h>
 #include <X11/cursorfont.h>
 #include <X11/keysym.h>
 #include <X11/Xatom.h>
-#include <X11/Xlib.h>
 #include <X11/Xproto.h>
 #include <X11/Xutil.h>
 
@@ -55,23 +57,6 @@ enum { NetSupported, NetWMName, NetLast };           /* EWMH atoms */
 enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */
 
 /* typedefs */
-typedef struct Client Client;
-struct Client {
-       char name[256];
-       int x, y, w, h;
-       int rx, ry, rw, rh; /* revert geometry */
-       int basew, baseh, incw, inch, maxw, maxh, minw, minh;
-       int minax, maxax, minay, maxay;
-       long flags; 
-       unsigned int border, oldborder;
-       Bool isbanned, isfixed, ismax, isfloating, wasfloating;
-       Bool *tags;
-       Client *next;
-       Client *prev;
-       Client *snext;
-       Window win;
-};
-
 typedef struct {
        int x, y, w, h;
        unsigned long norm[ColLast];
@@ -184,6 +169,7 @@ void updatebarpos(void);
 void updatesizehints(Client *c);
 void updatetitle(Client *c);
 void view(const char *arg);
+void viewprevtag(const char *arg);     /* views previous selected tags */
 int xerror(Display *dpy, XErrorEvent *ee);
 int xerrordummy(Display *dsply, XErrorEvent *ee);
 int xerrorstart(Display *dsply, XErrorEvent *ee);
@@ -194,7 +180,7 @@ char stext[256];
 double mwfact;
 int screen, sx, sy, sw, sh, wax, way, waw, wah;
 int (*xerrorxlib)(Display *, XErrorEvent *);
-unsigned int bh, bpos, ntags;
+unsigned int bh, bpos;
 unsigned int blw = 0;
 unsigned int ltidx = 0; /* default */
 unsigned int nlayouts = 0;
@@ -217,7 +203,6 @@ void (*handler[LASTEvent]) (XEvent *) = {
 Atom wmatom[WMLast], netatom[NetLast];
 Bool otherwm, readin;
 Bool running = True;
-Bool *seltags;
 Bool selscreen = True;
 Client *clients = NULL;
 Client *sel = NULL;
@@ -231,6 +216,11 @@ Regs *regs = NULL;
 /* configuration, allows nested code to access above variables */
 #include "config.h"
 
+/* Statically define the number of tags. */
+unsigned int ntags = sizeof tags / sizeof tags[0];
+Bool seltags[sizeof tags / sizeof tags[0]] = {[0] = True};
+Bool prevtags[sizeof tags / sizeof tags[0]] = {[0] = True};
+
 /* functions*/
 void
 applyrules(Client *c) {
@@ -260,8 +250,7 @@ applyrules(Client *c) {
        if(ch.res_name)
                XFree(ch.res_name);
        if(!matched)
-               for(i = 0; i < ntags; i++)
-                       c->tags[i] = seltags[i];
+               memcpy(c->tags, seltags, sizeof seltags);
 }
 
 void
@@ -392,7 +381,6 @@ cleanup(void) {
        XFreeCursor(dpy, cursor[CurMove]);
        XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
        XSync(dpy, False);
-       free(seltags);
 }
 
 void
@@ -998,14 +986,13 @@ leavenotify(XEvent *e) {
 
 void
 manage(Window w, XWindowAttributes *wa) {
-       unsigned int i;
        Client *c, *t = NULL;
        Window trans;
        Status rettrans;
        XWindowChanges wc;
 
        c = emallocz(sizeof(Client));
-       c->tags = emallocz(ntags * sizeof(Bool));
+       c->tags = emallocz(sizeof seltags);
        c->win = w;
        c->x = wa->x;
        c->y = wa->y;
@@ -1040,8 +1027,7 @@ manage(Window w, XWindowAttributes *wa) {
        if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success))
                for(t = clients; t && t->win != trans; t = t->next);
        if(t)
-               for(i = 0; i < ntags; i++)
-                       c->tags[i] = t->tags[i];
+               memcpy(c->tags, t->tags, sizeof seltags);
        applyrules(c);
        if(!c->isfloating)
                c->isfloating = (rettrans == Success) || c->isfixed;
@@ -1161,7 +1147,7 @@ quit(const char *arg) {
 void
 resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
        double dx, dy, max, min, ratio;
-       XWindowChanges wc; 
+       XWindowChanges wc;
 
        if(sizehints) {
                if(c->minay > 0 && c->maxay > 0 && (h - c->baseh) > 0 && (w - c->basew) > 0) {
@@ -1466,9 +1452,6 @@ setup(void) {
 
        /* init tags */
        compileregs();
-       for(ntags = 0; tags[ntags]; ntags++);
-       seltags = emallocz(sizeof(Bool) * ntags);
-       seltags[0] = True;
 
        /* init appearance */
        dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR);
@@ -1568,7 +1551,7 @@ textw(const char *text) {
 void
 tile(void) {
        unsigned int i, n, nx, ny, nw, nh, mw, th;
-       Client *c;
+       Client *c, *mc;
 
        for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
                n++;
@@ -1581,7 +1564,8 @@ tile(void) {
 
        nx = wax;
        ny = way;
-       for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i++) {
+       nw = 0; /* gcc stupidity requires this */
+       for(i = 0, c = mc = nexttiled(clients); c; c = nexttiled(c->next), i++) {
                c->ismax = False;
                if(i == 0) { /* master */
                        nw = mw - 2 * c->border;
@@ -1590,9 +1574,9 @@ tile(void) {
                else {  /* tile window */
                        if(i == 1) {
                                ny = way;
-                               nx += mw;
+                               nx += mc->w + 2 * mc->border;
+                               nw = waw - nx - 2 * c->border;
                        }
-                       nw = waw - mw - 2 * c->border;
                        if(i + 1 == n) /* remainder */
                                nh = (way + wah) - ny - 2 * c->border;
                        else
@@ -1600,7 +1584,7 @@ tile(void) {
                }
                resize(c, nx, ny, nw, nh, RESIZEHINTS);
                if(n > 1 && th != wah)
-                       ny += nh + 2 * c->border;
+                       ny = c->y + c->h + 2 * c->border;
        }
 }
 
@@ -1838,6 +1822,7 @@ void
 view(const char *arg) {
        unsigned int i;
 
+       memcpy(prevtags, seltags, sizeof seltags);
        for(i = 0; i < ntags; i++)
                seltags[i] = arg == NULL;
        i = idxoftag(arg);
@@ -1847,6 +1832,16 @@ view(const char *arg) {
 }
 
 void
+viewprevtag(const char *arg) {
+       static Bool tmptags[sizeof tags / sizeof tags[0]];
+
+       memcpy(tmptags, seltags, sizeof seltags);
+       memcpy(seltags, prevtags, sizeof seltags);
+       memcpy(prevtags, tmptags, sizeof seltags);
+       arrange();
+}
+
+void
 zoom(const char *arg) {
        Client *c;