implement multi-tag selection through button3 click on the specific tag
This commit is contained in:
		
							parent
							
								
									50729a2e73
								
							
						
					
					
						commit
						d7413ffd2d
					
				
							
								
								
									
										4
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								client.c
									
									
									
									
									
								
							| @ -24,7 +24,7 @@ resizetitle(Client *c) | |||||||
| 		c->tw = c->w + 2; | 		c->tw = c->w + 2; | ||||||
| 	c->tx = c->x + c->w - c->tw + 2; | 	c->tx = c->x + c->w - c->tw + 2; | ||||||
| 	c->ty = c->y; | 	c->ty = c->y; | ||||||
| 	if(c->tags[tsel]) | 	if(isvisible(c)) | ||||||
| 		XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); | 		XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); | ||||||
| 	else | 	else | ||||||
| 		XMoveResizeWindow(dpy, c->title, c->tx + 2 * sw, c->ty, c->tw, c->th); | 		XMoveResizeWindow(dpy, c->title, c->tx + 2 * sw, c->ty, c->tw, c->th); | ||||||
| @ -276,7 +276,7 @@ manage(Window w, XWindowAttributes *wa) | |||||||
| 	/* mapping the window now prevents flicker */ | 	/* mapping the window now prevents flicker */ | ||||||
| 	XMapRaised(dpy, c->win); | 	XMapRaised(dpy, c->win); | ||||||
| 	XMapRaised(dpy, c->title); | 	XMapRaised(dpy, c->title); | ||||||
| 	if(c->tags[tsel]) | 	if(isvisible(c)) | ||||||
| 		focus(c); | 		focus(c); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								draw.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								draw.c
									
									
									
									
									
								
							| @ -109,9 +109,9 @@ drawstatus() | |||||||
| 		dc.x += dc.w; | 		dc.x += dc.w; | ||||||
| 		dc.w = textw(tags[i]); | 		dc.w = textw(tags[i]); | ||||||
| 		if(istile) | 		if(istile) | ||||||
| 			drawtext(tags[i], (i == tsel)); | 			drawtext(tags[i], tsel[i]); | ||||||
| 		else | 		else | ||||||
| 			drawtext(tags[i], (i != tsel)); | 			drawtext(tags[i], !tsel[i]); | ||||||
| 	} | 	} | ||||||
| 	x = dc.x + dc.w; | 	x = dc.x + dc.w; | ||||||
| 	dc.w = textw(stext); | 	dc.w = textw(stext); | ||||||
|  | |||||||
							
								
								
									
										5
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								dwm.h
									
									
									
									
									
								
							| @ -69,12 +69,12 @@ struct Client { | |||||||
| 
 | 
 | ||||||
| extern const char *tags[]; | extern const char *tags[]; | ||||||
| extern char stext[1024]; | extern char stext[1024]; | ||||||
| extern int tsel, screen, sx, sy, sw, sh, bx, by, bw, bh, mw; | extern int screen, sx, sy, sw, sh, bx, by, bw, bh, mw; | ||||||
| extern unsigned int ntags; | extern unsigned int ntags; | ||||||
| extern void (*handler[LASTEvent])(XEvent *); | extern void (*handler[LASTEvent])(XEvent *); | ||||||
| extern void (*arrange)(Arg *); | extern void (*arrange)(Arg *); | ||||||
| extern Atom wmatom[WMLast], netatom[NetLast]; | extern Atom wmatom[WMLast], netatom[NetLast]; | ||||||
| extern Bool running, issel; | extern Bool running, issel, *tsel; | ||||||
| extern Client *clients, *sel; | extern Client *clients, *sel; | ||||||
| extern Cursor cursor[CurLast]; | extern Cursor cursor[CurLast]; | ||||||
| extern DC dc; | extern DC dc; | ||||||
| @ -121,6 +121,7 @@ extern void appendtag(Arg *arg); | |||||||
| extern void dofloat(Arg *arg); | extern void dofloat(Arg *arg); | ||||||
| extern void dotile(Arg *arg); | extern void dotile(Arg *arg); | ||||||
| extern void initrregs(); | extern void initrregs(); | ||||||
|  | extern Bool isvisible(Client *c); | ||||||
| extern Client *getnext(Client *c); | extern Client *getnext(Client *c); | ||||||
| extern Client *getprev(Client *c); | extern Client *getprev(Client *c); | ||||||
| extern void replacetag(Arg *arg); | extern void replacetag(Arg *arg); | ||||||
|  | |||||||
							
								
								
									
										6
									
								
								event.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								event.c
									
									
									
									
									
								
							| @ -108,6 +108,12 @@ buttonpress(XEvent *e) | |||||||
| 			for(a.i = 0; a.i < ntags; a.i++) { | 			for(a.i = 0; a.i < ntags; a.i++) { | ||||||
| 				x += textw(tags[a.i]); | 				x += textw(tags[a.i]); | ||||||
| 				if(ev->x < x) { | 				if(ev->x < x) { | ||||||
|  | 					if(ev->button == Button3) { | ||||||
|  | 						tsel[a.i] = True; | ||||||
|  | 						arrange(NULL); | ||||||
|  | 						drawall(); | ||||||
|  | 					} | ||||||
|  | 					else | ||||||
| 						view(&a); | 						view(&a); | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								main.c
									
									
									
									
									
								
							| @ -83,7 +83,7 @@ xerrorstart(Display *dsply, XErrorEvent *ee) | |||||||
| /* extern */ | /* extern */ | ||||||
| 
 | 
 | ||||||
| char stext[1024]; | char stext[1024]; | ||||||
| int tsel = DEFTAG; | Bool *tsel; | ||||||
| int screen, sx, sy, sw, sh, bx, by, bw, bh, mw; | int screen, sx, sy, sw, sh, bx, by, bw, bh, mw; | ||||||
| unsigned int ntags; | unsigned int ntags; | ||||||
| Atom wmatom[WMLast], netatom[NetLast]; | Atom wmatom[WMLast], netatom[NetLast]; | ||||||
| @ -213,6 +213,8 @@ main(int argc, char *argv[]) | |||||||
| 	initrregs(); | 	initrregs(); | ||||||
| 
 | 
 | ||||||
| 	for(ntags = 0; tags[ntags]; ntags++); | 	for(ntags = 0; tags[ntags]; ntags++); | ||||||
|  | 	tsel = emallocz(sizeof(Bool) * ntags); | ||||||
|  | 	tsel[DEFTAG] = True; | ||||||
| 
 | 
 | ||||||
| 	/* style */ | 	/* style */ | ||||||
| 	dc.bg = getcolor(BGCOLOR); | 	dc.bg = getcolor(BGCOLOR); | ||||||
|  | |||||||
							
								
								
									
										40
									
								
								tag.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								tag.c
									
									
									
									
									
								
							| @ -51,7 +51,7 @@ dofloat(Arg *arg) | |||||||
| 
 | 
 | ||||||
| 	for(c = clients; c; c = c->next) { | 	for(c = clients; c; c = c->next) { | ||||||
| 		c->ismax = False; | 		c->ismax = False; | ||||||
| 		if(c->tags[tsel]) { | 		if(isvisible(c)) { | ||||||
| 			resize(c, True, TopLeft); | 			resize(c, True, TopLeft); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| @ -74,7 +74,7 @@ dotile(Arg *arg) | |||||||
| 
 | 
 | ||||||
| 	w = sw - mw; | 	w = sw - mw; | ||||||
| 	for(n = 0, c = clients; c; c = c->next) | 	for(n = 0, c = clients; c; c = c->next) | ||||||
| 		if(c->tags[tsel] && !c->isfloat) | 		if(isvisible(c) && !c->isfloat) | ||||||
| 			n++; | 			n++; | ||||||
| 
 | 
 | ||||||
| 	if(n > 1) | 	if(n > 1) | ||||||
| @ -84,7 +84,7 @@ dotile(Arg *arg) | |||||||
| 
 | 
 | ||||||
| 	for(i = 0, c = clients; c; c = c->next) { | 	for(i = 0, c = clients; c; c = c->next) { | ||||||
| 		c->ismax = False; | 		c->ismax = False; | ||||||
| 		if(c->tags[tsel]) { | 		if(isvisible(c)) { | ||||||
| 			if(c->isfloat) { | 			if(c->isfloat) { | ||||||
| 				higher(c); | 				higher(c); | ||||||
| 				resize(c, True, TopLeft); | 				resize(c, True, TopLeft); | ||||||
| @ -135,14 +135,14 @@ dotile(Arg *arg) | |||||||
| Client * | Client * | ||||||
| getnext(Client *c) | getnext(Client *c) | ||||||
| { | { | ||||||
| 	for(; c && !c->tags[tsel]; c = c->next); | 	for(; c && !isvisible(c); c = c->next); | ||||||
| 	return c; | 	return c; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Client * | Client * | ||||||
| getprev(Client *c) | getprev(Client *c) | ||||||
| { | { | ||||||
| 	for(; c && !c->tags[tsel]; c = c->prev); | 	for(; c && !isvisible(c); c = c->prev); | ||||||
| 	return c; | 	return c; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -175,6 +175,17 @@ initrregs() | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | Bool | ||||||
|  | isvisible(Client *c) | ||||||
|  | { | ||||||
|  | 	unsigned int i; | ||||||
|  | 
 | ||||||
|  | 	for(i = 0; i < ntags; i++) | ||||||
|  | 		if(c->tags[i] && tsel[i]) | ||||||
|  | 			return True; | ||||||
|  | 	return False; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| replacetag(Arg *arg) | replacetag(Arg *arg) | ||||||
| { | { | ||||||
| @ -217,7 +228,8 @@ settags(Client *c) | |||||||
| 			XFree(ch.res_name); | 			XFree(ch.res_name); | ||||||
| 	} | 	} | ||||||
| 	if(!matched) | 	if(!matched) | ||||||
| 		c->tags[tsel] = True; | 		for(i = 0; i < ntags; i++) | ||||||
|  | 			c->tags[i] = tsel[i]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -230,7 +242,11 @@ togglemode(Arg *arg) | |||||||
| void | void | ||||||
| view(Arg *arg) | view(Arg *arg) | ||||||
| { | { | ||||||
| 	tsel = arg->i; | 	unsigned int i; | ||||||
|  | 
 | ||||||
|  | 	for(i = 0; i < ntags; i++) | ||||||
|  | 		tsel[i] = False; | ||||||
|  | 	tsel[arg->i] = True; | ||||||
| 	arrange(NULL); | 	arrange(NULL); | ||||||
| 	drawall(); | 	drawall(); | ||||||
| } | } | ||||||
| @ -238,13 +254,19 @@ view(Arg *arg) | |||||||
| void | void | ||||||
| viewnext(Arg *arg) | viewnext(Arg *arg) | ||||||
| { | { | ||||||
| 	arg->i = (tsel < ntags-1) ? tsel+1 : 0; | 	unsigned int i; | ||||||
|  | 
 | ||||||
|  | 	for(i = 0; !tsel[i]; i++); | ||||||
|  | 	arg->i = (i < ntags-1) ? i+1 : 0; | ||||||
| 	view(arg); | 	view(arg); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| viewprev(Arg *arg) | viewprev(Arg *arg) | ||||||
| { | { | ||||||
| 	arg->i = (tsel > 0) ? tsel-1 : ntags-1; | 	unsigned int i; | ||||||
|  | 
 | ||||||
|  | 	for(i = 0; !tsel[i]; i++); | ||||||
|  | 	arg->i = (i > 0) ? i-1 : ntags-1; | ||||||
| 	view(arg); | 	view(arg); | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user