I just tested here and commented out my tags array in config.h
to see if I could replicate the error you're getting. Sure enough -
I get the exact same message, pointing to the exact same line.
Check to make sure you're tags array in config.h is built
properly. Attached you will find the version of pertag I'm using
but, as stated before, it's probably the same one you're using.
diff --git a/dwm.c b/dwm.c
--- a/dwm.c
+++ b/dwm.c
@@ -122,27 +122,6 @@
 	void (*arrange)(Monitor *);
 } Layout;
 
-struct Monitor {
-	char ltsymbol[16];
-	float mfact;
-	int nmaster;
-	int num;
-	int by;               /* bar geometry */
-	int mx, my, mw, mh;   /* screen size */
-	int wx, wy, ww, wh;   /* window area  */
-	unsigned int seltags;
-	unsigned int sellt;
-	unsigned int tagset[2];
-	Bool showbar;
-	Bool topbar;
-	Client *clients;
-	Client *sel;
-	Client *stack;
-	Monitor *next;
-	Window barwin;
-	const Layout *lt[2];
-};
-
 typedef struct {
 	const char *class;
 	const char *instance;
@@ -281,6 +260,33 @@
 /* configuration, allows nested code to access above variables */
 #include "config.h"
 
+struct Monitor {
+	char ltsymbol[16];
+	float mfact;
+	int nmaster;
+	int num;
+	int by;               /* bar geometry */
+	int mx, my, mw, mh;   /* screen size */
+	int wx, wy, ww, wh;   /* window area  */
+	unsigned int seltags;
+	unsigned int sellt;
+	unsigned int tagset[2];
+	Bool showbar;
+	Bool topbar;
+	Client *clients;
+	Client *sel;
+	Client *stack;
+	Monitor *next;
+	Window barwin;
+	const Layout *lt[2];
+ 	int curtag;
+ 	int prevtag;
+ 	const Layout *lts[LENGTH(tags) + 1];
+ 	float mfacts[LENGTH(tags) + 1];
+ 	int nmasters[LENGTH(tags) + 1];
+ 	Bool showbars[LENGTH(tags) + 1];
+};
+
 /* compile-time check if all tags fit into an unsigned int bit array. */
 struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
 
@@ -661,6 +667,7 @@
 Monitor *
 createmon(void) {
 	Monitor *m;
+	unsigned int i;
 
 	if(!(m = (Monitor *)calloc(1, sizeof(Monitor))))
 		die("fatal: could not malloc() %u bytes\n", sizeof(Monitor));
@@ -672,6 +679,16 @@
 	m->lt[0] = &layouts[0];
 	m->lt[1] = &layouts[1 % LENGTH(layouts)];
 	strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
+
+ 	/* pertag init */
+ 	m->curtag = m->prevtag = 1;
+ 	for(i=0; i < LENGTH(tags) + 1 ; i++) {
+ 		m->mfacts[i] = mfact;
+ 		m->nmasters[i] = nmaster;
+ 		m->lts[i] = &layouts[0];
+ 		m->showbars[i] = m->showbar;
+ 	}
+
 	return m;
 }
 
@@ -1028,7 +1045,8 @@
 
 void
 incnmaster(const Arg *arg) {
-	selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
+	selmon->nmasters[selmon->curtag] = MAX(selmon->nmaster + arg->i, 1);
+	selmon->nmaster = selmon->nmasters[selmon->curtag];
 	arrange(selmon);
 }
 
@@ -1515,7 +1533,7 @@
 	if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
 		selmon->sellt ^= 1;
 	if(arg && arg->v)
-		selmon->lt[selmon->sellt] = (Layout *)arg->v;
+ 		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
 	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
 	if(selmon->sel)
 		arrange(selmon);
@@ -1533,7 +1551,7 @@
 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
 	if(f < 0.1 || f > 0.9)
 		return;
-	selmon->mfact = f;
+ 	selmon->mfact = selmon->mfacts[selmon->curtag] = f;
 	arrange(selmon);
 }
 
@@ -1680,7 +1698,7 @@
 
 void
 togglebar(const Arg *arg) {
-	selmon->showbar = !selmon->showbar;
+ 	selmon->showbar = selmon->showbars[selmon->curtag] = !selmon->showbar;
 	updatebarpos(selmon);
 	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
 	arrange(selmon);
@@ -1699,13 +1717,28 @@
 
 void
 toggletag(const Arg *arg) {
-	unsigned int newtags;
+	unsigned int i, newtags;
 
 	if(!selmon->sel)
 		return;
 	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
 	if(newtags) {
 		selmon->sel->tags = newtags;
+ 		if(newtags == ~0) {
+ 			selmon->prevtag = selmon->curtag;
+ 			selmon->curtag = 0;
+ 		}
+ 		if(!(newtags & 1 << (selmon->curtag - 1))) {
+ 			selmon->prevtag = selmon->curtag;
+ 			for (i=0; !(newtags & 1 << i); i++);
+ 			selmon->curtag = i + 1;
+ 		}
+ 		selmon->sel->tags = newtags;
+ 		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
+ 		selmon->mfact = selmon->mfacts[selmon->curtag];
+ 		selmon->nmaster = selmon->nmasters[selmon->curtag];
+ 		if (selmon->showbar != selmon->showbars[selmon->curtag])
+ 			togglebar(NULL);
 		focus(NULL);
 		arrange(selmon);
 	}
@@ -1982,11 +2015,30 @@
 
 void
 view(const Arg *arg) {
+	unsigned int i;
+
 	if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
 		return;
 	selmon->seltags ^= 1; /* toggle sel tagset */
-	if(arg->ui & TAGMASK)
+	if(arg->ui & TAGMASK) {
 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
+ 		selmon->prevtag = selmon->curtag;
+ 		if(arg->ui == ~0)
+ 			selmon->curtag = 0;
+ 		else {
+ 			for (i=0; !(arg->ui & 1 << i); i++);
+ 			selmon->curtag = i + 1;
+ 		}
+ 	} else {
+ 		selmon->prevtag= selmon->curtag ^ selmon->prevtag;
+ 		selmon->curtag^= selmon->prevtag;
+ 		selmon->prevtag= selmon->curtag ^ selmon->prevtag;
+ 	}
+ 	selmon->lt[selmon->sellt]= selmon->lts[selmon->curtag];
+ 	selmon->mfact = selmon->mfacts[selmon->curtag];
+ 	selmon->nmaster = selmon->nmasters[selmon->curtag];
+ 	if(selmon->showbar != selmon->showbars[selmon->curtag])
+ 		togglebar(NULL);
 	focus(NULL);
 	arrange(selmon);
 }

Reply via email to