implemented regexp matching for rules
This commit is contained in:
		
							
								
								
									
										5
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								client.c
									
									
									
									
									
								
							@@ -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);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								dwm.h
									
									
									
									
									
								
							@@ -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 */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								event.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								event.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 } }, 
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								tag.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								tag.c
									
									
									
									
									
								
							@@ -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];
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user