added antoszka's viewprev patch with some minor modifications, restored Client->tags...
authorAnselm R. Garbe <garbeam@gmail.com>
Wed, 10 Oct 2007 16:39:28 +0000 (18:39 +0200)
committerAnselm R. Garbe <garbeam@gmail.com>
Wed, 10 Oct 2007 16:39:28 +0000 (18:39 +0200)
config.def.h
config.mk
dwm.c

index 5a18854..1636dc6 100644 (file)
@@ -49,6 +49,7 @@ Key keys[] = { \
        { MODKEY,                       XK_l,           setmwfact,      "+0.05" }, \
        { MODKEY,                       XK_m,           togglemax,      NULL }, \
        { MODKEY,                       XK_Return,      zoom,           NULL }, \
+       { MODKEY,                       XK_Tab,         viewprevtag,    NULL }, \
        { MODKEY|ShiftMask,             XK_space,       togglefloating, NULL }, \
        { MODKEY|ShiftMask,             XK_c,           killclient,     NULL }, \
        { MODKEY,                       XK_0,           view,           NULL }, \
index 1c92834..9944f2a 100644 (file)
--- a/config.mk
+++ b/config.mk
@@ -17,7 +17,7 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
 # flags
 CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
 LDFLAGS = -s ${LIBS}
-#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
+#CFLAGS = -g -std=c99 -pedantic -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
 #LDFLAGS = -g ${LIBS}
 
 # Solaris
diff --git a/dwm.c b/dwm.c
index 9e9e748..a4447f6 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -58,6 +58,22 @@ 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];
@@ -170,6 +186,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);
@@ -219,22 +236,7 @@ Regs *regs = NULL;
 /* Statically define the number of tags. */
 unsigned int ntags = sizeof tags / sizeof tags[0];
 Bool seltags[sizeof tags / sizeof tags[0]] = {[0] = True};
-
-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[sizeof tags / sizeof tags[0]];
-       Client *next;
-       Client *prev;
-       Client *snext;
-       Window win;
-};
+Bool prevtags[sizeof tags / sizeof tags[0]] = {[0] = True};
 
 /* functions*/
 void
@@ -265,8 +267,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
@@ -1002,13 +1003,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(sizeof seltags);
        c->win = w;
        c->x = wa->x;
        c->y = wa->y;
@@ -1043,8 +1044,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;
@@ -1702,6 +1702,7 @@ unmanage(Client *c) {
                focus(NULL);
        XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
        setclientstate(c, WithdrawnState);
+       free(c->tags);
        free(c);
        XSync(dpy, False);
        XSetErrorHandler(xerror);
@@ -1838,6 +1839,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);
@@ -1846,6 +1848,16 @@ view(const char *arg) {
        arrange();
 }
 
+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;