commit d12fe194b58299775e8e53ea51b814b2db50b443
parent 0d935ce4333f17cb46c4940036b973133bbaf550
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Sun, 26 Mar 2006 18:21:12 +0200
added new shortcuts as described in prev snap, fixed rule.c issues (update_rules()), changed bar rendering order as explained in IRC (expand is the first non-intern label with east alignment)
Diffstat:
5 files changed, 52 insertions(+), 43 deletions(-)
diff --git a/cmd/wm/bar.c b/cmd/wm/bar.c
@@ -93,11 +93,11 @@ update_bar_geometry()
void
draw_bar()
{
- unsigned int i = 0, x = 0;
+ unsigned int i = 0, w = 0;
+ int exp = 0;
Draw d = { 0 };
Label *l = nil;
- d.align = CENTER;
d.gc = bargc;
d.drawable = barpmap;
d.rect = brect;
@@ -111,7 +111,7 @@ draw_bar()
if(!nlabel)
return;
- for(i = 0; (i < nlabel) && (x < brect.width); i++) {
+ for(i = 0; (i < nlabel) && (w < brect.width); i++) {
l = label[i];
if(l->intern) {
if(nview && !strncmp(l->name, def.tag, sizeof(l->name)))
@@ -119,32 +119,42 @@ draw_bar()
else
l->color = def.norm;
}
+ l->rect.x = 0;
l->rect.y = 0;
- l->rect.x = x;
l->rect.width = brect.height;
if(strlen(l->name))
l->rect.width += XTextWidth(xfont, l->data, strlen(l->data));
l->rect.height = brect.height;
- x += l->rect.width;
+ w += l->rect.width;
}
if(i != nlabel) { /* give all labels same width */
- unsigned int w = brect.width / nlabel;
+ w = brect.width / nlabel;
for(i = 0; i < nlabel; i++) {
l = label[i];
l->rect.x = i * w;
l->rect.width = w;
}
}
- label[nlabel - 1]->rect.width = brect.width - label[nlabel - 1]->rect.x;
+ else { /* expand label properly */
+ for(exp = 0; (exp < nlabel) && (label[exp]->intern); exp++);
+ if(exp == nlabel)
+ exp = -1;
+ else
+ label[exp]->rect.width += (brect.width - w);
+ for(i = 1; i < nlabel; i++)
+ label[i]->rect.x = label[i - 1]->rect.x + label[i - 1]->rect.width;
+ }
for(i = 0; i < nlabel; i++) {
l = label[i];
d.color = l->color;
d.rect = l->rect;
d.data = l->data;
- if(i + 1 == nlabel)
+ if(i == exp)
d.align = EAST;
+ else
+ d.align = CENTER;
blitz_drawlabel(dpy, &d);
blitz_drawborder(dpy, &d);
}
diff --git a/cmd/wm/client.c b/cmd/wm/client.c
@@ -545,6 +545,7 @@ send2area_client(Client *c, char *arg)
a->frame[j] = a->frame[i];
a->frame[i] = f;
arrange_area(a);
+ focus_client(c);
return;
}
else if(!strncmp(arg, "down", 5)) {
@@ -556,6 +557,7 @@ send2area_client(Client *c, char *arg)
a->frame[j] = a->frame[i];
a->frame[i] = f;
arrange_area(a);
+ focus_client(c);
return;
}
else if(!strncmp(arg, "toggle", 7)) {
diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c
@@ -1353,11 +1353,14 @@ static char *
xclunk(IXPConn *c, Fcall *fcall)
{
IXPMap *m = ixp_server_fid2map(c, fcall->fid);
+ unsigned char type = qpath_type(m->qid.path);
if(!m)
return Enofile;
- if(qpath_type(m->qid.path) == FsFkeys)
+ if(type == FsFkeys)
update_keys();
+ else if(type == FsFrules)
+ update_rules();
cext_array_detach((void **)c->map, m, &c->mapsz);
free(m);
fcall->id = RCLUNK;
diff --git a/cmd/wm/rule.c b/cmd/wm/rule.c
@@ -24,44 +24,46 @@ typedef struct {
Bool is_valid;
} Rule;
+static Rule *rule = nil;
+static unsigned int rulesz = 0;
+static unsigned int nrule = 0;
+
enum {
IGNORE,
REGEX,
TAGS
};
-static Rule *
-parse(char *data, unsigned int *n)
+void
+update_rules()
{
- static Rule *rule = nil;
- static unsigned int rulesz = 0;
unsigned int i;
int mode = IGNORE;
char *p, *r, *t, regex[256], tags[256];
- if(!data || !strlen(data))
- return nil;
-
- *n = 0;
- for(p = data; *p; p++)
- if(*p == '\n')
- (*n)++;
+ if(!def.rules || !strlen(def.rules))
+ return;
- for(i = 0; i < rulesz; i++)
+ for(i = 0; i < nrule; i++)
if(rule[i].is_valid) {
regfree(&rule[i].regex);
rule[i].is_valid = False;
}
- if(*n > rulesz) {
+ nrule = 0;
+ for(p = def.rules; *p; p++)
+ if(*p == '\n')
+ nrule++;
+
+ if(nrule > rulesz) {
if(rule)
free(rule);
- rule = cext_emallocz(sizeof(Rule) * (*n));
- rulesz = *n;
+ rule = cext_emallocz(sizeof(Rule) * nrule);
+ rulesz = nrule;
}
i = 0;
- for(p = data; *p; p++)
+ for(p = def.rules; *p; p++)
switch(mode) {
case IGNORE:
if(*p == '/') {
@@ -78,7 +80,7 @@ parse(char *data, unsigned int *n)
if(*p == '/') {
mode = IGNORE;
*r = 0;
- rule[i].is_valid = regcomp(&rule[i].regex, regex, 0);
+ rule[i].is_valid = !regcomp(&rule[i].regex, regex, 0);
}
else {
*r = *p;
@@ -100,26 +102,22 @@ parse(char *data, unsigned int *n)
}
break;
}
-
- return rule;
}
static void
-match(Rule *rule, unsigned int rulesz, Client *c, const char *prop)
+match(Client *c, const char *prop)
{
unsigned int i, j;
regmatch_t tmpregm;
c->ntag = 0;
- for(i = 0; i < rulesz && c->ntag < MAX_TAGS; i++) {
+ for(i = 0; i < nrule; i++) {
Rule *r = &rule[i];
- if(r->is_valid) {
- if(!regexec(&r->regex, prop, 1, &tmpregm, 0)) {
- for(j = 0; c->ntag < MAX_TAGS && j < r->ntag; j++) {
- cext_strlcpy(c->tag[c->ntag], r->tag[j], sizeof(c->tag[c->ntag]));
- c->ntag++;
- }
+ if(r->is_valid && !regexec(&r->regex, prop, 1, &tmpregm, 0)) {
+ for(j = 0; c->ntag < MAX_TAGS && j < r->ntag; j++) {
+ cext_strlcpy(c->tag[c->ntag], r->tag[j], sizeof(c->tag[c->ntag]));
+ c->ntag++;
}
}
}
@@ -128,13 +126,8 @@ match(Rule *rule, unsigned int rulesz, Client *c, const char *prop)
void
match_tags(Client *c)
{
- unsigned int n;
- Rule *rule;
-
if(!def.rules)
return;
-
- rule = parse(def.rules, &n);
- match(rule, n, c, c->name);
- match(rule, n, c, c->classinst);
+ match(c, c->name);
+ match(c, c->classinst);
}
diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h
@@ -275,6 +275,7 @@ void grab_mouse(Window w, unsigned long mod, unsigned int button);
void ungrab_mouse(Window w, unsigned long mod, unsigned int button);
/* rule.c */
+void update_rules();
void match_tags(Client *c);
/* tag.c */