implemented regexp matching for rules
This commit is contained in:
		
							parent
							
								
									f95eed34b4
								
							
						
					
					
						commit
						bcaf6a7a0f
					
				
							
								
								
									
										5
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								client.c
									
									
									
									
									
								
							| @ -247,8 +247,9 @@ manage(Window w, XWindowAttributes *wa) | ||||
| 			GrabModeAsync, GrabModeSync, None, None); | ||||
| 
 | ||||
| 	if(!c->isfloat) | ||||
| 		c->isfloat = trans | ||||
| 			|| ((c->maxw == c->minw) && (c->maxh == c->minh)); | ||||
| 		c->isfloat = trans || (c->maxw && c->minw && | ||||
| 				(c->maxw == c->minw) && (c->maxh == c->minh)); | ||||
| 
 | ||||
| 
 | ||||
| 	setgeom(c); | ||||
| 	settitle(c); | ||||
|  | ||||
							
								
								
									
										17
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								dwm.h
									
									
									
									
									
								
							| @ -30,8 +30,6 @@ typedef struct Client Client; | ||||
| typedef enum Corner Corner; | ||||
| typedef struct DC DC; | ||||
| typedef struct Fnt Fnt; | ||||
| typedef struct Key Key; | ||||
| typedef struct Rule Rule; | ||||
| 
 | ||||
| union Arg { | ||||
| 	const char **argv; | ||||
| @ -84,20 +82,6 @@ struct Client { | ||||
| 	Window title; | ||||
| }; | ||||
| 
 | ||||
| struct Rule { | ||||
| 	const char *class; | ||||
| 	const char *instance; | ||||
| 	char *tags[TLast]; | ||||
| 	Bool isfloat; | ||||
| }; | ||||
| 
 | ||||
| struct Key { | ||||
| 	unsigned long mod; | ||||
| 	KeySym keysym; | ||||
| 	void (*func)(Arg *arg); | ||||
| 	Arg arg; | ||||
| }; | ||||
| 
 | ||||
| extern char *tags[TLast], stext[1024]; | ||||
| extern int tsel, screen, sx, sy, sw, sh, bx, by, bw, bh, mw; | ||||
| extern void (*handler[LASTEvent])(XEvent *); | ||||
| @ -108,7 +92,6 @@ extern Client *clients, *sel; | ||||
| extern Cursor cursor[CurLast]; | ||||
| extern DC dc; | ||||
| extern Display *dpy; | ||||
| extern Key key[]; | ||||
| extern Window root, barwin; | ||||
| 
 | ||||
| /* client.c */ | ||||
|  | ||||
							
								
								
									
										10
									
								
								event.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								event.c
									
									
									
									
									
								
							| @ -12,6 +12,14 @@ | ||||
| #define MouseMask       (ButtonMask | PointerMotionMask) | ||||
| 
 | ||||
| /* CUSTOMIZE */ | ||||
| 
 | ||||
| typedef struct { | ||||
| 	unsigned long mod; | ||||
| 	KeySym keysym; | ||||
| 	void (*func)(Arg *arg); | ||||
| 	Arg arg; | ||||
| } Key; | ||||
| 
 | ||||
| const char *browse[] = { "firefox", NULL }; | ||||
| const char *gimp[] = { "gimp", NULL }; | ||||
| const char *term[] = {  | ||||
| @ -20,7 +28,7 @@ const char *term[] = { | ||||
| }; | ||||
| const char *xlock[] = { "xlock", NULL }; | ||||
| 
 | ||||
| Key key[] = { | ||||
| static Key key[] = { | ||||
| 	/* modifier				key			function	arguments */ | ||||
| 	{ ControlMask,			XK_0,		appendtag,	{ .i = Tscratch } },  | ||||
| 	{ ControlMask,			XK_1,		appendtag,	{ .i = Tdev } },  | ||||
|  | ||||
							
								
								
									
										40
									
								
								tag.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								tag.c
									
									
									
									
									
								
							| @ -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]; | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 arg@10ksloc.org
						arg@10ksloc.org