|
@ -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 */ |
|
|
|
|
|
{ "Firefox-bin", "firefox-bin", { [Twww] = "www" }, False }, |
|
|
|
|
|
|
|
|
/* class instance tags isfloat */ |
|
|
|
|
|
{ "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) { |
|
|
|
|
|
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->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]; |
|
|
} |
|
|
} |
|
|