tswitched to regexp matching for Rules - dwm - [fork] customized build of dwm, … | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit e21d93b7bd5d34f31bc09a576b7d449df5b68c07 | |
parent f504aea13289c7fd25d499d2582558d4e311bfbf | |
Author: [email protected] <unknown> | |
Date: Fri, 4 Aug 2006 14:40:32 +0200 | |
switched to regexp matching for Rules | |
Diffstat: | |
M config.arg.h | 11 +++++------ | |
M config.default.h | 7 +++---- | |
M config.mk | 8 ++++---- | |
M dwm.h | 1 + | |
M main.c | 1 + | |
M tag.c | 68 +++++++++++++++++++++++------… | |
6 files changed, 65 insertions(+), 31 deletions(-) | |
--- | |
diff --git a/config.arg.h b/config.arg.h | |
t@@ -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 | |
t@@ -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}, \ | |
}; | |
diff --git a/config.mk b/config.mk | |
t@@ -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 | |
diff --git a/dwm.h b/dwm.h | |
t@@ -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); | |
diff --git a/main.c b/main.c | |
t@@ -210,6 +210,7 @@ main(int argc, char *argv[]) | |
cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur); | |
grabkeys(); | |
+ initrregs(); | |
for(ntags = 0; tags[ntags]; ntags++); | |
diff --git a/tag.c b/tag.c | |
t@@ -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 */ | |
t@@ -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; | |
t@@ -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; | |
t@@ -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(… | |
- matched = n != 0; | |
- for(j = 0; j < n; j++) | |
- c->tags[rule[i].tags[j]] = Tru… | |
- c->isfloat = rule[i].isfloat; | |
+ for(i = 0; !matched && i < len; i++) | |
+ if(rreg[i].clregex && !regexec(rreg[i].clregex, classi… | |
+ c->isfloat = rule[i].isfloat; | |
+ for(j = 0; rreg[i].tregex && j < ntags; j++) { | |
+ if(!regexec(rreg[i].tregex, tags[j], 1… | |
+ matched = True; | |
+ c->tags[j] = True; | |
+ } | |
} | |
- regfree(®ex); | |
} | |
- } | |
if(ch.res_class) | |
XFree(ch.res_class); | |
if(ch.res_name) |