commit 08f98bc26bac186607e3e25470361f816021353c
parent fd9dbf43e02dabf95fc828507047ab1741f5e96b
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Thu, 9 Mar 2006 00:27:12 +0100
tagging events: NT <tag> is written if a new tag appears in /tags, RT <tag> is written if a tag disappeared in /tags
Diffstat:
4 files changed, 46 insertions(+), 17 deletions(-)
diff --git a/cmd/wm/area.c b/cmd/wm/area.c
@@ -159,8 +159,22 @@ detach_fromarea(Area *a, Client *c)
if(a->nframe)
arrange_area(a);
else {
- if(area2index(a) && t->narea > 2)
+ i = area2index(a);
+ if(i && t->narea > 2)
destroy_area(a);
+ else if(!i && !a->nframe) {
+ if(c->trans) {
+ /* focus area of transient, if possible */
+ Client *cl = win2client(c->trans);
+ if(cl && cl->nframe) {
+ a = cl->frame[cl->sel]->area;
+ if(a->tag == t)
+ t->sel = area2index(a);
+ }
+ }
+ else if(t->area[1]->nframe)
+ t->sel = 1; /* focus first col as fallback */
+ }
arrange_tag(t, True);
}
}
diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c
@@ -327,7 +327,7 @@ name2type(char *name, unsigned char dir_type)
return FsFmode;
if(!strncmp(name, "tag", 4))
return FsFtag;
- if(has_tag(name) && (dir_type == FsDtags))
+ if(has_tag(ctag, name, nctag) && (dir_type == FsDtags))
return FsFtag;
if((dir_type == FsDclass) && name2class(name))
return FsFclasstag;
diff --git a/cmd/wm/tag.c b/cmd/wm/tag.c
@@ -139,7 +139,7 @@ get_tag(char *name)
unsigned int i, n = 0;
Tag *t;
- if(!has_tag(name))
+ if(!has_tag(ctag, name, nctag))
return nil;
for(i = 0; i < ntag; i++) {
t = tag[i];
@@ -185,11 +185,11 @@ select_tag(char *arg)
}
Bool
-has_tag(char *tag)
+has_tag(char **tags, char *tag, unsigned int ntags)
{
unsigned int i;
- for(i = 0; i < nctag; i++)
- if(!strncmp(ctag[i], tag, strlen(ctag[i])))
+ for(i = 0; i < ntags; i++)
+ if(!strncmp(tags[i], tag, strlen(tags[i])))
return True;
return False;
}
@@ -212,12 +212,9 @@ update_tags()
char *tags[128];
char *t;
- fprintf(stderr, "%s", "update_tags\n");
- for(i = 0; i < nctag; i++) {
- free(ctag[i]);
- ctag[i] = nil;
- }
- nctag = 0;
+ char **newctag = nil;
+ unsigned int newctagsz = 0;
+ unsigned int nnewctag = 0;
for(i = 0; i < nclient; i++) {
cext_strlcpy(buf, client[i]->tags, sizeof(buf));
@@ -226,14 +223,32 @@ update_tags()
t = tags[k];
if(*t == '~')
t++;
- if(!has_tag(t)) {
- ctag = (char **)cext_array_attach((void **)ctag, strdup(t),
- sizeof(char *), &ctagsz);
- nctag++;
+ if(!has_tag(newctag, t, nnewctag)) {
+ newctag = (char **)cext_array_attach((void **)newctag, strdup(t),
+ sizeof(char *), &newctagsz);
+ nnewctag++;
}
}
}
+ /* propagate tagging events */
+ for(i = 0; i < nnewctag; i++)
+ if(!has_tag(ctag, newctag[i], nctag)) {
+ snprintf(buf, sizeof(buf), "NT %s\n", newctag[i]);
+ write_event(buf);
+ }
+ for(i = 0; i < nctag; i++) {
+ if(!has_tag(newctag, ctag[i], nnewctag)) {
+ snprintf(buf, sizeof(buf), "RT %s\n", ctag[i]);
+ write_event(buf);
+ }
+ free(ctag[i]);
+ }
+ free(ctag);
+ ctag = newctag;
+ nctag = nnewctag;
+ ctagsz = newctagsz;
+
for(i = 0; i < nclient; i++)
for(j = 0; j < ntag; j++) {
if(strstr(client[i]->tags, tag[j]->name)) {
diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h
@@ -312,7 +312,7 @@ XRectangle *rectangles(unsigned int *num);
int tid2index(unsigned short id);
void select_tag(char *arg);
int tag2index(Tag *t);
-Bool has_tag(char *tag);
+Bool has_tag(char **tags, char *tag, unsigned int ntags);
void update_tags();
Bool clientoftag(Tag *t, Client *c);
void detach_fromtag(Tag *t, Client *c, Bool unmap);