implemented regexp matching for rules

master
arg@10ksloc.org 2006-07-19 17:42:08 +02:00
parent f95eed34b4
commit bcaf6a7a0f
4 changed files with 40 additions and 32 deletions

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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(&regex, rule[i].pattern, 0)) {
for(j = 0; j < TLast; j++) if(!regexec(&regex, 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(&regex);
} }
} }
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];
} }