dwm

my fork of dwm
Index Commits Files Refs README LICENSE
commit a73de0cff42588d3dc3b40e4e8b198c847208dca
parent eeea4ef583a2ca3746e987bd2ecd570fd1869c2d
Author: Anselm R. Garbe <garbeam@gmail.com>
Date:   Wed, 10 Oct 2007 18:39:28 +0200

added antoszka's viewprev patch with some minor modifications, restored Client->tags as Bool *, however kept the static initialization of ntags and seltags (prevtags) - this seems to be the best compromise
Diffstat:
Mconfig.def.h | 1+
Mconfig.mk | 2+-
Mdwm.c | 54+++++++++++++++++++++++++++++++++---------------------
3 files changed, 35 insertions(+), 22 deletions(-)
diff --git a/config.def.h b/config.def.h
@@ -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 }, \
diff --git 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
@@ -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);
@@ -1847,6 +1849,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;