|  | @@ -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();
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 |