|
|
@@ -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];
|
|
|
}
|