From 65c8c7a5ce5ef2039ea9e31704d6e9fb0b98a56a Mon Sep 17 00:00:00 2001 From: Martin Duquesnoy Date: Thu, 2 Feb 2012 12:03:54 +0100 Subject: [PATCH] Add tag_new & tag_del uicb (Dynamic tagging) --- src/config.h | 2 ++ src/infobar.c | 24 +++++++++++++++++------- src/screen.c | 1 + src/tag.c | 46 ++++++++++++++++++++++++++++++++++++++++++---- src/tag.h | 2 ++ src/wmfs.h | 2 ++ 6 files changed, 66 insertions(+), 11 deletions(-) diff --git a/src/config.h b/src/config.h index 4cfc0e5..c839b95 100644 --- a/src/config.h +++ b/src/config.h @@ -38,6 +38,8 @@ static const struct { char *name; void (*func)(Uicb cmd); } uicb_list[] = { "tag_move_client_next", uicb_tag_move_client_next }, { "tag_move_client_prev", uicb_tag_move_client_prev }, { "tag_click", uicb_tag_click }, + { "tag_new", uicb_tag_new }, + { "tag_del", uicb_tag_del }, /* Layout */ { "layout_vmirror", uicb_layout_vmirror }, diff --git a/src/infobar.c b/src/infobar.c index 8389eb1..3e9d9d0 100644 --- a/src/infobar.c +++ b/src/infobar.c @@ -12,6 +12,14 @@ #include "status.h" #include "systray.h" +#define ELEM_FREE_BARWIN(e) \ + while(!SLIST_EMPTY(&e->bars)) \ + { \ + b = SLIST_FIRST(&e->bars); \ + SLIST_REMOVE_HEAD(&e->bars, enext); \ + barwin_remove(b); \ + } + static void infobar_elem_tag_init(struct element *e); static void infobar_elem_tag_update(struct element *e); static void infobar_elem_status_init(struct element *e); @@ -54,8 +62,15 @@ infobar_elem_tag_init(struct element *e) e->statusctx = &e->infobar->theme->tags_n_sl; - if(SLIST_EMPTY(&e->bars)) + if(SLIST_EMPTY(&e->bars) || (e->infobar->screen->flags & SCREEN_TAG_UPDATE)) { + if((e->infobar->screen->flags & SCREEN_TAG_UPDATE)) + { + ELEM_FREE_BARWIN(e); + SLIST_INIT(&e->bars); + e->infobar->screen->flags ^= SCREEN_TAG_UPDATE; + } + TAILQ_FOREACH(t, &e->infobar->screen->tags, next) { s = draw_textw(e->infobar->theme, t->name) + PAD; @@ -380,12 +395,7 @@ infobar_elem_remove(struct element *e) TAILQ_REMOVE(&e->infobar->elements, e, next); - while(!SLIST_EMPTY(&e->bars)) - { - b = SLIST_FIRST(&e->bars); - SLIST_REMOVE_HEAD(&e->bars, enext); - barwin_remove(b); - } + ELEM_FREE_BARWIN(e); free(e); } diff --git a/src/screen.c b/src/screen.c index e0a3979..c5e7f15 100644 --- a/src/screen.c +++ b/src/screen.c @@ -21,6 +21,7 @@ screen_new(struct geo *g, int id) s->geo = s->ugeo = *g; s->seltag = NULL; s->id = id; + s->flags = 0; TAILQ_INIT(&s->tags); SLIST_INIT(&s->infobars); diff --git a/src/tag.c b/src/tag.c index 0fd9c44..78db66f 100644 --- a/src/tag.c +++ b/src/tag.c @@ -22,7 +22,6 @@ tag_new(struct screen *s, char *name) t = xcalloc(1, sizeof(struct tag)); t->screen = s; - t->name = xstrdup(name); t->flags = 0; t->id = 0; t->sel = NULL; @@ -31,6 +30,11 @@ tag_new(struct screen *s, char *name) if((l = TAILQ_LAST(&s->tags, tsub))) t->id = l->id + 1; + if(!strlen(name)) + xasprintf(&t->name, "%d", t->id + 1); + else + t->name = xstrdup(name); + SLIST_INIT(&t->clients); TAILQ_INIT(&t->sets); @@ -219,6 +223,8 @@ uicb_tag_click(Uicb cmd) static void tag_remove(struct tag *t) { + TAILQ_REMOVE(&t->screen->tags, t, next); + free(t->name); layout_free_set(t); @@ -226,14 +232,46 @@ tag_remove(struct tag *t) free(t); } +void +uicb_tag_new(Uicb cmd) +{ + struct screen *s = W->screen; + struct infobar *i; + + tag_new(s, (char*)cmd); + + s->flags |= SCREEN_TAG_UPDATE; + + SLIST_FOREACH(i, &s->infobars, next) + infobar_elem_reinit(i); +} + +void +uicb_tag_del(Uicb cmd) +{ + struct infobar *i; + struct tag *t = W->screen->seltag; + (void)cmd; + + if(SLIST_EMPTY(&t->clients) + && TAILQ_NEXT(TAILQ_FIRST(&W->screen->tags), next)) + { + + tag_screen(W->screen, TAILQ_NEXT(t, next)); + tag_remove(t); + + W->screen->flags |= SCREEN_TAG_UPDATE; + + SLIST_FOREACH(i, &W->screen->infobars, next) + infobar_elem_reinit(i); + } +} + void tag_free(struct screen *s) { struct tag *t; TAILQ_FOREACH(t, &s->tags, next) - { - TAILQ_REMOVE(&s->tags, t, next); tag_remove(t); - } } diff --git a/src/tag.h b/src/tag.h index c7f604d..89a25ba 100644 --- a/src/tag.h +++ b/src/tag.h @@ -32,5 +32,7 @@ void uicb_tag_client(Uicb cmd); void uicb_tag_move_client_next(Uicb cmd); void uicb_tag_move_client_prev(Uicb cmd); void uicb_tag_click(Uicb cmd); +void uicb_tag_new(Uicb cmd); +void uicb_tag_del(Uicb cmd); #endif /* TAG_H */ diff --git a/src/wmfs.h b/src/wmfs.h index 408521f..a9349ad 100644 --- a/src/wmfs.h +++ b/src/wmfs.h @@ -149,6 +149,8 @@ struct screen { struct geo geo, ugeo; struct tag *seltag; +#define SCREEN_TAG_UPDATE 0x01 + Flags flags; int id; TAILQ_HEAD(tsub, tag) tags; SLIST_HEAD(, infobar) infobars;