comparison tag.c @ 114:dfa5cd0969a6

implemented regexp matching for rules
author arg@10ksloc.org
date Wed, 19 Jul 2006 17:42:08 +0200
parents 3a708f113f55
children 329fd7dae530
comparison
equal deleted inserted replaced
113:b2445fd41f5e 114:dfa5cd0969a6
2 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> 2 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
3 * See LICENSE file for license details. 3 * See LICENSE file for license details.
4 */ 4 */
5 #include "dwm.h" 5 #include "dwm.h"
6 6
7 #include <regex.h>
8 #include <stdio.h>
7 #include <string.h> 9 #include <string.h>
10 #include <sys/types.h>
8 #include <X11/Xutil.h> 11 #include <X11/Xutil.h>
9 12
10 /* static */ 13 /* static */
14
15 typedef struct {
16 const char *pattern;
17 char *tags[TLast];
18 Bool isfloat;
19 } Rule;
11 20
12 /* CUSTOMIZE */ 21 /* CUSTOMIZE */
13 static Rule rule[] = { 22 static Rule rule[] = {
14 /* class instance tags isfloat */ 23 /* class instance tags isfloat */
15 { "Firefox-bin", "firefox-bin", { [Twww] = "www" }, False }, 24 { "Firefox.*", { [Twww] = "www" }, False },
25 { "Gimp.*", { 0 }, True},
16 }; 26 };
17 27
18 /* extern */ 28 /* extern */
19 29
20 /* CUSTOMIZE */ 30 /* CUSTOMIZE */
162 } 172 }
163 173
164 void 174 void
165 settags(Client *c) 175 settags(Client *c)
166 { 176 {
167 XClassHint ch; 177 char classinst[256];
168 static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0; 178 static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0;
169 unsigned int i, j; 179 unsigned int i, j;
180 regex_t regex;
181 regmatch_t tmp;
170 Bool matched = False; 182 Bool matched = False;
183 XClassHint ch;
171 184
172 if(!len) { 185 if(!len) {
173 c->tags[tsel] = tags[tsel]; 186 c->tags[tsel] = tags[tsel];
174 return; 187 return;
175 } 188 }
176 189
177 if(XGetClassHint(dpy, c->win, &ch)) { 190 if(XGetClassHint(dpy, c->win, &ch)) {
178 if(ch.res_class && ch.res_name) { 191 snprintf(classinst, sizeof(classinst), "%s:%s",
179 for(i = 0; i < len; i++) 192 ch.res_class ? ch.res_class : "",
180 if(!strncmp(rule[i].class, ch.res_class, sizeof(rule[i].class)) 193 ch.res_name ? ch.res_name : "");
181 && !strncmp(rule[i].instance, ch.res_name, sizeof(rule[i].instance))) 194 for(i = 0; !matched && i < len; i++) {
182 { 195 if(!regcomp(&regex, rule[i].pattern, 0)) {
183 for(j = 0; j < TLast; j++) 196 if(!regexec(&regex, classinst, 1, &tmp, 0)) {
197 for(j = 0; j < TLast; j++) {
198 if(rule[i].tags[j])
199 matched = True;
184 c->tags[j] = rule[i].tags[j]; 200 c->tags[j] = rule[i].tags[j];
201 }
185 c->isfloat = rule[i].isfloat; 202 c->isfloat = rule[i].isfloat;
186 matched = True;
187 break;
188 } 203 }
204 regfree(&regex);
205 }
189 } 206 }
190 if(ch.res_class) 207 if(ch.res_class)
191 XFree(ch.res_class); 208 XFree(ch.res_class);
192 if(ch.res_name) 209 if(ch.res_name)
193 XFree(ch.res_name); 210 XFree(ch.res_name);
194 } 211 }
195
196 if(!matched) 212 if(!matched)
197 c->tags[tsel] = tags[tsel]; 213 c->tags[tsel] = tags[tsel];
198 } 214 }
199 215
200 void 216 void