JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
switched to regexp matching for Rules
authorarg@10ksloc.org <unknown>
Fri, 4 Aug 2006 12:40:32 +0000 (14:40 +0200)
committerarg@10ksloc.org <unknown>
Fri, 4 Aug 2006 12:40:32 +0000 (14:40 +0200)
config.arg.h
config.default.h
config.mk
dwm.h
main.c
tag.c

index 4297376..d391f9e 100644 (file)
@@ -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}, \
 };
index f3fd7b7..3847ff8 100644 (file)
@@ -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}, \
 };
index 4657aff..92e244e 100644 (file)
--- a/config.mk
+++ b/config.mk
@@ -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
index 939b546..57d628a 100644 (file)
--- a/dwm.h
+++ b/dwm.h
@@ -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
index 9ea09bf..633966b 100644 (file)
--- a/main.c
+++ b/main.c
@@ -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
index b20e71e..015a06a 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -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(&regex, rule[i].pattern, 0)) {
-                               if(!regexec(&regex, 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(&regex);
                        }
-               }
                if(ch.res_class)
                        XFree(ch.res_class);
                if(ch.res_name)