Merge branch 'pertag' into allpatch
This commit is contained in:
		
						commit
						9a327dea20
					
				
							
								
								
									
										88
									
								
								dwm.c
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								dwm.c
									
									
									
									
									
								
							| @ -113,6 +113,7 @@ typedef struct { | |||||||
| 	void (*arrange)(Monitor *); | 	void (*arrange)(Monitor *); | ||||||
| } Layout; | } Layout; | ||||||
| 
 | 
 | ||||||
|  | typedef struct Pertag Pertag; | ||||||
| struct Monitor { | struct Monitor { | ||||||
| 	char ltsymbol[16]; | 	char ltsymbol[16]; | ||||||
| 	float mfact; | 	float mfact; | ||||||
| @ -132,6 +133,7 @@ struct Monitor { | |||||||
| 	Monitor *next; | 	Monitor *next; | ||||||
| 	Window barwin; | 	Window barwin; | ||||||
| 	const Layout *lt[2]; | 	const Layout *lt[2]; | ||||||
|  | 	Pertag *pertag; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
| @ -282,6 +284,15 @@ static Colormap cmap; | |||||||
| /* configuration, allows nested code to access above variables */ | /* configuration, allows nested code to access above variables */ | ||||||
| #include "config.h" | #include "config.h" | ||||||
| 
 | 
 | ||||||
|  | struct Pertag { | ||||||
|  | 	unsigned int curtag, prevtag; /* current and previous tag */ | ||||||
|  | 	int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ | ||||||
|  | 	float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ | ||||||
|  | 	unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ | ||||||
|  | 	const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes  */ | ||||||
|  | 	int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| /* compile-time check if all tags fit into an unsigned int bit array. */ | /* compile-time check if all tags fit into an unsigned int bit array. */ | ||||||
| struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; | struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; | ||||||
| 
 | 
 | ||||||
| @ -657,6 +668,7 @@ Monitor * | |||||||
| createmon(void) | createmon(void) | ||||||
| { | { | ||||||
| 	Monitor *m; | 	Monitor *m; | ||||||
|  | 	unsigned int i; | ||||||
| 
 | 
 | ||||||
| 	m = ecalloc(1, sizeof(Monitor)); | 	m = ecalloc(1, sizeof(Monitor)); | ||||||
| 	m->tagset[0] = m->tagset[1] = 1; | 	m->tagset[0] = m->tagset[1] = 1; | ||||||
| @ -667,6 +679,20 @@ createmon(void) | |||||||
| 	m->lt[0] = &layouts[0]; | 	m->lt[0] = &layouts[0]; | ||||||
| 	m->lt[1] = &layouts[1 % LENGTH(layouts)]; | 	m->lt[1] = &layouts[1 % LENGTH(layouts)]; | ||||||
| 	strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); | 	strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); | ||||||
|  | 	m->pertag = ecalloc(1, sizeof(Pertag)); | ||||||
|  | 	m->pertag->curtag = m->pertag->prevtag = 1; | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i <= LENGTH(tags); i++) { | ||||||
|  | 		m->pertag->nmasters[i] = m->nmaster; | ||||||
|  | 		m->pertag->mfacts[i] = m->mfact; | ||||||
|  | 
 | ||||||
|  | 		m->pertag->ltidxs[i][0] = m->lt[0]; | ||||||
|  | 		m->pertag->ltidxs[i][1] = m->lt[1]; | ||||||
|  | 		m->pertag->sellts[i] = m->sellt; | ||||||
|  | 
 | ||||||
|  | 		m->pertag->showbars[i] = m->showbar; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	return m; | 	return m; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -992,7 +1018,7 @@ grabkeys(void) | |||||||
| void | void | ||||||
| incnmaster(const Arg *arg) | incnmaster(const Arg *arg) | ||||||
| { | { | ||||||
| 	selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); | 	selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); | ||||||
| 	arrange(selmon); | 	arrange(selmon); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -1563,9 +1589,9 @@ void | |||||||
| setlayout(const Arg *arg) | setlayout(const Arg *arg) | ||||||
| { | { | ||||||
| 	if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) | 	if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) | ||||||
| 		selmon->sellt ^= 1; | 		selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; | ||||||
| 	if (arg && arg->v) | 	if (arg && arg->v) | ||||||
| 		selmon->lt[selmon->sellt] = (Layout *)arg->v; | 		selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; | ||||||
| 	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); | 	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); | ||||||
| 	if (selmon->sel) | 	if (selmon->sel) | ||||||
| 		arrange(selmon); | 		arrange(selmon); | ||||||
| @ -1584,7 +1610,7 @@ setmfact(const Arg *arg) | |||||||
| 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; | 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; | ||||||
| 	if (f < 0.05 || f > 0.95) | 	if (f < 0.05 || f > 0.95) | ||||||
| 		return; | 		return; | ||||||
| 	selmon->mfact = f; | 	selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; | ||||||
| 	arrange(selmon); | 	arrange(selmon); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -1764,7 +1790,7 @@ tile(Monitor *m) | |||||||
| void | void | ||||||
| togglebar(const Arg *arg) | togglebar(const Arg *arg) | ||||||
| { | { | ||||||
| 	selmon->showbar = !selmon->showbar; | 	selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; | ||||||
| 	updatebarpos(selmon); | 	updatebarpos(selmon); | ||||||
| 	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); | 	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); | ||||||
| 	arrange(selmon); | 	arrange(selmon); | ||||||
| @ -1803,9 +1829,33 @@ void | |||||||
| toggleview(const Arg *arg) | toggleview(const Arg *arg) | ||||||
| { | { | ||||||
| 	unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); | 	unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); | ||||||
|  | 	int i; | ||||||
| 
 | 
 | ||||||
| 	if (newtagset) { | 	if (newtagset) { | ||||||
| 		selmon->tagset[selmon->seltags] = newtagset; | 		selmon->tagset[selmon->seltags] = newtagset; | ||||||
|  | 
 | ||||||
|  | 		if (newtagset == ~0) { | ||||||
|  | 			selmon->pertag->prevtag = selmon->pertag->curtag; | ||||||
|  | 			selmon->pertag->curtag = 0; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		/* test if the user did not select the same tag */ | ||||||
|  | 		if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { | ||||||
|  | 			selmon->pertag->prevtag = selmon->pertag->curtag; | ||||||
|  | 			for (i = 0; !(newtagset & 1 << i); i++) ; | ||||||
|  | 			selmon->pertag->curtag = i + 1; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		/* apply settings for this view */ | ||||||
|  | 		selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; | ||||||
|  | 		selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; | ||||||
|  | 		selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; | ||||||
|  | 		selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; | ||||||
|  | 		selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; | ||||||
|  | 
 | ||||||
|  | 		if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) | ||||||
|  | 			togglebar(NULL); | ||||||
|  | 
 | ||||||
| 		focus(NULL); | 		focus(NULL); | ||||||
| 		arrange(selmon); | 		arrange(selmon); | ||||||
| 	} | 	} | ||||||
| @ -2105,11 +2155,37 @@ updatewmhints(Client *c) | |||||||
| void | void | ||||||
| view(const Arg *arg) | view(const Arg *arg) | ||||||
| { | { | ||||||
|  | 	int i; | ||||||
|  | 	unsigned int tmptag; | ||||||
|  | 
 | ||||||
| 	if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) | 	if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) | ||||||
| 		return; | 		return; | ||||||
| 	selmon->seltags ^= 1; /* toggle sel tagset */ | 	selmon->seltags ^= 1; /* toggle sel tagset */ | ||||||
| 	if (arg->ui & TAGMASK) | 	if (arg->ui & TAGMASK) { | ||||||
| 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; | 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; | ||||||
|  | 		selmon->pertag->prevtag = selmon->pertag->curtag; | ||||||
|  | 
 | ||||||
|  | 		if (arg->ui == ~0) | ||||||
|  | 			selmon->pertag->curtag = 0; | ||||||
|  | 		else { | ||||||
|  | 			for (i = 0; !(arg->ui & 1 << i); i++) ; | ||||||
|  | 			selmon->pertag->curtag = i + 1; | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		tmptag = selmon->pertag->prevtag; | ||||||
|  | 		selmon->pertag->prevtag = selmon->pertag->curtag; | ||||||
|  | 		selmon->pertag->curtag = tmptag; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; | ||||||
|  | 	selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; | ||||||
|  | 	selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; | ||||||
|  | 	selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; | ||||||
|  | 	selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; | ||||||
|  | 
 | ||||||
|  | 	if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) | ||||||
|  | 		togglebar(NULL); | ||||||
|  | 
 | ||||||
| 	focus(NULL); | 	focus(NULL); | ||||||
| 	arrange(selmon); | 	arrange(selmon); | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user