mirror of
https://git.suckless.org/dwm
synced 2024-12-27 03:16:32 +00:00
implemented regexp matching for rules
This commit is contained in:
parent
f95eed34b4
commit
bcaf6a7a0f
4 changed files with 40 additions and 32 deletions
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];
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue