wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit c087c64dd2a3c600be882de415e457a6eb7620f6
parent 45f0284ab0543bd4ab9eecc62ffff404d3b62019
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Mon, 10 Apr 2006 17:43:13 +0200

simplified tagging data structures internally, though not finished yet, don't use this exessively ;)


Diffstat:
cmd/wm/area.c | 2--
cmd/wm/bar.c | 8++++----
cmd/wm/client.c | 20+++++++-------------
cmd/wm/fs.c | 25++++++++++++-------------
cmd/wm/rule.c | 8++------
cmd/wm/tag.c | 111++++++++++++++++++++++---------------------------------------------------------
cmd/wm/view.c | 46+++++++++++++---------------------------------
cmd/wm/wm.c | 3+--
cmd/wm/wm.h | 13+++++--------
9 files changed, 74 insertions(+), 162 deletions(-)

diff --git a/cmd/wm/area.c b/cmd/wm/area.c @@ -215,8 +215,6 @@ attach_toarea(Area *a, Client *c) unsigned int aidx = area2index(a); Frame *f; - if(clientofview(a->view, c)) - return; c->floating = !aidx; f = cext_emallocz(sizeof(Frame)); f->id = id++; diff --git a/cmd/wm/bar.c b/cmd/wm/bar.c @@ -207,14 +207,14 @@ update_bar_tags() for(i = 0; (i < label.size) && label.data[i]->intern; i++) { l = label.data[i]; - if(!istag(l->name) && !name2view(l->name)) { + if(!name2view(l->name)) { destroy_label(l); i--; } } - for(i = 0; i < tag.size; i++) { - l = get_label(tag.data[i], True); - cext_strlcpy(l->data, tag.data[i], sizeof(l->data)); + for(i = 0; i < view.size; i++) { + l = get_label(view.data[i]->name, True); + cext_strlcpy(l->data, view.data[i]->name, sizeof(l->data)); } draw_bar(); diff --git a/cmd/wm/client.c b/cmd/wm/client.c @@ -330,15 +330,13 @@ manage_client(Client *c) { Client *trans; - if(c->trans && (trans = win2client(c->trans))) { + if(c->trans && (trans = win2client(c->trans))) cext_strlcpy(c->tags, trans->tags, sizeof(c->tags)); - str2tagvector(&c->tag, c->tags); - } else match_tags(c, True); reparent_client(c, c->framewin, c->rect.x, c->rect.y); - update_tags(); + update_tags(c); } static int @@ -350,8 +348,7 @@ dummy_error_handler(Display *dpy, XErrorEvent *error) void destroy_client(Client *c) { - int i; - Client *cl; + unsigned int i; XGrabServer(dpy); XSetErrorHandler(dummy_error_handler); @@ -370,12 +367,9 @@ destroy_client(Client *c) XFreeGC(dpy, c->gc); XDestroyWindow(dpy, c->framewin); cext_vdetach(client2vector(&client), c); - update_tags(); + update_tags(nil); free(c); - if(view.size && (cl = sel_client_of_view(view.data[sel]))) - focus_client(cl); - XSync(dpy, False); XSetErrorHandler(wmii_error_handler); XUngrabServer(dpy); @@ -631,9 +625,9 @@ Bool clienthastag(Client *c, const char *t) { unsigned int i; - for(i = 0; i < c->tag.size; i++) - if(!strncmp(c->tag.data[i], t, strlen(t)) - || !strncmp(c->tag.data[i], "*", 2)) + for(i = 0; i < c->view.size; i++) + if(!strncmp(c->view.data[i]->name, t, strlen(t)) + || !strncmp(c->tags, "*", 2)) return True; return False; } diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c @@ -512,8 +512,8 @@ type2stat(Stat *stat, char *wname, Qid *dir) default: { unsigned int i, len = 0; - for(i = 0; i < tag.size; i++) - len += strlen(tag.data[i]) + 1; + for(i = 0; i < view.size; i++) + len += strlen(view.data[i]->name) + 1; return mkstat(stat, dir, wname, len, IXP_DMREAD); } break; @@ -833,17 +833,17 @@ xread(IXPConn *c, Fcall *fcall) if(m->qid.dir_type == FsDroot) { len = 0; /* jump to offset */ - for(i = 0; i < tag.size; i++) { - len += strlen(tag.data[i]) + 1; + for(i = 0; i < view.size; i++) { + len += strlen(view.data[i]->name) + 1; if(len <= fcall->offset) continue; } /* offset found, proceeding */ - for(; i < tag.size; i++) { - len = strlen(tag.data[i]) + 1; + for(; i < view.size; i++) { + len = strlen(view.data[i]->name) + 1; if(fcall->count + len > fcall->iounit) break; - memcpy(p + fcall->count, tag.data[i], len - 1); + memcpy(p + fcall->count, view.data[i]->name, len - 1); memcpy(p + fcall->count + len - 1, "\n", 1); fcall->count += len; } @@ -864,7 +864,7 @@ xread(IXPConn *c, Fcall *fcall) p = ixp_enc_stat(p, &stat); fcall->count += type2stat(&stat, "bar", &m->qid); p = ixp_enc_stat(p, &stat); - if(tag.size) { + if(view.size) { fcall->count += type2stat(&stat, "tags", &m->qid); p = ixp_enc_stat(p, &stat); } @@ -1028,11 +1028,11 @@ xread(IXPConn *c, Fcall *fcall) memcpy(p, client.data[i1]->tags, fcall->count); break; default: - for(i = 0; i < tag.size; i++) { - len = strlen(tag.data[i]) + 1; + for(i = 0; i < view.size; i++) { + len = strlen(view.data[i]->name) + 1; if(fcall->count + len > fcall->iounit) break; - memcpy(p + fcall->count, tag.data[i], len - 1); + memcpy(p + fcall->count, view.data[i]->name, len - 1); memcpy(p + fcall->count + len - 1, "\n", 1); fcall->count += len; } @@ -1210,8 +1210,7 @@ xwrite(IXPConn *c, Fcall *fcall) else cl = client.data[i1]; cext_strlcpy(cl->tags, buf, sizeof(cl->tags)); - str2tagvector(&cl->tag, buf); - update_tags(); + update_tags(cl); draw_client(cl); break; case FsFgeom: diff --git a/cmd/wm/rule.c b/cmd/wm/rule.c @@ -110,15 +110,11 @@ match(Client *c, const char *prop, Bool newclient) if(!strncmp(r->tags, "~", 2)) c->floating = True; else if(!strncmp(r->tags, "!", 2)) { - if(view.size && newclient) { + if(view.size && newclient) cext_strlcpy(c->tags, view.data[sel]->name, sizeof(c->tags)); - str2tagvector(&c->tag, c->tags); - } } - else { + else cext_strlcpy(c->tags, r->tags, sizeof(c->tags)); - str2tagvector(&c->tag, c->tags); - } } } } diff --git a/cmd/wm/tag.c b/cmd/wm/tag.c @@ -8,107 +8,56 @@ #include "wm.h" -Bool -istag(char *t) +void +update_tags(Client *c) { unsigned int i; - for(i = 0; i < tag.size; i++) - if(!strncmp(tag.data[i], t, strlen(t))) - return True; - return False; -} -static void -organize_client(View *v, Client *c) -{ - if(clienthastag(c, v->name)) { - if(!clientofview(v, c)) { - /*fprintf(stderr, "org attach %s?\n", c->name);*/ - attach_toview(v, c); - } - } - else { - if(clientofview(v, c)) { - /*fprintf(stderr, "org detach %s?\n", c->name);*/ - detach_fromview(v, c); - } - } -} + if(c) { + char buf[256]; + char *toks[16]; + unsigned int j, n; + Bool match; -static Vector * -tag2vector(TagVector *tv) -{ - return (Vector *) tv; -} + fprintf(stderr, "tags: %s\n", c->tags); + cext_strlcpy(buf, c->tags, sizeof(buf)); + n = cext_tokenize(toks, 16, buf, '+'); -void -ensure_tag(char *arg) -{ - if(!istag(arg) && strncmp(arg, "*", 2)) - cext_vattach(tag2vector(&tag), strdup(arg)); -} - -void -update_tags() -{ - unsigned int i, j; - while(tag.size) { - char *p = tag.data[0]; - cext_vdetach(tag2vector(&tag), p); - free(p); - } - - for(i = 0; i < client.size; i++) { - for(j = 0; j < client.data[i]->tag.size; j++) - ensure_tag(client.data[i]->tag.data[j]); - } + for(i = 0; i < n; i++) { + View *v = get_view(toks[i]); + if(!clientofview(v, c)) + attach_toview(v, c); + } - for(i = 0; view.size && (i < client.size); i++) { - for(j = 0; j < view.size; j++) { - View *v = view.data[j]; - if(j == sel) - continue; - organize_client(v, client.data[i]); + for(i = 0; i < c->view.size; i++) { + View *v = c->view.data[i]; + match = False; + for(j = 0; j < n; j++) { + if(!strncmp(v->name, toks[j], sizeof(v->name))) + match = True; + } + if(!match) + detach_fromview(v, c); } - organize_client(view.data[sel], client.data[i]); } - if(view.size && !hasclient(view.data[sel])) - destroy_view(view.data[sel]); + for(i = 0; i < view.size; i++) + if(!hasclient(view.data[i])) + destroy_view(view.data[i]); if(view.size) focus_view(view.data[sel]); - else if(tag.size) - select_view(tag.data[0]); else update_bar_tags(); } void -str2tagvector(TagVector *tv, const char *tags) -{ - unsigned int i, n; - char buf[256]; - char *toks[16]; - char *p; - - while(tv->size) { - p = tv->data[0]; - cext_vdetach(tag2vector(tv), p); - free(p); - } - cext_strlcpy(buf, tags, sizeof(buf)); - n = cext_tokenize(toks, 16, buf, '+'); - for(i = 0; i < n; i++) - cext_vattach(tag2vector(tv), strdup(toks[i])); -} - -void retag() { unsigned int i; - for(i = 0; i < client.size; i++) + for(i = 0; i < client.size; i++) { match_tags(client.data[i], False); - update_tags(); + update_tags(client.data[i]); + } } diff --git a/cmd/wm/view.c b/cmd/wm/view.c @@ -8,7 +8,7 @@ #include "wm.h" -static Vector * +Vector * view2vector(ViewVector *vv) { return (Vector *) vv; @@ -32,6 +32,7 @@ alloc_view(char *name) void destroy_view(View *v) { + fprintf(stderr, "destroy_view: %s\n", v->name); while(v->area.size) destroy_area(v->area.data[0]); @@ -70,13 +71,6 @@ focus_view(View *v) Client *c; unsigned int i; - /* cleanup other empty views */ - for(i = 0; i < view.size; i++) - if(!hasclient(view.data[i])) { - destroy_view(view.data[i]); - i--; - } - XGrabServer(dpy); sel = view2index(v); @@ -158,23 +152,8 @@ name2view(char *name) View * get_view(char *name) { - unsigned int i; View *v = name2view(name); - - if(v) - return v; - - for(i = 0; i < client.size; i++) - if(clienthastag(client.data[i], name)) - goto Createview; - return nil; - -Createview: - v = alloc_view(name); - for(i = 0; i < client.size; i++) - if(clienthastag(client.data[i], name) && !clientofview(v, client.data[i])) - attach_toview(v, client.data[i]); - return v; + return v ? v : alloc_view(name); } Bool @@ -190,7 +169,7 @@ hasclient(View *v) void select_view(char *arg) { - View *v = get_view(arg); + View *v = name2view(arg); if(!v) return; focus_view(v); @@ -200,8 +179,8 @@ Bool clientofview(View *v, Client *c) { unsigned int i; - for(i = 0; i < v->area.size; i++) - if(clientofarea(v->area.data[i], c)) + for(i = 0; i < c->view.size; i++) + if(v == c->view.data[i]) return True; return False; } @@ -209,16 +188,16 @@ clientofview(View *v, Client *c) void detach_fromview(View *v, Client *c) { - int i; - Client *cl; + unsigned int i; + + fprintf(stderr, "detach_fromview: %s\n", c->name); + cext_vdetach(view2vector(&c->view), v); for(i = 0; i < v->area.size; i++) { if(clientofarea(v->area.data[i], c)) { detach_fromarea(v->area.data[i], c); XMoveWindow(dpy, c->framewin, 2 * rect.width, 0); } } - if((cl = sel_client_of_view(v))) - focus_client(cl); } void @@ -226,6 +205,8 @@ attach_toview(View *v, Client *c) { Area *a; + fprintf(stderr, "attach_toview: %s\n", c->name); + if(c->trans || c->floating) a = v->area.data[0]; else @@ -234,8 +215,7 @@ attach_toview(View *v, Client *c) attach_toarea(a, c); map_client(c); XMapWindow(dpy, c->framewin); - if(v == view.data[sel]) - focus_client(c); + cext_vattach(view2vector(&c->view), v); } Client * diff --git a/cmd/wm/wm.c b/cmd/wm/wm.c @@ -289,9 +289,8 @@ main(int argc, char *argv[]) ixp_server_open_conn(&srv, ConnectionNumber(dpy), check_x_event, nil); init_x_event_handler(); - tag.size = view.size = client.size = sel = 0; + view.size = client.size = sel = 0; view.data = nil; - tag.data = nil; client.data = nil; key.data = nil; diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h @@ -96,12 +96,12 @@ struct Frame { Client *client; }; -VECTOR(TagVector, char *); +VECTOR(ViewVector, View *); struct Client { unsigned short id; char name[256]; char tags[256]; - TagVector tag; + ViewVector view; char classinst[256]; int proto; unsigned int border; @@ -152,7 +152,6 @@ typedef struct { } Default; /* global variables */ -VECTOR(ViewVector, View *); VECTOR(ClientVector, Client *); VECTOR(KeyVector, Key *); VECTOR(LabelVector, Label *); @@ -161,7 +160,6 @@ VECTOR(LabelVector, Label *); ViewVector view; unsigned int sel; ClientVector client; -TagVector tag; KeyVector key; LabelVector label; Display *dpy; @@ -264,13 +262,11 @@ void update_rules(); void match_tags(Client *c, Bool newclient); /* tag.c */ -Bool istag(char *t); -void ensure_tag(char *t); -void update_tags(); -void str2tagvector(TagVector *tv, const char *tags); +void update_tags(Client *c); void retag(); /* view.c */ +Vector *view2vector(ViewVector *vv); void arrange_view(View *v, Bool dirty); View *alloc_view(char *name); void focus_view(View *v); @@ -286,6 +282,7 @@ void restack_view(View *v); Bool hasclient(View *v); View *name2view(char *name); void destroy_view(View *v); +View *get_view(char *name); /* wm.c */ void scan_wins();