manage.c
changeset 774 9447a518cd85
parent 773 81c5237a53b8
equal deleted inserted replaced
773:81c5237a53b8 774:9447a518cd85
    14 unsigned int nmaster = NMASTER;
    14 unsigned int nmaster = NMASTER;
    15 
    15 
    16 /* static */
    16 /* static */
    17 
    17 
    18 typedef struct {
    18 typedef struct {
    19 	const char *clpattern;
    19 	const char *prop;
    20 	const char *tpattern;
    20 	const char *tags;
    21 	Bool isfloat;
    21 	Bool isfloat;
    22 } Rule;
    22 } Rule;
    23 
    23 
    24 typedef struct {
    24 typedef struct {
    25 	regex_t *clregex;
    25 	regex_t *propregex;
    26 	regex_t *tregex;
    26 	regex_t *tagregex;
    27 } RReg;
    27 } Regexps;
    28 
    28 
    29 TAGS
    29 TAGS
    30 RULES
    30 RULES
    31 
    31 
    32 static RReg *rreg = NULL;
    32 static Regexps *regexps = NULL;
    33 static unsigned int len = 0;
    33 static unsigned int len = 0;
    34 
    34 
    35 static Client *
    35 static Client *
    36 nextmanaged(Client *c) {
    36 nextmanaged(Client *c) {
    37 	for(; c && (c->isfloat || !isvisible(c)); c = c->next);
    37 	for(; c && (c->isfloat || !isvisible(c)); c = c->next);
    75 void
    75 void
    76 compileregexps(void) {
    76 compileregexps(void) {
    77 	unsigned int i;
    77 	unsigned int i;
    78 	regex_t *reg;
    78 	regex_t *reg;
    79 
    79 
    80 	if(rreg)
    80 	if(regexps)
    81 		return;
    81 		return;
    82 	len = sizeof rule / sizeof rule[0];
    82 	len = sizeof rule / sizeof rule[0];
    83 	rreg = emallocz(len * sizeof(RReg));
    83 	regexps = emallocz(len * sizeof(Regexps));
    84 	for(i = 0; i < len; i++) {
    84 	for(i = 0; i < len; i++) {
    85 		if(rule[i].clpattern) {
    85 		if(rule[i].prop) {
    86 			reg = emallocz(sizeof(regex_t));
    86 			reg = emallocz(sizeof(regex_t));
    87 			if(regcomp(reg, rule[i].clpattern, REG_EXTENDED))
    87 			if(regcomp(reg, rule[i].prop, REG_EXTENDED))
    88 				free(reg);
    88 				free(reg);
    89 			else
    89 			else
    90 				rreg[i].clregex = reg;
    90 				regexps[i].propregex = reg;
    91 		}
    91 		}
    92 		if(rule[i].tpattern) {
    92 		if(rule[i].tags) {
    93 			reg = emallocz(sizeof(regex_t));
    93 			reg = emallocz(sizeof(regex_t));
    94 			if(regcomp(reg, rule[i].tpattern, REG_EXTENDED))
    94 			if(regcomp(reg, rule[i].tags, REG_EXTENDED))
    95 				free(reg);
    95 				free(reg);
    96 			else
    96 			else
    97 				rreg[i].tregex = reg;
    97 				regexps[i].tagregex = reg;
    98 		}
    98 		}
    99 	}
    99 	}
   100 }
   100 }
   101 
   101 
   102 void
   102 void
   308 		XGetClassHint(dpy, c->win, &ch);
   308 		XGetClassHint(dpy, c->win, &ch);
   309 		snprintf(prop, sizeof prop, "%s:%s:%s",
   309 		snprintf(prop, sizeof prop, "%s:%s:%s",
   310 				ch.res_class ? ch.res_class : "",
   310 				ch.res_class ? ch.res_class : "",
   311 				ch.res_name ? ch.res_name : "", c->name);
   311 				ch.res_name ? ch.res_name : "", c->name);
   312 		for(i = 0; i < len; i++)
   312 		for(i = 0; i < len; i++)
   313 			if(rreg[i].clregex && !regexec(rreg[i].clregex, prop, 1, &tmp, 0)) {
   313 			if(regexps[i].propregex && !regexec(regexps[i].propregex, prop, 1, &tmp, 0)) {
   314 				c->isfloat = rule[i].isfloat;
   314 				c->isfloat = rule[i].isfloat;
   315 				for(j = 0; rreg[i].tregex && j < ntags; j++) {
   315 				for(j = 0; regexps[i].tagregex && j < ntags; j++) {
   316 					if(!regexec(rreg[i].tregex, tags[j], 1, &tmp, 0)) {
   316 					if(!regexec(regexps[i].tagregex, tags[j], 1, &tmp, 0)) {
   317 						matched = True;
   317 						matched = True;
   318 						c->tags[j] = True;
   318 						c->tags[j] = True;
   319 					}
   319 					}
   320 				}
   320 				}
   321 			}
   321 			}