implemented regexp matching for rules
This commit is contained in:
parent
f95eed34b4
commit
bcaf6a7a0f
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,24 +188,27 @@ 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)) {
|
||||||
|
for(j = 0; j < TLast; j++) {
|
||||||
|
if(rule[i].tags[j])
|
||||||
|
matched = True;
|
||||||
c->tags[j] = rule[i].tags[j];
|
c->tags[j] = rule[i].tags[j];
|
||||||
|
}
|
||||||
c->isfloat = rule[i].isfloat;
|
c->isfloat = rule[i].isfloat;
|
||||||
matched = True;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
regfree(®ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(ch.res_class)
|
if(ch.res_class)
|
||||||
XFree(ch.res_class);
|
XFree(ch.res_class);
|
||||||
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];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue