summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarg@10ksloc.org <unknown>2006-07-19 17:42:08 +0200
committerarg@10ksloc.org <unknown>2006-07-19 17:42:08 +0200
commitbcaf6a7a0f492c3fafc4baabd2dc06f5191417ee (patch)
treeec21757627c1bef7b9df09f80543a55f41f8a56f
parentf95eed34b46dfe73f1511703e0a9301c9d8d1952 (diff)
implemented regexp matching for rules
-rw-r--r--client.c5
-rw-r--r--dwm.h17
-rw-r--r--event.c10
-rw-r--r--tag.c40
4 files changed, 40 insertions, 32 deletions
diff --git a/client.c b/client.c
index ccd8100..aa96f4f 100644
--- a/client.c
+++ b/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);
diff --git a/dwm.h b/dwm.h
index f9f89dd..9670c68 100644
--- a/dwm.h
+++ b/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 */
diff --git a/event.c b/event.c
index f8ad44c..05f4ac5 100644
--- a/event.c
+++ b/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 } },
diff --git a/tag.c b/tag.c
index c9eec90..82cf18a 100644
--- a/tag.c
+++ b/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(&regex, rule[i].pattern, 0)) {
+ if(!regexec(&regex, 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(&regex);
+ }
}
if(ch.res_class)
XFree(ch.res_class);
if(ch.res_name)
XFree(ch.res_name);
}
-
if(!matched)
c->tags[tsel] = tags[tsel];
}