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
authorAnselm R. Garbe <garbeam@gmail.com>
Wed, 10 Oct 2007 18:39:28 +0200
changeset 1027 0735e86bbd49
parent 1026 bc0929d03388
child 1028 b4c4c98205cc
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
config.def.h
config.mk
dwm.c
--- a/config.def.h	Sat Oct 06 19:43:15 2007 +0200
+++ b/config.def.h	Wed Oct 10 18:39:28 2007 +0200
@@ -49,6 +49,7 @@
 	{ 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 }, \
--- a/config.mk	Sat Oct 06 19:43:15 2007 +0200
+++ b/config.mk	Wed Oct 10 18:39:28 2007 +0200
@@ -17,7 +17,7 @@
 # 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
--- a/dwm.c	Sat Oct 06 19:43:15 2007 +0200
+++ b/dwm.c	Wed Oct 10 18:39:28 2007 +0200
@@ -58,6 +58,22 @@
 /* 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 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 @@
 /* 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 @@
 	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 @@
 
 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 @@
 	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 @@
 		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 @@
 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 @@
 }
 
 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;