From 2504dbe4ee21763f9f740706a08ed824cddacac7 Mon Sep 17 00:00:00 2001 From: Martin Duquesnoy Date: Thu, 3 Nov 2011 13:03:20 +0100 Subject: [PATCH] Set back previous session tag at reload --- src/ewmh.c | 23 +++++++++++++++++++++++ src/ewmh.h | 1 + src/tag.c | 2 ++ src/tag.h | 13 +++++++++++++ src/wmfs.c | 37 ++++++++++++++++++++++++------------- 5 files changed, 63 insertions(+), 13 deletions(-) diff --git a/src/ewmh.c b/src/ewmh.c index 00c379c..f6a174d 100644 --- a/src/ewmh.c +++ b/src/ewmh.c @@ -104,3 +104,26 @@ ewmh_set_wm_state(Window w, int state) W->net_atom[wm_state], 32, PropModeReplace, d, 2); } +void +ewmh_update_wmfs_props(void) +{ + struct screen *s; + int n = 0; + unsigned char *cts = NULL; + + SLIST_FOREACH(s, &W->h.screen, next) + ++n; + + cts = xcalloc(n, sizeof(char)); + + n = 0; + + SLIST_FOREACH(s, &W->h.screen, next) + cts[n++] = s->seltag->id; + + XChangeProperty(W->dpy, W->root, W->net_atom[wmfs_current_tag], XA_CARDINAL, 32, + PropModeReplace, (unsigned char*)cts, n); + + free(cts); +} + diff --git a/src/ewmh.h b/src/ewmh.h index cfadd11..80f20a6 100644 --- a/src/ewmh.h +++ b/src/ewmh.h @@ -70,5 +70,6 @@ enum void ewmh_init(void); void ewmh_set_wm_state(Window w, int state); +void ewmh_update_wmfs_props(void); #endif /* EWMH_H */ diff --git a/src/tag.c b/src/tag.c index 04442ed..096d40f 100644 --- a/src/tag.c +++ b/src/tag.c @@ -68,6 +68,8 @@ tag_screen(struct screen *s, struct tag *t) s->seltag = t; infobar_elem_screen_update(s, ElemTag); + + ewmh_update_wmfs_props(); } /* Set t to NULL to untag c from c->tag */ diff --git a/src/tag.h b/src/tag.h index 0139ee1..20a62b3 100644 --- a/src/tag.h +++ b/src/tag.h @@ -8,6 +8,19 @@ #include "wmfs.h" + +static inline struct tag* +tag_gb_id(struct screen *s, int id) +{ + struct tag *t; + + TAILQ_FOREACH(t, &s->tags, next) + if(t->id == id) + return t; + + return TAILQ_FIRST(&s->tags); +} + struct tag *tag_new(struct screen *s, char *name); void tag_screen(struct screen *s, struct tag *t); void tag_client(struct tag *t, struct client *c); diff --git a/src/wmfs.c b/src/wmfs.c index b1dc019..13b6e6c 100644 --- a/src/wmfs.c +++ b/src/wmfs.c @@ -175,8 +175,8 @@ wmfs_grab_keys(void) } } -/** Scan if there are windows on X - * for manage it +/** Scan xprops of previous session to set it back + * Check if there are windows on X (previous sessions windows) */ static void wmfs_scan(void) @@ -184,7 +184,6 @@ wmfs_scan(void) struct geo g; struct tag *t; struct client *c; - struct screen *s; int i, n, rf; int tag = -1, screen = -1, flags = -1; unsigned long ir, il; @@ -195,6 +194,21 @@ wmfs_scan(void) SLIST_INIT(&W->h.client); + /* Set back selected tag */ + if(XGetWindowProperty(W->dpy, W->root, W->net_atom[wmfs_current_tag], 0, 32, + False, XA_CARDINAL, &rt, &rf, &ir, &il, + (unsigned char**)&ret) + == Success && ret) + { + struct screen *s; + + for(i = 0; i < (int)ir; ++i) + { + s = screen_gb_id(i); + tag_screen(s, tag_gb_id(s, ret[i])); + } + } + if(XQueryTree(W->dpy, W->root, &usl, &usl2, &w, (unsigned int*)&n)) for(i = n - 1; i != -1; --i) { @@ -243,22 +257,17 @@ wmfs_scan(void) } c = client_new(w[i], &wa, true); + if(flags != -1) c->flags = flags; if(tag != -1 && screen != -1) { c->screen = screen_gb_id(screen); - - TAILQ_FOREACH(t, &c->screen->tags, next) - if(t->id == tag) - { - c->flags |= CLIENT_IGNORE_LAYOUT; - tag_client(t, c); - client_moveresize(c, &g); - client_get_name(c); - break; - } + c->flags |= CLIENT_IGNORE_LAYOUT; + tag_client(tag_gb_id(c->screen, tag), c); + client_moveresize(c, &g); + client_get_name(c); } } } @@ -325,6 +334,8 @@ wmfs_quit(void) * Screens -> tags * -> Infobars -> Elements */ + ewmh_update_wmfs_props(); + screen_free(); XFreeGC(W->dpy, W->rgc);