void float_detach(Frame *f) { Frame *pr; Area *a, *sel, *oldsel; View *v; v = f->view; a = f->area; sel = view_findarea(v, v->selscreen, v->selcol, false); oldsel = v->oldsel; pr = f->aprev; frame_remove(f); if(a->sel == f) { while(pr && pr->client->nofocus) pr = pr->aprev; if(!pr) for(pr=a->frame; pr && pr->anext; pr=pr->anext) if(!pr->client->nofocus) break; a->sel = nil; area_setsel(a, pr); } f->area = nil; if(oldsel) area_focus(oldsel); else if(!a->frame || pr && pr->client->nofocus) if(sel && sel->frame) area_focus(sel); }
void column_insert(Area *a, Frame *f, Frame *pos) { f->area = a; f->client->floating = false; f->screen = a->screen; f->column = area_idx(a); frame_insert(f, pos); if(a->sel == nil) area_setsel(a, f); }
void float_attach(Area *a, Frame *f) { if(f->client->floating == Off) f->client->floating = On; f->r = f->floatr; float_placeframe(f); assert(a->sel != f); frame_insert(f, a->sel); if(a->sel == nil) area_setsel(a, f); }
void column_arrange(Area *a, bool dirty) { Frame *f; View *v; if(a->floating) float_arrange(a); if(a->floating || !a->frame) return; v = a->view; switch(a->mode) { case Coldefault: if(dirty) for(f=a->frame; f; f=f->anext) f->colr = Rect(0, 0, 100, 100); break; case Colstack: /* XXX */ for(f=a->frame; f; f=f->anext) f->collapsed = (f != a->sel); break; default: fprint(2, "Dieing: %s: screen: %d a: %p mode: %x floating: %d\n", v->name, a->screen, a, a->mode, a->floating); die("not reached"); break; } column_scale(a); /* XXX */ if(a->sel->collapsed) area_setsel(a, a->sel); if(v == selview) { //view_restack(v); client_resize(a->sel->client, a->sel->r); for(f=a->frame; f; f=f->anext) client_resize(f->client, f->r); } }
void column_remove(Frame *f) { Frame *pr; Area *a; a = f->area; pr = f->aprev; frame_remove(f); f->area = nil; if(a->sel == f) { if(pr == nil) pr = a->frame; if(pr && pr->collapsed) if(pr->anext && !pr->anext->collapsed) pr = pr->anext; else pr->collapsed = false; a->sel = nil; area_setsel(a, pr); } }