static void column_squeeze(Area *a) { static Vector_ptr fvec; Frame *f; int surplus, osurplus, dy, i; fvec.n = 0; for(f=a->frame; f; f=f->anext) if(!f->collapsed) { f->r = frame_hints(f, f->r, 0); vector_ppush(&fvec, f); } surplus = column_surplus(a); for(osurplus=0; surplus != osurplus;) { osurplus = surplus; qsort(fvec.ary, fvec.n, sizeof *fvec.ary, comp_frame); for(i=0; i < fvec.n; i++) { f=fvec.ary[i]; dy = foo(f); if(dy > surplus) break; surplus -= dy; f->r.max.y += dy; } } }
Area* area_find(View *v, Rectangle r, int dir, bool wrap) { static Vector_ptr vec; Area *a; int s; vec.n = 0; foreach_column(v, s, a) vector_ppush(&vec, a); return findthing(r, dir, &vec, area_rect, wrap); }