wmii

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

commit e0788410678a58f35a0f2ffe44f9e09cda5e85fa
parent ae05206acca01a17177ad089ded0b6d153dae3b0
Author: Kris Maglione <jg@suckless.org>
Date:   Thu,  8 Feb 2007 20:31:12 -0500

Fixed cycling of floating frames, and stacking issues on 'send toggle'


Diffstat:
area.c | 35++++++++++++++++++-----------------
client.c | 6++----
frame.c | 25+++++++++++++++++++------
view.c | 10+++++-----
wmii.h | 2++
5 files changed, 46 insertions(+), 32 deletions(-)

diff --git a/area.c b/area.c @@ -217,7 +217,7 @@ send_to_area(Area *to, Area *from, Frame *f) { void attach_to_area(Area *a, Frame *f, Bool send) { unsigned int h, n_frame; - Frame **fa, *ft; + Frame *ft; Client *c; View *v; @@ -242,10 +242,11 @@ attach_to_area(Area *a, Frame *f, Bool send) { arrange_view(v); } } - fa = a->sel ? &a->sel->anext : &a->frame; - f->anext = *fa; - *fa = f; f->area = a; + if(a->sel) + insert_frame(nil, f, False); + else + insert_frame(a->sel, f, False); a->sel = f; if(!c->floating) { /* column */ f->rect.height = h; @@ -256,7 +257,7 @@ attach_to_area(Area *a, Frame *f, Bool send) { void detach_from_area(Area *a, Frame *f) { - Frame **ft, *pr; + Frame *pr; Client *c; View *v; Area *ta; @@ -264,16 +265,16 @@ detach_from_area(Area *a, Frame *f) { v = a->view; c = f->client; - pr = nil; - for(ft=&a->frame; *ft; ft=&(*ft)->anext) { - if(*ft == f) break; - pr = *ft; + for(pr = a->frame; pr; pr = pr->anext) + if(pr == f) break; + remove_frame(f); + if(a->sel == f) { + a->sel = pr; + if(f->anext) + a->sel = f->anext; } - assert(*ft == f); - *ft = f->anext; - if(a->sel == f) - a->sel = pr ? pr : *ft; + if(!a->floating) { if(a->frame) arrange_column(a, False); @@ -285,7 +286,7 @@ detach_from_area(Area *a, Frame *f) { destroy_area(a); else if(!a->frame && v->area->frame) { /* focus floating area if it contains something */ - v->sel = v->area; + focus(v->area->sel->client, False); write_event("FocusFloating\n"); } arrange_view(v); @@ -299,11 +300,11 @@ detach_from_area(Area *a, Frame *f) { if(cl && cl->frame) { a = cl->sel->area; if(a->view == v) - v->sel = a; + focus(a->sel->client, False); } } else if(v->area->next->frame) - v->sel = v->area->next; /* focus first col as fallback */ + focus(v->area->next->sel->client, False); /* focus first col as fallback */ i = 0; for(ta=v->area; ta && ta != v->sel; ta=ta->next) i++; @@ -323,7 +324,7 @@ select_area(Area *a, char *arg) { v = a->view; f = a->sel; if(!strncmp(arg, "toggle", 7)) { - if(a != v->area) + if(!a->floating) new = v->area; else if(v->revert) new = v->revert; diff --git a/client.c b/client.c @@ -614,11 +614,9 @@ send_client(Frame *f, char *arg) { }else return Ebadvalue; flush_masked_events(EnterWindowMask); + if(f->view == screen->sel) + focus(f->client, True); update_views(); - if(f->view == screen->sel) { - focus_client(f->client, False); - focus_view(screen, f->view); - } return nil; } diff --git a/frame.c b/frame.c @@ -44,21 +44,34 @@ remove_frame(Frame *f) { for(ft = &a->frame; *ft; ft=&(*ft)->anext) if(*ft == f) break; *ft = f->anext; + + if(a->floating) { + for(ft = &a->stack; *ft; ft=&(*ft)->snext) + if(*ft == f) break; + *ft = f->snext; + } } void insert_frame(Frame *pos, Frame *f, Bool before) { + Frame *ft, **p; Area *a = f->area; if(before) { - Frame *ft; for(ft=a->frame; ft; ft=ft->anext) if(ft->anext == pos) break; pos=ft; } - Frame **p = pos ? &pos->anext : &a->frame; + p = &a->frame; + if(pos) + p = &pos->anext; f->anext = *p; *p = f; + + if(a->floating) { + f->snext = a->stack; + a->stack = f; + } } void @@ -90,11 +103,11 @@ frame_to_top(Frame *f) { a = f->area; if(!a->floating) return; - for(tf=&a->frame; *tf; tf=&(*tf)->anext) + for(tf=&a->stack; *tf; tf=&(*tf)->snext) if(*tf == f) break; - *tf = f->anext; - f->anext = a->frame; - a->frame = f; + *tf = f->snext; + f->snext = a->stack; + a->stack = f; } void diff --git a/view.c b/view.c @@ -183,14 +183,14 @@ restack_view(View *v) { } wins[0] = screen->barwin; - for(a=v->area; a; a=a->next) { + for(f=v->area->stack; f; f=f->snext) + wins[n++] = f->client->framewin;; + for(a=v->area->next; a; a=a->next) { if(a->frame) { wins[n++] = a->sel->client->framewin; - for(f=a->frame; f; f=f->anext) { - Client *c = f->client; + for(f=a->frame; f; f=f->anext) if(f != a->sel) - wins[n++] = c->framewin; - } + wins[n++] = f->client->framewin;; } } if(n) diff --git a/wmii.h b/wmii.h @@ -106,6 +106,7 @@ struct View { struct Area { Area *next; Frame *frame; + Frame *stack; Frame *sel; View *view; Bool floating; @@ -117,6 +118,7 @@ struct Area { struct Frame { Frame *cnext; Frame *anext; + Frame *snext; View *view; Area *area; unsigned short id;