diff --git a/cmd/wm/area.c b/cmd/wm/area.c index 940c7340..51d5aae9 100644 --- a/cmd/wm/area.c +++ b/cmd/wm/area.c @@ -103,9 +103,9 @@ select_area(Area *a, char *arg) } void -send_toarea(Area *to, Client *c) +send_toarea(Area *to, Area *from, Client *c) { - detach_fromarea(c); + detach_fromarea(from, c); attach_toarea(to, c); focus_client(c); } @@ -116,7 +116,7 @@ attach_toarea(Area *a, Client *c) static unsigned short id = 1; Frame *f; - if(is_clientof(a->tag, c)) + if(clientoftag(a->tag, c)) return; f = cext_emallocz(sizeof(Frame)); f->id = id++; @@ -142,21 +142,20 @@ attach_toarea(Area *a, Client *c) } void -detach_fromarea(Client *c) +detach_fromarea(Area *a, Client *c) { Frame *f = c->frame; - Area *a = f->area; + Tag *t = a->tag; + cext_array_detach((void **)a->frame, f, &a->framesz); free(f); a->nframe--; c->frame = nil; - if(a->nframe) { - if(a->sel >= a->nframe) - a->sel = 0; + if(a->sel >= a->nframe) + a->sel = 0; + if(a->nframe) arrange_area(a); - } else { - Tag *t = a->tag; if(t->narea > 2) destroy_area(a); arrange_tag(t, True); @@ -387,7 +386,7 @@ drop_moving(Frame *f, XRectangle *new, XPoint * pt) !blitz_ispointinrect(pt->x, pt->y, &t->area[i]->rect); i++); if((tgt = ((i < t->narea) ? t->area[i] : nil))) { if(tgt != src) { - send_toarea(tgt, f->client); + send_toarea(tgt, src, f->client); arrange_area(tgt); } else { @@ -415,3 +414,14 @@ resize_area(Client *c, XRectangle *r, XPoint *pt) else drop_resize(f, r); } + +Bool +clientofarea(Area *a, Client *c) +{ + unsigned int i; + for(i = 0; i < a->nframe; i++) + if(a->frame[i]->client == c) + return True; + return False; +} + diff --git a/cmd/wm/client.c b/cmd/wm/client.c index 37f33e2c..dca7b388 100644 --- a/cmd/wm/client.c +++ b/cmd/wm/client.c @@ -343,21 +343,10 @@ attach_client(Client *c) void detach_fromtag(Tag *t, Client *c, Bool unmap) { - /* TODO: later check c->frame's if it is a member of t */ - Frame *f = c->frame; - if(f) { - if(!c->destroyed) { - if(!unmap) - unmap_client(c); - c->rect.x = f->rect.x; - c->rect.y = f->rect.y; - reparent_client(c, root, c->rect.x, c->rect.y); - XUnmapWindow(dpy, c->framewin); - } - detach_fromarea(c); - } - if(c->destroyed) - destroy_client(c); + int i; + for(i = 0; i < t->narea; i++) + if(clientofarea(t->area[i], c)) + detach_fromarea(t->area[i], c); } void @@ -365,8 +354,13 @@ detach_client(Client *c, Bool unmap) { int i; for(i = 0; i < ntag; i++) - if(is_clientof(tag[i], c)) - detach_fromtag(tag[i], c, unmap); + detach_fromtag(tag[i], c, unmap); + if(!unmap) + unmap_client(c); + c->rect.x = c->frame->rect.x; + c->rect.y = c->frame->rect.y; + reparent_client(c, root, c->rect.x, c->rect.y); + XUnmapWindow(dpy, c->framewin); } Client * @@ -547,9 +541,7 @@ sendtoarea_client(Client *c, char *arg) return; to = t->area[i]; } - send_toarea(to, c); - arrange_area(a); - arrange_area(to); + send_toarea(to, a, c); } void diff --git a/cmd/wm/event.c b/cmd/wm/event.c index 513bcc35..a1f0ff22 100644 --- a/cmd/wm/event.c +++ b/cmd/wm/event.c @@ -183,11 +183,9 @@ handle_destroynotify(XEvent *e) { XDestroyWindowEvent *ev = &e->xdestroywindow; Client *c = win2client(ev->window); - if(c) { - fprintf(stderr, "destroy: %s\n", c->name); - c->destroyed = True; + if(c->frame) detach_client(c, False); - } + destroy_client(c); } static void @@ -275,10 +273,8 @@ handle_unmapnotify(XEvent *e) { XUnmapEvent *ev = &e->xunmap; Client *c; - if((c = win2client(ev->window))) { - fprintf(stderr, "unmap %s\n", c->name); + if((c = win2client(ev->window))) detach_client(c, True); - } } static void handle_clientmessage(XEvent *e) diff --git a/cmd/wm/tag.c b/cmd/wm/tag.c index 5664c450..522de022 100644 --- a/cmd/wm/tag.c +++ b/cmd/wm/tag.c @@ -147,7 +147,7 @@ get_tag(char *name) t = alloc_tag(name); for(i = 0; i < nclient; i++) - if(!is_clientof(t, client[i]) && strstr(client[i]->tags, name)) + if(!clientoftag(t, client[i]) && strstr(client[i]->tags, name)) attach_totag(t, client[i]); return t; } @@ -175,15 +175,12 @@ has_ctag(char *tag) } Bool -is_clientof(Tag *t, Client *c) +clientoftag(Tag *t, Client *c) { - unsigned int i, j; - for(i = 0; i < t->narea; i++) { - Area *a = t->area[i]; - for(j = 0; j < a->nframe; j++) - if(a->frame[j]->client == c) - return True; - } + unsigned int i; + for(i = 0; i < t->narea; i++) + if(clientofarea(t->area[i], c)) + return True; return False; } @@ -226,11 +223,11 @@ update_ctags() for(i = 0; i < nclient; i++) for(j = 0; j < ntag; j++) { if(strstr(client[i]->tags, tag[j]->name)) { - if(!is_clientof(tag[j], client[i])) + if(!clientoftag(tag[j], client[i])) attach_totag(tag[j], client[i]); } else { - if(is_clientof(tag[j], client[i])) + if(clientoftag(tag[j], client[i])) detach_fromtag(tag[j], client[i], False); } } diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h index 6ec089e9..229d98da 100644 --- a/cmd/wm/wm.h +++ b/cmd/wm/wm.h @@ -210,14 +210,15 @@ int area2index(Area *a); int aid2index(Tag *t, unsigned short id); void update_area_geometry(Area *a); void select_area(Area *a, char *arg); -void send_toarea(Area *to, Client *c); +void send_toarea(Area *to, Area *from, Client *c); void attach_toarea(Area *a, Client *c); -void detach_fromarea(Client *c); +void detach_fromarea(Area *a, Client *c); void arrange_tag(Tag *t, Bool updategeometry); void arrange_area(Area *a); void resize_area(Client *c, XRectangle *r, XPoint *pt); int str2mode(char *arg); char *mode2str(int mode); +Bool clientofarea(Area *a, Client *c); /* bar.c */ Label *new_label(); @@ -295,7 +296,7 @@ void select_tag(char *arg); int tag2index(Tag *t); Bool has_ctag(char *tag); void update_ctags(); -Bool is_clientof(Tag *t, Client *c); +Bool clientoftag(Tag *t, Client *c); /* wm.c */ void scan_wins();