timplemented regexp matching for rules - dwm - [fork] customized build of dwm, … | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit bcaf6a7a0f492c3fafc4baabd2dc06f5191417ee | |
parent f95eed34b46dfe73f1511703e0a9301c9d8d1952 | |
Author: [email protected] <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(-) | |
--- | |
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); | |
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 */ | |
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 … | |
{ ControlMask, XK_0, appendtag, … | |
{ ControlMask, XK_1, appendtag, … | |
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 … | |
- { "Firefox-bin", "firefox-bin", { [Twww] = "www" }, … | |
+ /* class instance tags is… | |
+ { "Firefox.*", { [Twww] = "www" }, False… | |
+ { "Gimp.*", { 0 }, … | |
}; | |
/* 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, sizeo… | |
- && !strncmp(rule[i].instance, ch.res_n… | |
- { | |
- 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(®ex, rule[i].pattern, 0)) { | |
+ if(!regexec(®ex, 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(®ex); | |
+ } | |
} | |
if(ch.res_class) | |
XFree(ch.res_class); | |
if(ch.res_name) | |
XFree(ch.res_name); | |
} | |
- | |
if(!matched) | |
c->tags[tsel] = tags[tsel]; | |
} |