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 } |