t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit bcaf6a7a0f492c3fafc4baabd2dc06f5191417ee
   DIR parent f95eed34b46dfe73f1511703e0a9301c9d8d1952
   URI Author: arg@10ksloc.org <unknown>
       Date:   Wed, 19 Jul 2006 17:42:08 +0200
       
       implemented regexp matching for rules
       
       Diffstat:
         M client.c                            |       5 +++--
         M dwm.h                               |      17 -----------------
         M event.c                             |      10 +++++++++-
         M tag.c                               |      40 ++++++++++++++++++++++----------
       
       4 files changed, 40 insertions(+), 32 deletions(-)
       ---
   DIR diff --git a/client.c b/client.c
       t@@ -247,8 +247,9 @@ manage(Window w, XWindowAttributes *wa)
                                GrabModeAsync, GrabModeSync, None, None);
        
                if(!c->isfloat)
       -                c->isfloat = trans
       -                        || ((c->maxw == c->minw) && (c->maxh == c->minh));
       +                c->isfloat = trans || (c->maxw && c->minw &&
       +                                (c->maxw == c->minw) && (c->maxh == c->minh));
       +
        
                setgeom(c);
                settitle(c);
   DIR diff --git a/dwm.h b/dwm.h
       t@@ -30,8 +30,6 @@ typedef struct Client Client;
        typedef enum Corner Corner;
        typedef struct DC DC;
        typedef struct Fnt Fnt;
       -typedef struct Key Key;
       -typedef struct Rule Rule;
        
        union Arg {
                const char **argv;
       t@@ -84,20 +82,6 @@ struct Client {
                Window title;
        };
        
       -struct Rule {
       -        const char *class;
       -        const char *instance;
       -        char *tags[TLast];
       -        Bool isfloat;
       -};
       -
       -struct Key {
       -        unsigned long mod;
       -        KeySym keysym;
       -        void (*func)(Arg *arg);
       -        Arg arg;
       -};
       -
        extern char *tags[TLast], stext[1024];
        extern int tsel, screen, sx, sy, sw, sh, bx, by, bw, bh, mw;
        extern void (*handler[LASTEvent])(XEvent *);
       t@@ -108,7 +92,6 @@ extern Client *clients, *sel;
        extern Cursor cursor[CurLast];
        extern DC dc;
        extern Display *dpy;
       -extern Key key[];
        extern Window root, barwin;
        
        /* client.c */
   DIR diff --git a/event.c b/event.c
       t@@ -12,6 +12,14 @@
        #define MouseMask       (ButtonMask | PointerMotionMask)
        
        /* CUSTOMIZE */
       +
       +typedef struct {
       +        unsigned long mod;
       +        KeySym keysym;
       +        void (*func)(Arg *arg);
       +        Arg arg;
       +} Key;
       +
        const char *browse[] = { "firefox", NULL };
        const char *gimp[] = { "gimp", NULL };
        const char *term[] = { 
       t@@ -20,7 +28,7 @@ const char *term[] = {
        };
        const char *xlock[] = { "xlock", NULL };
        
       -Key key[] = {
       +static Key key[] = {
                /* modifier                                key                        function        arguments */
                { ControlMask,                        XK_0,                appendtag,        { .i = Tscratch } }, 
                { ControlMask,                        XK_1,                appendtag,        { .i = Tdev } }, 
   DIR diff --git a/tag.c b/tag.c
       t@@ -4,15 +4,25 @@
         */
        #include "dwm.h"
        
       +#include <regex.h>
       +#include <stdio.h>
        #include <string.h>
       +#include <sys/types.h>
        #include <X11/Xutil.h>
        
        /* static */
        
       +typedef struct {
       +        const char *pattern;
       +        char *tags[TLast];
       +        Bool isfloat;
       +} Rule;
       +
        /* CUSTOMIZE */ 
        static Rule rule[] = {
       -        /* class                        instance        tags                                                isfloat */
       -        { "Firefox-bin",        "firefox-bin",        { [Twww] = "www" },                        False },
       +        /* class                        instance        tags                isfloat */
       +        { "Firefox.*",        { [Twww] = "www" },                        False },
       +        { "Gimp.*",                { 0 },                                                True},
        };
        
        /* extern */
       t@@ -164,10 +174,13 @@ replacetag(Arg *arg)
        void
        settags(Client *c)
        {
       -        XClassHint ch;
       +        char classinst[256];
                static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0;
                unsigned int i, j;
       +        regex_t regex;
       +        regmatch_t tmp;
                Bool matched = False;
       +        XClassHint ch;
        
                if(!len) {
                        c->tags[tsel] = tags[tsel];
       t@@ -175,24 +188,27 @@ settags(Client *c)
                }
        
                if(XGetClassHint(dpy, c->win, &ch)) {
       -                if(ch.res_class && ch.res_name) {
       -                        for(i = 0; i < len; i++)
       -                                if(!strncmp(rule[i].class, ch.res_class, sizeof(rule[i].class))
       -                                        && !strncmp(rule[i].instance, ch.res_name, sizeof(rule[i].instance)))
       -                                {
       -                                        for(j = 0; j < TLast; j++)
       +                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)) {
       +                                        for(j = 0; j < TLast; j++) {
       +                                                if(rule[i].tags[j])
       +                                                        matched = True;
                                                        c->tags[j] = rule[i].tags[j];
       +                                        }
                                                c->isfloat = rule[i].isfloat;
       -                                        matched = True;
       -                                        break;
                                        }
       +                                regfree(&regex);
       +                        }
                        }
                        if(ch.res_class)
                                XFree(ch.res_class);
                        if(ch.res_name)
                                XFree(ch.res_name);
                }
       -
                if(!matched)
                        c->tags[tsel] = tags[tsel];
        }