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);
 | 
								GrabModeAsync, GrabModeSync, None, None);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(!c->isfloat)
 | 
						if(!c->isfloat)
 | 
				
			||||||
		c->isfloat = trans
 | 
							c->isfloat = trans || (c->maxw && c->minw &&
 | 
				
			||||||
			|| ((c->maxw == c->minw) && (c->maxh == c->minh));
 | 
									(c->maxw == c->minw) && (c->maxh == c->minh));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	setgeom(c);
 | 
						setgeom(c);
 | 
				
			||||||
	settitle(c);
 | 
						settitle(c);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								dwm.h
									
									
									
									
									
								
							@@ -30,8 +30,6 @@ typedef struct Client Client;
 | 
				
			|||||||
typedef enum Corner Corner;
 | 
					typedef enum Corner Corner;
 | 
				
			||||||
typedef struct DC DC;
 | 
					typedef struct DC DC;
 | 
				
			||||||
typedef struct Fnt Fnt;
 | 
					typedef struct Fnt Fnt;
 | 
				
			||||||
typedef struct Key Key;
 | 
					 | 
				
			||||||
typedef struct Rule Rule;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
union Arg {
 | 
					union Arg {
 | 
				
			||||||
	const char **argv;
 | 
						const char **argv;
 | 
				
			||||||
@@ -84,20 +82,6 @@ struct Client {
 | 
				
			|||||||
	Window title;
 | 
						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 char *tags[TLast], stext[1024];
 | 
				
			||||||
extern int tsel, screen, sx, sy, sw, sh, bx, by, bw, bh, mw;
 | 
					extern int tsel, screen, sx, sy, sw, sh, bx, by, bw, bh, mw;
 | 
				
			||||||
extern void (*handler[LASTEvent])(XEvent *);
 | 
					extern void (*handler[LASTEvent])(XEvent *);
 | 
				
			||||||
@@ -108,7 +92,6 @@ extern Client *clients, *sel;
 | 
				
			|||||||
extern Cursor cursor[CurLast];
 | 
					extern Cursor cursor[CurLast];
 | 
				
			||||||
extern DC dc;
 | 
					extern DC dc;
 | 
				
			||||||
extern Display *dpy;
 | 
					extern Display *dpy;
 | 
				
			||||||
extern Key key[];
 | 
					 | 
				
			||||||
extern Window root, barwin;
 | 
					extern Window root, barwin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* client.c */
 | 
					/* client.c */
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								event.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								event.c
									
									
									
									
									
								
							@@ -12,6 +12,14 @@
 | 
				
			|||||||
#define MouseMask       (ButtonMask | PointerMotionMask)
 | 
					#define MouseMask       (ButtonMask | PointerMotionMask)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* CUSTOMIZE */
 | 
					/* CUSTOMIZE */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
						unsigned long mod;
 | 
				
			||||||
 | 
						KeySym keysym;
 | 
				
			||||||
 | 
						void (*func)(Arg *arg);
 | 
				
			||||||
 | 
						Arg arg;
 | 
				
			||||||
 | 
					} Key;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char *browse[] = { "firefox", NULL };
 | 
					const char *browse[] = { "firefox", NULL };
 | 
				
			||||||
const char *gimp[] = { "gimp", NULL };
 | 
					const char *gimp[] = { "gimp", NULL };
 | 
				
			||||||
const char *term[] = { 
 | 
					const char *term[] = { 
 | 
				
			||||||
@@ -20,7 +28,7 @@ const char *term[] = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
const char *xlock[] = { "xlock", NULL };
 | 
					const char *xlock[] = { "xlock", NULL };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Key key[] = {
 | 
					static Key key[] = {
 | 
				
			||||||
	/* modifier				key			function	arguments */
 | 
						/* modifier				key			function	arguments */
 | 
				
			||||||
	{ ControlMask,			XK_0,		appendtag,	{ .i = Tscratch } }, 
 | 
						{ ControlMask,			XK_0,		appendtag,	{ .i = Tscratch } }, 
 | 
				
			||||||
	{ ControlMask,			XK_1,		appendtag,	{ .i = Tdev } }, 
 | 
						{ ControlMask,			XK_1,		appendtag,	{ .i = Tdev } }, 
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										40
									
								
								tag.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								tag.c
									
									
									
									
									
								
							@@ -4,15 +4,25 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
#include "dwm.h"
 | 
					#include "dwm.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <regex.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
#include <X11/Xutil.h>
 | 
					#include <X11/Xutil.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* static */
 | 
					/* static */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
						const char *pattern;
 | 
				
			||||||
 | 
						char *tags[TLast];
 | 
				
			||||||
 | 
						Bool isfloat;
 | 
				
			||||||
 | 
					} Rule;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* CUSTOMIZE */ 
 | 
					/* CUSTOMIZE */ 
 | 
				
			||||||
static Rule rule[] = {
 | 
					static Rule rule[] = {
 | 
				
			||||||
	/* class			instance	tags		isfloat */
 | 
						/* class			instance	tags		isfloat */
 | 
				
			||||||
	{ "Firefox-bin",	"firefox-bin",	{ [Twww] = "www" },			False },
 | 
						{ "Firefox.*",	{ [Twww] = "www" },			False },
 | 
				
			||||||
 | 
						{ "Gimp.*",		{ 0 },						True},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* extern */
 | 
					/* extern */
 | 
				
			||||||
@@ -164,10 +174,13 @@ replacetag(Arg *arg)
 | 
				
			|||||||
void
 | 
					void
 | 
				
			||||||
settags(Client *c)
 | 
					settags(Client *c)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	XClassHint ch;
 | 
						char classinst[256];
 | 
				
			||||||
	static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0;
 | 
						static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0;
 | 
				
			||||||
	unsigned int i, j;
 | 
						unsigned int i, j;
 | 
				
			||||||
 | 
						regex_t regex;
 | 
				
			||||||
 | 
						regmatch_t tmp;
 | 
				
			||||||
	Bool matched = False;
 | 
						Bool matched = False;
 | 
				
			||||||
 | 
						XClassHint ch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(!len) {
 | 
						if(!len) {
 | 
				
			||||||
		c->tags[tsel] = tags[tsel];
 | 
							c->tags[tsel] = tags[tsel];
 | 
				
			||||||
@@ -175,16 +188,20 @@ settags(Client *c)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(XGetClassHint(dpy, c->win, &ch)) {
 | 
						if(XGetClassHint(dpy, c->win, &ch)) {
 | 
				
			||||||
		if(ch.res_class && ch.res_name) {
 | 
							snprintf(classinst, sizeof(classinst), "%s:%s",
 | 
				
			||||||
			for(i = 0; i < len; i++)
 | 
									ch.res_class ? ch.res_class : "",
 | 
				
			||||||
				if(!strncmp(rule[i].class, ch.res_class, sizeof(rule[i].class))
 | 
									ch.res_name ? ch.res_name : "");
 | 
				
			||||||
					&& !strncmp(rule[i].instance, ch.res_name, sizeof(rule[i].instance)))
 | 
							for(i = 0; !matched && i < len; i++) {
 | 
				
			||||||
				{
 | 
								if(!regcomp(®ex, rule[i].pattern, 0)) {
 | 
				
			||||||
					for(j = 0; j < TLast; j++)
 | 
									if(!regexec(®ex, classinst, 1, &tmp, 0)) {
 | 
				
			||||||
						c->tags[j] = rule[i].tags[j];
 | 
										for(j = 0; j < TLast; j++) {
 | 
				
			||||||
					c->isfloat = rule[i].isfloat;
 | 
											if(rule[i].tags[j])
 | 
				
			||||||
							matched = True;
 | 
												matched = True;
 | 
				
			||||||
					break;
 | 
											c->tags[j] = rule[i].tags[j];
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										c->isfloat = rule[i].isfloat;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									regfree(®ex);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if(ch.res_class)
 | 
							if(ch.res_class)
 | 
				
			||||||
@@ -192,7 +209,6 @@ settags(Client *c)
 | 
				
			|||||||
		if(ch.res_name)
 | 
							if(ch.res_name)
 | 
				
			||||||
			XFree(ch.res_name);
 | 
								XFree(ch.res_name);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if(!matched)
 | 
						if(!matched)
 | 
				
			||||||
		c->tags[tsel] = tags[tsel];
 | 
							c->tags[tsel] = tags[tsel];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user