| 
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -27,19 +27,6 @@ static Regs *regs = NULL; | 
															
														
														
													
														
															
																 | 
																 | 
																static unsigned int nrules = 0; | 
																 | 
																 | 
																static unsigned int nrules = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																static char prop[512]; | 
																 | 
																 | 
																static char prop[512]; | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																static void | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																persistconfig(Client *c) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	unsigned int i; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	for(i = 0; i < ntags && i < sizeof prop - 1; i++) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		prop[i] = c->tags[i] ? '1' : '0'; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	if(i < sizeof prop - 1) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		prop[i++] = c->isfloating ? '1' : '0'; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	prop[i] = '\0'; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	XChangeProperty(dpy, c->win, dwmconfig, XA_STRING, 8, | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			PropModeReplace, (unsigned char *)prop, i); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																static unsigned int | 
																 | 
																 | 
																static unsigned int | 
															
														
														
													
														
															
																 | 
																 | 
																idxoftag(const char *tag) { | 
																 | 
																 | 
																idxoftag(const char *tag) { | 
															
														
														
													
														
															
																 | 
																 | 
																	unsigned int i; | 
																 | 
																 | 
																	unsigned int i; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -52,6 +39,37 @@ idxoftag(const char *tag) { | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																/* extern */ | 
																 | 
																 | 
																/* extern */ | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																void | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																applyrules(Client *c) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	unsigned int i, j; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	regmatch_t tmp; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	Bool matched = False; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	XClassHint ch = { 0 }; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	/* rule matching */ | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	XGetClassHint(dpy, c->win, &ch); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	snprintf(prop, sizeof prop, "%s:%s:%s", | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			ch.res_class ? ch.res_class : "", | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			ch.res_name ? ch.res_name : "", c->name); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	for(i = 0; i < nrules; i++) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		if(regs[i].propregex && !regexec(regs[i].propregex, prop, 1, &tmp, 0)) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			c->isfloating = rules[i].isfloating; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			for(j = 0; regs[i].tagregex && j < ntags; j++) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																				if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																					matched = True; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																					c->tags[j] = True; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																				} | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			} | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		} | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	if(ch.res_class) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		XFree(ch.res_class); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	if(ch.res_name) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		XFree(ch.res_name); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	if(!matched) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		for(i = 0; i < ntags; i++) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			c->tags[i] = seltags[i]; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																void | 
																 | 
																 | 
																void | 
															
														
														
													
														
															
																 | 
																 | 
																compileregs(void) { | 
																 | 
																 | 
																compileregs(void) { | 
															
														
														
													
														
															
																 | 
																 | 
																	unsigned int i; | 
																 | 
																 | 
																	unsigned int i; | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -89,60 +107,6 @@ isvisible(Client *c) { | 
															
														
														
													
														
															
																 | 
																 | 
																	return False; | 
																 | 
																 | 
																	return False; | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																void | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																settags(Client *c, Client *trans) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	unsigned int i, j; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	regmatch_t tmp; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	Bool matched = trans != NULL; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	XClassHint ch = { 0 }; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	XTextProperty name; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	if(matched) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		for(i = 0; i < ntags; i++) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			c->tags[i] = trans->tags[i]; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	} | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	else { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		/* check if window has set a property */ | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		name.nitems = 0; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		XGetTextProperty(dpy, c->win, &name, dwmconfig); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		if(name.nitems && name.encoding == XA_STRING) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			strncpy(prop, (char *)name.value, sizeof prop - 1); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			prop[sizeof prop - 1] = '\0'; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			XFree(name.value); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			for(i = 0; i < ntags && i < sizeof prop - 1 && prop[i] != '\0'; i++) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				if((c->tags[i] = prop[i] == '1')) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																					matched = True; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			if(i < sizeof prop - 1 && prop[i] != '\0') | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				c->isfloating = prop[i] == '1'; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		} | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	} | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	if(!matched) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		/* rule matching */ | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		XGetClassHint(dpy, c->win, &ch); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		snprintf(prop, sizeof prop, "%s:%s:%s", | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				ch.res_class ? ch.res_class : "", | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				ch.res_name ? ch.res_name : "", c->name); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		for(i = 0; i < nrules; i++) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			if(regs[i].propregex && !regexec(regs[i].propregex, prop, 1, &tmp, 0)) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				c->isfloating = rules[i].isfloating; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				for(j = 0; regs[i].tagregex && j < ntags; j++) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																					if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																						matched = True; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																						c->tags[j] = True; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																					} | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				} | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			} | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		if(ch.res_class) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			XFree(ch.res_class); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		if(ch.res_name) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			XFree(ch.res_name); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	} | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	if(!matched) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		for(i = 0; i < ntags; i++) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			c->tags[i] = seltags[i]; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	persistconfig(c); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																void | 
																 | 
																 | 
																void | 
															
														
														
													
														
															
																 | 
																 | 
																tag(const char *arg) { | 
																 | 
																 | 
																tag(const char *arg) { | 
															
														
														
													
														
															
																 | 
																 | 
																	unsigned int i; | 
																 | 
																 | 
																	unsigned int i; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -154,7 +118,7 @@ tag(const char *arg) { | 
															
														
														
													
														
															
																 | 
																 | 
																	i = idxoftag(arg); | 
																 | 
																 | 
																	i = idxoftag(arg); | 
															
														
														
													
														
															
																 | 
																 | 
																	if(i >= 0 && i < ntags) | 
																 | 
																 | 
																	if(i >= 0 && i < ntags) | 
															
														
														
													
														
															
																 | 
																 | 
																		sel->tags[i] = True; | 
																 | 
																 | 
																		sel->tags[i] = True; | 
															
														
														
													
														
															
																 | 
																 | 
																	persistconfig(sel); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	saveconfig(sel); | 
															
														
														
													
														
															
																 | 
																 | 
																	arrange(); | 
																 | 
																 | 
																	arrange(); | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -165,7 +129,7 @@ togglefloating(const char *arg) { | 
															
														
														
													
														
															
																 | 
																 | 
																	sel->isfloating = !sel->isfloating; | 
																 | 
																 | 
																	sel->isfloating = !sel->isfloating; | 
															
														
														
													
														
															
																 | 
																 | 
																	if(sel->isfloating) { | 
																 | 
																 | 
																	if(sel->isfloating) { | 
															
														
														
													
														
															
																 | 
																 | 
																		resize(sel, sel->x, sel->y, sel->w, sel->h, True); | 
																 | 
																 | 
																		resize(sel, sel->x, sel->y, sel->w, sel->h, True); | 
															
														
														
													
														
															
																 | 
																 | 
																		persistconfig(sel); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		saveconfig(sel); | 
															
														
														
													
														
															
																 | 
																 | 
																	} | 
																 | 
																 | 
																	} | 
															
														
														
													
														
															
																 | 
																 | 
																	arrange(); | 
																 | 
																 | 
																	arrange(); | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -181,7 +145,7 @@ toggletag(const char *arg) { | 
															
														
														
													
														
															
																 | 
																 | 
																	for(j = 0; j < ntags && !sel->tags[j]; j++); | 
																 | 
																 | 
																	for(j = 0; j < ntags && !sel->tags[j]; j++); | 
															
														
														
													
														
															
																 | 
																 | 
																	if(j == ntags) | 
																 | 
																 | 
																	if(j == ntags) | 
															
														
														
													
														
															
																 | 
																 | 
																		sel->tags[i] = True; | 
																 | 
																 | 
																		sel->tags[i] = True; | 
															
														
														
													
														
															
																 | 
																 | 
																	persistconfig(sel); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	saveconfig(sel); | 
															
														
														
													
														
															
																 | 
																 | 
																	arrange(); | 
																 | 
																 | 
																	arrange(); | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																	
																 | 
																
  |