aewl
changeset 114:dfa5cd0969a6
implemented regexp matching for rules
author | arg@10ksloc.org |
---|---|
date | Wed, 19 Jul 2006 17:42:08 +0200 |
parents | b2445fd41f5e |
children | 329fd7dae530 |
files | client.c dwm.h event.c tag.c |
diffstat | 4 files changed, 40 insertions(+), 32 deletions(-) [+] |
line diff
1.1 --- a/client.c Wed Jul 19 16:38:39 2006 +0200 1.2 +++ b/client.c Wed Jul 19 17:42:08 2006 +0200 1.3 @@ -247,8 +247,9 @@ 1.4 GrabModeAsync, GrabModeSync, None, None); 1.5 1.6 if(!c->isfloat) 1.7 - c->isfloat = trans 1.8 - || ((c->maxw == c->minw) && (c->maxh == c->minh)); 1.9 + c->isfloat = trans || (c->maxw && c->minw && 1.10 + (c->maxw == c->minw) && (c->maxh == c->minh)); 1.11 + 1.12 1.13 setgeom(c); 1.14 settitle(c);
2.1 --- a/dwm.h Wed Jul 19 16:38:39 2006 +0200 2.2 +++ b/dwm.h Wed Jul 19 17:42:08 2006 +0200 2.3 @@ -30,8 +30,6 @@ 2.4 typedef enum Corner Corner; 2.5 typedef struct DC DC; 2.6 typedef struct Fnt Fnt; 2.7 -typedef struct Key Key; 2.8 -typedef struct Rule Rule; 2.9 2.10 union Arg { 2.11 const char **argv; 2.12 @@ -84,20 +82,6 @@ 2.13 Window title; 2.14 }; 2.15 2.16 -struct Rule { 2.17 - const char *class; 2.18 - const char *instance; 2.19 - char *tags[TLast]; 2.20 - Bool isfloat; 2.21 -}; 2.22 - 2.23 -struct Key { 2.24 - unsigned long mod; 2.25 - KeySym keysym; 2.26 - void (*func)(Arg *arg); 2.27 - Arg arg; 2.28 -}; 2.29 - 2.30 extern char *tags[TLast], stext[1024]; 2.31 extern int tsel, screen, sx, sy, sw, sh, bx, by, bw, bh, mw; 2.32 extern void (*handler[LASTEvent])(XEvent *); 2.33 @@ -108,7 +92,6 @@ 2.34 extern Cursor cursor[CurLast]; 2.35 extern DC dc; 2.36 extern Display *dpy; 2.37 -extern Key key[]; 2.38 extern Window root, barwin; 2.39 2.40 /* client.c */
3.1 --- a/event.c Wed Jul 19 16:38:39 2006 +0200 3.2 +++ b/event.c Wed Jul 19 17:42:08 2006 +0200 3.3 @@ -12,6 +12,14 @@ 3.4 #define MouseMask (ButtonMask | PointerMotionMask) 3.5 3.6 /* CUSTOMIZE */ 3.7 + 3.8 +typedef struct { 3.9 + unsigned long mod; 3.10 + KeySym keysym; 3.11 + void (*func)(Arg *arg); 3.12 + Arg arg; 3.13 +} Key; 3.14 + 3.15 const char *browse[] = { "firefox", NULL }; 3.16 const char *gimp[] = { "gimp", NULL }; 3.17 const char *term[] = { 3.18 @@ -20,7 +28,7 @@ 3.19 }; 3.20 const char *xlock[] = { "xlock", NULL }; 3.21 3.22 -Key key[] = { 3.23 +static Key key[] = { 3.24 /* modifier key function arguments */ 3.25 { ControlMask, XK_0, appendtag, { .i = Tscratch } }, 3.26 { ControlMask, XK_1, appendtag, { .i = Tdev } },
4.1 --- a/tag.c Wed Jul 19 16:38:39 2006 +0200 4.2 +++ b/tag.c Wed Jul 19 17:42:08 2006 +0200 4.3 @@ -4,15 +4,25 @@ 4.4 */ 4.5 #include "dwm.h" 4.6 4.7 +#include <regex.h> 4.8 +#include <stdio.h> 4.9 #include <string.h> 4.10 +#include <sys/types.h> 4.11 #include <X11/Xutil.h> 4.12 4.13 /* static */ 4.14 4.15 +typedef struct { 4.16 + const char *pattern; 4.17 + char *tags[TLast]; 4.18 + Bool isfloat; 4.19 +} Rule; 4.20 + 4.21 /* CUSTOMIZE */ 4.22 static Rule rule[] = { 4.23 - /* class instance tags isfloat */ 4.24 - { "Firefox-bin", "firefox-bin", { [Twww] = "www" }, False }, 4.25 + /* class instance tags isfloat */ 4.26 + { "Firefox.*", { [Twww] = "www" }, False }, 4.27 + { "Gimp.*", { 0 }, True}, 4.28 }; 4.29 4.30 /* extern */ 4.31 @@ -164,10 +174,13 @@ 4.32 void 4.33 settags(Client *c) 4.34 { 4.35 - XClassHint ch; 4.36 + char classinst[256]; 4.37 static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0; 4.38 unsigned int i, j; 4.39 + regex_t regex; 4.40 + regmatch_t tmp; 4.41 Bool matched = False; 4.42 + XClassHint ch; 4.43 4.44 if(!len) { 4.45 c->tags[tsel] = tags[tsel]; 4.46 @@ -175,24 +188,27 @@ 4.47 } 4.48 4.49 if(XGetClassHint(dpy, c->win, &ch)) { 4.50 - if(ch.res_class && ch.res_name) { 4.51 - for(i = 0; i < len; i++) 4.52 - if(!strncmp(rule[i].class, ch.res_class, sizeof(rule[i].class)) 4.53 - && !strncmp(rule[i].instance, ch.res_name, sizeof(rule[i].instance))) 4.54 - { 4.55 - for(j = 0; j < TLast; j++) 4.56 + snprintf(classinst, sizeof(classinst), "%s:%s", 4.57 + ch.res_class ? ch.res_class : "", 4.58 + ch.res_name ? ch.res_name : ""); 4.59 + for(i = 0; !matched && i < len; i++) { 4.60 + if(!regcomp(®ex, rule[i].pattern, 0)) { 4.61 + if(!regexec(®ex, classinst, 1, &tmp, 0)) { 4.62 + for(j = 0; j < TLast; j++) { 4.63 + if(rule[i].tags[j]) 4.64 + matched = True; 4.65 c->tags[j] = rule[i].tags[j]; 4.66 + } 4.67 c->isfloat = rule[i].isfloat; 4.68 - matched = True; 4.69 - break; 4.70 } 4.71 + regfree(®ex); 4.72 + } 4.73 } 4.74 if(ch.res_class) 4.75 XFree(ch.res_class); 4.76 if(ch.res_name) 4.77 XFree(ch.res_name); 4.78 } 4.79 - 4.80 if(!matched) 4.81 c->tags[tsel] = tags[tsel]; 4.82 }