diff options
| -rw-r--r-- | client.c | 5 | ||||
| -rw-r--r-- | dwm.h | 17 | ||||
| -rw-r--r-- | event.c | 10 | ||||
| -rw-r--r-- | tag.c | 40 | 
4 files changed, 40 insertions, 32 deletions
| @@ -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); @@ -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; @@ -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 *); @@ -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 */ @@ -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[] = {  @@ -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 } },  @@ -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 */ @@ -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]; @@ -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(®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];  } | 
