diff options
| author | arg@10ksloc.org <unknown> | 2006-08-04 14:40:32 +0200 | 
|---|---|---|
| committer | arg@10ksloc.org <unknown> | 2006-08-04 14:40:32 +0200 | 
| commit | e21d93b7bd5d34f31bc09a576b7d449df5b68c07 (patch) | |
| tree | fb5a123126b80d8cb9480aaec8c320fecfc2fec4 | |
| parent | f504aea13289c7fd25d499d2582558d4e311bfbf (diff) | |
switched to regexp matching for Rules
| -rw-r--r-- | config.arg.h | 11 | ||||
| -rw-r--r-- | config.default.h | 7 | ||||
| -rw-r--r-- | config.mk | 8 | ||||
| -rw-r--r-- | dwm.h | 1 | ||||
| -rw-r--r-- | main.c | 1 | ||||
| -rw-r--r-- | tag.c | 68 | 
6 files changed, 65 insertions, 31 deletions
| diff --git a/config.arg.h b/config.arg.h index 4297376..d391f9e 100644 --- a/config.arg.h +++ b/config.arg.h @@ -52,11 +52,10 @@ static Key key[] = { \  };  #define RULES \ -	const unsigned int two[] = { 2 }; \  static Rule rule[] = { \ -	/* class:instance	tags		isfloat */ \ -	{ "Firefox.*",		two,		False }, \ -	{ "Gimp.*",		NULL,		True}, \ -	{ "MPlayer.*",		NULL,		True}, \ -	{ "Acroread.*",		NULL,		True}, \ +	/* class:instance regex		tags regex	isfloat */ \ +	{ "Firefox.*",			"net",		False }, \ +	{ "Gimp.*",			NULL,		True}, \ +	{ "MPlayer.*",			NULL,		True}, \ +	{ "Acroread.*",			NULL,		True}, \  }; diff --git a/config.default.h b/config.default.h index f3fd7b7..3847ff8 100644 --- a/config.default.h +++ b/config.default.h @@ -47,9 +47,8 @@ static Key key[] = { \  };  #define RULES \ -	const unsigned int two[] = { 2 }; \  static Rule rule[] = { \ -	/* class:instance	tags		isfloat */ \ -	{ "Firefox.*",		two,	False }, \ -	{ "Gimp.*",		NULL,		True}, \ +	/* class:instance regex		tags regex	isfloat */ \ +	{ "Firefox.*",			"2",		False }, \ +	{ "Gimp.*",			NULL,		True}, \  }; @@ -15,10 +15,10 @@ INCS = -I/usr/lib -I${X11INC}  LIBS = -L/usr/lib -lc -L${X11LIB} -lX11  # flags -CFLAGS = -O3 ${INCS} -DVERSION=\"${VERSION}\" -LDFLAGS = ${LIBS} -#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" -#LDFLAGS = -g ${LIBS} +#CFLAGS = -O3 ${INCS} -DVERSION=\"${VERSION}\" +#LDFLAGS = ${LIBS} +CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" +LDFLAGS = -g ${LIBS}  # compiler  CC = cc @@ -121,6 +121,7 @@ extern int xerror(Display *dsply, XErrorEvent *ee);  extern void appendtag(Arg *arg);  extern void dofloat(Arg *arg);  extern void dotile(Arg *arg); +extern void initrregs();  extern Client *getnext(Client *c);  extern Client *getprev(Client *c);  extern void replacetag(Arg *arg); @@ -210,6 +210,7 @@ main(int argc, char *argv[])  	cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);  	grabkeys(); +	initrregs();  	for(ntags = 0; tags[ntags]; ntags++); @@ -5,21 +5,31 @@  #include "dwm.h"  #include <regex.h>  #include <stdio.h> +#include <stdlib.h>  #include <string.h>  #include <sys/types.h>  #include <X11/Xutil.h> -/* static */  typedef struct { -	const char *pattern; -	const unsigned int *tags; +	const char *clpattern; +	const char *tpattern;  	Bool isfloat;  } Rule; +typedef struct { +	regex_t *clregex; +	regex_t *tregex; +} RReg; + +/* static */ +  TAGS  RULES +static RReg *rreg = NULL; +static unsigned int len = 0; +  void (*arrange)(Arg *) = DEFMODE;  /* extern */ @@ -138,6 +148,35 @@ getprev(Client *c)  }  void +initrregs() +{ +	unsigned int i; +	regex_t *reg; + +	if(rreg) +		return; +	len = sizeof(rule) / sizeof(rule[0]); +	rreg = emallocz(len * sizeof(RReg)); + +	for(i = 0; i < len; i++) { +		if(rule[i].clpattern) { +			reg = emallocz(sizeof(regex_t)); +			if(regcomp(reg, rule[i].clpattern, 0)) +				free(reg); +			else +				rreg[i].clregex = reg; +		} +		if(rule[i].tpattern) { +			reg = emallocz(sizeof(regex_t)); +			if(regcomp(reg, rule[i].tpattern, 0)) +				free(reg); +			else +				rreg[i].tregex = reg; +		} +	} +} + +void  replacetag(Arg *arg)  {  	int i; @@ -154,9 +193,7 @@ void  settags(Client *c)  {  	char classinst[256]; -	static unsigned int len = sizeof(rule) / sizeof(rule[0]); -	unsigned int i, j, n; -	regex_t regex; +	unsigned int i, j;  	regmatch_t tmp;  	Bool matched = False;  	XClassHint ch; @@ -165,19 +202,16 @@ settags(Client *c)  		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)) { -					n = rule[i].tags ? -						sizeof(rule[i].tags) / sizeof(rule[i].tags[0]) : 0; -					matched = n != 0; -					for(j = 0; j < n; j++) -						c->tags[rule[i].tags[j]] = True; -					c->isfloat = rule[i].isfloat; +		for(i = 0; !matched && i < len; i++) +			if(rreg[i].clregex && !regexec(rreg[i].clregex, classinst, 1, &tmp, 0)) { +				c->isfloat = rule[i].isfloat; +				for(j = 0; rreg[i].tregex && j < ntags; j++) { +					if(!regexec(rreg[i].tregex, tags[j], 1, &tmp, 0)) { +						matched = True; +						c->tags[j] = True; +					}  				} -				regfree(®ex);  			} -		}  		if(ch.res_class)  			XFree(ch.res_class);  		if(ch.res_name) | 
