| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -4,15 +4,25 @@ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include "dwm.h" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <regex.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <stdio.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <string.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <sys/types.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <X11/Xutil.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					/* static */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					typedef struct { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						const char *pattern; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						char *tags[TLast]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Bool isfloat; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} Rule; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					/* CUSTOMIZE */  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static Rule rule[] = { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* class			instance	tags						isfloat */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ "Firefox-bin",	"firefox-bin",	{ [Twww] = "www" },			False }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* class			instance	tags		isfloat */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ "Firefox.*",	{ [Twww] = "www" },			False }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ "Gimp.*",		{ 0 },						True}, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					}; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					/* extern */ | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -164,10 +174,13 @@ replacetag(Arg *arg) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					settags(Client *c) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XClassHint ch; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						char classinst[256]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned int i, j; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						regex_t regex; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						regmatch_t tmp; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Bool matched = False; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XClassHint ch; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(!len) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->tags[tsel] = tags[tsel]; | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -175,24 +188,27 @@ settags(Client *c) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(XGetClassHint(dpy, c->win, &ch)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(ch.res_class && ch.res_name) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								for(i = 0; i < len; i++) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									if(!strncmp(rule[i].class, ch.res_class, sizeof(rule[i].class)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										&& !strncmp(rule[i].instance, ch.res_name, sizeof(rule[i].instance))) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										for(j = 0; j < TLast; j++) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							snprintf(classinst, sizeof(classinst), "%s:%s", | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									ch.res_class ? ch.res_class : "", | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									ch.res_name ? ch.res_name : ""); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for(i = 0; !matched && i < len; i++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(!regcomp(®ex, rule[i].pattern, 0)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									if(!regexec(®ex, classinst, 1, &tmp, 0)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										for(j = 0; j < TLast; j++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
											if(rule[i].tags[j]) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
												matched = True; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
											c->tags[j] = rule[i].tags[j]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										c->isfloat = rule[i].isfloat; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										matched = True; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									regfree(®ex); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(ch.res_class) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XFree(ch.res_class); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(ch.res_name) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XFree(ch.res_name); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(!matched) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->tags[tsel] = tags[tsel]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |