dwm

my fork of dwm
Index Commits Files Refs README LICENSE
commit e21d93b7bd5d34f31bc09a576b7d449df5b68c07
parent f504aea13289c7fd25d499d2582558d4e311bfbf
Author: arg@10ksloc.org <unknown>
Date:   Fri,  4 Aug 2006 14:40:32 +0200

switched to regexp matching for Rules

Diffstat:
Mconfig.arg.h | 11+++++------
Mconfig.default.h | 7+++----
Mconfig.mk | 8++++----
Mdwm.h | 1+
Mmain.c | 1+
Mtag.c | 68+++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
6 files changed, 65 insertions(+), 31 deletions(-)
diff --git a/config.arg.h b/config.arg.h
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)