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); | 			GrabModeAsync, GrabModeSync, None, None); | ||||||
| 
 | 
 | ||||||
| 	if(!c->isfloat) | 	if(!c->isfloat) | ||||||
| 		c->isfloat = trans | 		c->isfloat = trans || (c->maxw && c->minw && | ||||||
| 			|| ((c->maxw == c->minw) && (c->maxh == c->minh)); | 				(c->maxw == c->minw) && (c->maxh == c->minh)); | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 	setgeom(c); | 	setgeom(c); | ||||||
| 	settitle(c); | 	settitle(c); | ||||||
|  | |||||||
							
								
								
									
										17
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								dwm.h
									
									
									
									
									
								
							| @ -30,8 +30,6 @@ typedef struct Client Client; | |||||||
| typedef enum Corner Corner; | typedef enum Corner Corner; | ||||||
| typedef struct DC DC; | typedef struct DC DC; | ||||||
| typedef struct Fnt Fnt; | typedef struct Fnt Fnt; | ||||||
| typedef struct Key Key; |  | ||||||
| typedef struct Rule Rule; |  | ||||||
| 
 | 
 | ||||||
| union Arg { | union Arg { | ||||||
| 	const char **argv; | 	const char **argv; | ||||||
| @ -84,20 +82,6 @@ struct Client { | |||||||
| 	Window title; | 	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 char *tags[TLast], stext[1024]; | ||||||
| extern int tsel, screen, sx, sy, sw, sh, bx, by, bw, bh, mw; | extern int tsel, screen, sx, sy, sw, sh, bx, by, bw, bh, mw; | ||||||
| extern void (*handler[LASTEvent])(XEvent *); | extern void (*handler[LASTEvent])(XEvent *); | ||||||
| @ -108,7 +92,6 @@ extern Client *clients, *sel; | |||||||
| extern Cursor cursor[CurLast]; | extern Cursor cursor[CurLast]; | ||||||
| extern DC dc; | extern DC dc; | ||||||
| extern Display *dpy; | extern Display *dpy; | ||||||
| extern Key key[]; |  | ||||||
| extern Window root, barwin; | extern Window root, barwin; | ||||||
| 
 | 
 | ||||||
| /* client.c */ | /* client.c */ | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								event.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								event.c
									
									
									
									
									
								
							| @ -12,6 +12,14 @@ | |||||||
| #define MouseMask       (ButtonMask | PointerMotionMask) | #define MouseMask       (ButtonMask | PointerMotionMask) | ||||||
| 
 | 
 | ||||||
| /* CUSTOMIZE */ | /* CUSTOMIZE */ | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  | 	unsigned long mod; | ||||||
|  | 	KeySym keysym; | ||||||
|  | 	void (*func)(Arg *arg); | ||||||
|  | 	Arg arg; | ||||||
|  | } Key; | ||||||
|  | 
 | ||||||
| const char *browse[] = { "firefox", NULL }; | const char *browse[] = { "firefox", NULL }; | ||||||
| const char *gimp[] = { "gimp", NULL }; | const char *gimp[] = { "gimp", NULL }; | ||||||
| const char *term[] = {  | const char *term[] = {  | ||||||
| @ -20,7 +28,7 @@ const char *term[] = { | |||||||
| }; | }; | ||||||
| const char *xlock[] = { "xlock", NULL }; | const char *xlock[] = { "xlock", NULL }; | ||||||
| 
 | 
 | ||||||
| Key key[] = { | static Key key[] = { | ||||||
| 	/* modifier				key			function	arguments */ | 	/* modifier				key			function	arguments */ | ||||||
| 	{ ControlMask,			XK_0,		appendtag,	{ .i = Tscratch } },  | 	{ ControlMask,			XK_0,		appendtag,	{ .i = Tscratch } },  | ||||||
| 	{ ControlMask,			XK_1,		appendtag,	{ .i = Tdev } },  | 	{ ControlMask,			XK_1,		appendtag,	{ .i = Tdev } },  | ||||||
|  | |||||||
							
								
								
									
										40
									
								
								tag.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								tag.c
									
									
									
									
									
								
							| @ -4,15 +4,25 @@ | |||||||
|  */ |  */ | ||||||
| #include "dwm.h" | #include "dwm.h" | ||||||
| 
 | 
 | ||||||
|  | #include <regex.h> | ||||||
|  | #include <stdio.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  | #include <sys/types.h> | ||||||
| #include <X11/Xutil.h> | #include <X11/Xutil.h> | ||||||
| 
 | 
 | ||||||
| /* static */ | /* static */ | ||||||
| 
 | 
 | ||||||
|  | typedef struct { | ||||||
|  | 	const char *pattern; | ||||||
|  | 	char *tags[TLast]; | ||||||
|  | 	Bool isfloat; | ||||||
|  | } Rule; | ||||||
|  | 
 | ||||||
| /* CUSTOMIZE */  | /* CUSTOMIZE */  | ||||||
| static Rule rule[] = { | static Rule rule[] = { | ||||||
| 	/* class			instance	tags		isfloat */ | 	/* class			instance	tags		isfloat */ | ||||||
| 	{ "Firefox-bin",	"firefox-bin",	{ [Twww] = "www" },			False }, | 	{ "Firefox.*",	{ [Twww] = "www" },			False }, | ||||||
|  | 	{ "Gimp.*",		{ 0 },						True}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* extern */ | /* extern */ | ||||||
| @ -164,10 +174,13 @@ replacetag(Arg *arg) | |||||||
| void | void | ||||||
| settags(Client *c) | settags(Client *c) | ||||||
| { | { | ||||||
| 	XClassHint ch; | 	char classinst[256]; | ||||||
| 	static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0; | 	static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0; | ||||||
| 	unsigned int i, j; | 	unsigned int i, j; | ||||||
|  | 	regex_t regex; | ||||||
|  | 	regmatch_t tmp; | ||||||
| 	Bool matched = False; | 	Bool matched = False; | ||||||
|  | 	XClassHint ch; | ||||||
| 
 | 
 | ||||||
| 	if(!len) { | 	if(!len) { | ||||||
| 		c->tags[tsel] = tags[tsel]; | 		c->tags[tsel] = tags[tsel]; | ||||||
| @ -175,16 +188,20 @@ settags(Client *c) | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if(XGetClassHint(dpy, c->win, &ch)) { | 	if(XGetClassHint(dpy, c->win, &ch)) { | ||||||
| 		if(ch.res_class && ch.res_name) { | 		snprintf(classinst, sizeof(classinst), "%s:%s", | ||||||
| 			for(i = 0; i < len; i++) | 				ch.res_class ? ch.res_class : "", | ||||||
| 				if(!strncmp(rule[i].class, ch.res_class, sizeof(rule[i].class)) | 				ch.res_name ? ch.res_name : ""); | ||||||
| 					&& !strncmp(rule[i].instance, ch.res_name, sizeof(rule[i].instance))) | 		for(i = 0; !matched && i < len; i++) { | ||||||
| 				{ | 			if(!regcomp(®ex, rule[i].pattern, 0)) { | ||||||
| 					for(j = 0; j < TLast; j++) | 				if(!regexec(®ex, classinst, 1, &tmp, 0)) { | ||||||
| 						c->tags[j] = rule[i].tags[j]; | 					for(j = 0; j < TLast; j++) { | ||||||
| 					c->isfloat = rule[i].isfloat; | 						if(rule[i].tags[j]) | ||||||
| 							matched = True; | 							matched = True; | ||||||
| 					break; | 						c->tags[j] = rule[i].tags[j]; | ||||||
|  | 					} | ||||||
|  | 					c->isfloat = rule[i].isfloat; | ||||||
|  | 				} | ||||||
|  | 				regfree(®ex); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		if(ch.res_class) | 		if(ch.res_class) | ||||||
| @ -192,7 +209,6 @@ settags(Client *c) | |||||||
| 		if(ch.res_name) | 		if(ch.res_name) | ||||||
| 			XFree(ch.res_name); | 			XFree(ch.res_name); | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	if(!matched) | 	if(!matched) | ||||||
| 		c->tags[tsel] = tags[tsel]; | 		c->tags[tsel] = tags[tsel]; | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 arg@10ksloc.org
						arg@10ksloc.org