From 9f21fb3c9e7a2f1b4dbff992d904a8c87b11b11a Mon Sep 17 00:00:00 2001 From: Julien Danjou Date: Mon, 12 Nov 2007 19:25:10 +0100 Subject: [PATCH] rules are now stored in a linked list --- awesome.c | 10 ++++++---- config.c | 31 ++++++++++++++++++------------- config.h | 8 ++++---- tag.c | 38 ++++++++++++++++++-------------------- tag.h | 2 +- 5 files changed, 47 insertions(+), 42 deletions(-) diff --git a/awesome.c b/awesome.c index e2dae97b..7df55704 100644 --- a/awesome.c +++ b/awesome.c @@ -57,6 +57,7 @@ cleanup_screen(awesome_config *awesomeconf) int i; Button *b, *bn; Key *k, *kn; + Rule *r, *rn; XftFontClose(awesomeconf->display, awesomeconf->font); XUngrabKey(awesomeconf->display, AnyKey, AnyModifier, RootWindow(awesomeconf->display, awesomeconf->phys_screen)); @@ -97,14 +98,15 @@ cleanup_screen(awesome_config *awesomeconf) } for(i = 0; i < awesomeconf->nlayouts; i++) p_delete(&awesomeconf->layouts[i].symbol); - for(i = 0; i < awesomeconf->nrules; i++) + for(r = awesomeconf->rules; r; r = rn) { - p_delete(&awesomeconf->rules[i].prop); - p_delete(&awesomeconf->rules[i].tags); + rn = r->next; + p_delete(&r->prop); + p_delete(&r->tags); + p_delete(&r); } p_delete(&awesomeconf->tags); p_delete(&awesomeconf->layouts); - p_delete(&awesomeconf->rules); p_delete(&awesomeconf->configpath); } diff --git a/config.c b/config.c index 4e80ad90..4c0edf87 100644 --- a/config.c +++ b/config.c @@ -342,6 +342,7 @@ parse_config(const char *confpatharg, awesome_config *awesomeconf) char *confpath, buf[2]; ssize_t confpath_len; Key *key = NULL; + Rule *rule = NULL; if(confpatharg) confpath = a_strdup(confpatharg); @@ -443,22 +444,26 @@ parse_config(const char *confpatharg, awesome_config *awesomeconf) eprint("awesome: fatal: no default layout available\n"); /* Rules */ - awesomeconf->nrules = cfg_size(cfg_rules, "rule"); - awesomeconf->rules = p_new(Rule, awesomeconf->nrules); - for(i = 0; i < awesomeconf->nrules; i++) + if(cfg_size(cfg_rules, "rule")) { - cfgsectmp = cfg_getnsec(cfg_rules, "rule", i); - awesomeconf->rules[i].prop = a_strdup(cfg_getstr(cfgsectmp, "name")); - awesomeconf->rules[i].tags = a_strdup(cfg_getstr(cfgsectmp, "tags")); - if(!a_strlen(awesomeconf->rules[i].tags)) - awesomeconf->rules[i].tags = NULL; - awesomeconf->rules[i].isfloating = cfg_getbool(cfgsectmp, "float"); - awesomeconf->rules[i].screen = cfg_getint(cfgsectmp, "screen"); - if(awesomeconf->rules[i].screen >= get_screen_count(awesomeconf->display)) - awesomeconf->rules[i].screen = 0; + awesomeconf->rules = rule = p_new(Rule, 1); + for(j = 0; j < cfg_size(cfg_rules, "rule"); j++) + { + cfgsectmp = cfg_getnsec(cfg_rules, "rule", j); + rule->prop = a_strdup(cfg_getstr(cfgsectmp, "name")); + rule->tags = a_strdup(cfg_getstr(cfgsectmp, "tags")); + if(!a_strlen(rule->tags)) + rule->tags = NULL; + rule->isfloating = cfg_getbool(cfgsectmp, "float"); + rule->screen = cfg_getint(cfgsectmp, "screen"); + if(rule->screen >= get_screen_count(awesomeconf->display)) + rule->screen = 0; + } } + else + awesomeconf->rules = NULL; - compileregs(awesomeconf->rules, awesomeconf->nrules); + compileregs(awesomeconf->rules); /* Tags */ awesomeconf->ntags = cfg_size(cfg_tags, "tag"); diff --git a/config.h b/config.h index 34dbcbd0..2aa55fb3 100644 --- a/config.h +++ b/config.h @@ -36,7 +36,8 @@ enum enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -typedef struct +typedef struct Rule Rule; +struct Rule { char *prop; char *tags; @@ -44,7 +45,8 @@ typedef struct Bool isfloating; regex_t *propregex; regex_t *tagregex; -} Rule; + Rule *next; +}; typedef struct awesome_config awesome_config; @@ -169,8 +171,6 @@ struct awesome_config int nlayouts; /** Rules list */ Rule *rules; - /** Number of rules in *rules */ - int nrules; /** Keys bindings list */ Key *keys; /** Mouse bindings list */ diff --git a/tag.c b/tag.c index 2fafc867..75d7be83 100644 --- a/tag.c +++ b/tag.c @@ -35,6 +35,7 @@ applyrules(Client *c, awesome_config *awesomeconf) Bool matched = False; XClassHint ch = { 0, 0 }; char *prop; + Rule *r; XGetClassHint(c->display, c->win, &ch); @@ -45,25 +46,22 @@ applyrules(Client *c, awesome_config *awesomeconf) /* rule matching */ snprintf(prop, len + 3, "%s:%s:%s", ch.res_class ? ch.res_class : "", ch.res_name ? ch.res_name : "", c->name); - for(i = 0; i < awesomeconf->nrules; i++) - if(awesomeconf->rules[i].propregex && !regexec(awesomeconf->rules[i].propregex, prop, 1, &tmp, 0)) + for(r = awesomeconf->rules; r; r = r->next) + if(r->propregex && !regexec(r->propregex, prop, 1, &tmp, 0)) { - c->isfloating = awesomeconf->rules[i].isfloating; - for(j = 0; awesomeconf->rules[i].tagregex && j < awesomeconf->ntags; j++) - if(!regexec(awesomeconf->rules[i].tagregex, awesomeconf->tags[j].name, 1, &tmp, 0)) + c->isfloating = r->isfloating; + for(j = 0; r->tagregex && j < awesomeconf->ntags; j++) + if(!regexec(r->tagregex, awesomeconf->tags[j].name, 1, &tmp, 0)) { matched = True; c->tags[j] = True; } else c->tags[j] = False; - if(awesomeconf->rules[i].screen != -1 - && awesomeconf->rules[i].screen != awesomeconf->screen) + if(r->screen != -1 && r->screen != awesomeconf->screen) { - screen = awesomeconf->rules[i].screen; - move_client_to_screen(c, - &awesomeconf[awesomeconf->rules[i].screen - awesomeconf->screen], - True); + screen = r->screen; + move_client_to_screen(c, &awesomeconf[r->screen - awesomeconf->screen], True); } } p_delete(&prop); @@ -79,28 +77,28 @@ applyrules(Client *c, awesome_config *awesomeconf) } void -compileregs(Rule * rules, int nrules) +compileregs(Rule *rules) { - int i; + Rule *r; regex_t *reg; - for(i = 0; i < nrules; i++) + for(r = rules; r; r = r->next) { - if(rules[i].prop) + if(r->prop) { reg = p_new(regex_t, 1); - if(regcomp(reg, rules[i].prop, REG_EXTENDED)) + if(regcomp(reg, r->prop, REG_EXTENDED)) p_delete(®); else - rules[i].propregex = reg; + r->propregex = reg; } - if(rules[i].tags) + if(r->tags) { reg = p_new(regex_t, 1); - if(regcomp(reg, rules[i].tags, REG_EXTENDED)) + if(regcomp(reg, r->tags, REG_EXTENDED)) p_delete(®); else - rules[i].tagregex = reg; + r->tagregex = reg; } } } diff --git a/tag.h b/tag.h index 4c5cf0e2..2ae039fb 100644 --- a/tag.h +++ b/tag.h @@ -27,7 +27,7 @@ /** Check if a client is tiled */ #define IS_TILED(client, screen, tags, ntags) (client && !client->isfloating && isvisible(client, screen, tags, ntags)) -void compileregs(Rule *, int); +void compileregs(Rule *); Bool isvisible(Client *, int, Tag *, int); int applyrules(Client * c, awesome_config *);