static void dockapp_calc_preferred_size(WDock *dock, int grow, const WRectangle *tile_size, WDockApp *da) { int w=da->geom.w, h=da->geom.h; if(grow==DOCK_GROW_UP || grow==DOCK_GROW_DOWN){ da->geom.w=MINOF(w, tile_size->w); da->geom.h=h; }else{ da->geom.w=w; da->geom.h=MINOF(h, tile_size->h); } region_size_hints_correct(da->reg, &(da->geom.w), &(da->geom.h), TRUE); }
static void gravity_stretch_policy(int szplcy, WRegion *reg, const WRectangle *rq_geom, WFitParams *fp, bool ws, bool hs) { WRectangle max_geom=fp->g; int w, h; fp->g=*rq_geom; w=(ws ? max_geom.w : minof(rq_geom->w, max_geom.w)); h=(hs ? max_geom.h : minof(rq_geom->h, max_geom.h)); if(reg!=NULL) region_size_hints_correct(reg, &w, &h, FALSE); fp->g.w=w; fp->g.h=h; do_gravity(&max_geom, szplcy, &(fp->g)); }
static bool rqw(WFrame *frame, int x, int w) { WRQGeomParams rq=RQGEOMPARAMS_INIT; WRectangle rgeom; int dummy_h; rq.flags=REGION_RQGEOM_HORIZ_ONLY; rq.geom.x=x; rq.geom.w=w; rq.geom.y=REGION_GEOM(frame).y; rq.geom.h=REGION_GEOM(frame).h; dummy_h=rq.geom.h; region_size_hints_correct((WRegion*)frame, &(rq.geom.w), &dummy_h, TRUE); region_rqgeom((WRegion*)frame, &rq, &rgeom); return (abs(rgeom.x-REGION_GEOM(frame).x)>1 || abs(rgeom.w-REGION_GEOM(frame).w)>1); }
static bool rqh(WFrame *frame, int y, int h) { WRQGeomParams rq=RQGEOMPARAMS_INIT; WRectangle rgeom; int dummy_w; rq.flags=REGION_RQGEOM_VERT_ONLY; rq.geom.x=REGION_GEOM(frame).x; rq.geom.w=REGION_GEOM(frame).w; rq.geom.y=y; rq.geom.h=h; dummy_w=rq.geom.w; region_size_hints_correct((WRegion*)frame, &dummy_w, &(rq.geom.h), TRUE); region_rqgeom((WRegion*)frame, &rq, &rgeom); return (abs(rgeom.y-REGION_GEOM(frame).y)>1 || abs(rgeom.h-REGION_GEOM(frame).h)>1); }
void sizepolicy(WSizePolicy *szplcy, WRegion *reg, const WRectangle *rq_geom, int rq_flags, WFitParams *fp) { uint extra=fp->mode®ION_FIT_ROTATE; WRectangle tmp; if(rq_geom!=NULL) tmp=*rq_geom; else if(reg!=NULL) tmp=REGION_GEOM(reg); else tmp=fp->g; if((*szplcy)&SIZEPOLICY_SHRUNK){ if(reg!=NULL){ tmp.w=region_min_w(reg); tmp.h=region_min_h(reg); }else{ tmp.w=1; tmp.h=1; } rq_flags&=~(REGION_RQGEOM_WEAK_W|REGION_RQGEOM_WEAK_H); } fp->mode=REGION_FIT_EXACT|extra; switch((*szplcy)&SIZEPOLICY_MASK){ case SIZEPOLICY_GRAVITY: gravity_stretch_policy(*szplcy, reg, &tmp, fp, FALSE, FALSE); break; case SIZEPOLICY_STRETCH_LEFT: gravity_stretch_policy(org(*szplcy, SIZEPOLICY_HORIZ_LEFT|SIZEPOLICY_VERT_CENTER), reg, &tmp, fp, FALSE, TRUE); break; case SIZEPOLICY_STRETCH_RIGHT: gravity_stretch_policy(org(*szplcy, SIZEPOLICY_HORIZ_RIGHT|SIZEPOLICY_VERT_CENTER), reg, &tmp, fp, FALSE, TRUE); break; case SIZEPOLICY_STRETCH_TOP: gravity_stretch_policy(org(*szplcy, SIZEPOLICY_VERT_TOP|SIZEPOLICY_HORIZ_CENTER), reg, &tmp, fp, TRUE, FALSE); break; case SIZEPOLICY_STRETCH_BOTTOM: gravity_stretch_policy(org(*szplcy, SIZEPOLICY_VERT_BOTTOM|SIZEPOLICY_HORIZ_CENTER), reg, &tmp, fp, TRUE, FALSE); break; case SIZEPOLICY_FULL_EXACT: gravity_stretch_policy(org(*szplcy, SIZEPOLICY_VERT_CENTER|SIZEPOLICY_HORIZ_CENTER), reg, &tmp, fp, TRUE, TRUE); break; case SIZEPOLICY_FREE: if(reg!=NULL) region_size_hints_correct(reg, &tmp.w, &tmp.h, FALSE); rectangle_constrain(&tmp, &(fp->g)); fp->g=tmp; break; case SIZEPOLICY_VISIBILITY_CONSTRAINED: if(reg!=NULL) region_size_hints_correct(reg, &tmp.w, &tmp.h, FALSE); { /* Constraint such that at least min(size, CF_VISIBILITY_CONSTRAINT) * much is visible at each border. */ int dx=maxof(0, tmp.w-CF_VISIBILITY_CONSTRAINT); int dy=maxof(0, tmp.h-CF_VISIBILITY_CONSTRAINT); tmp.x=maxof(fp->g.x-dx, minof(tmp.x, fp->g.x+fp->g.w+dx-tmp.w)); tmp.y=maxof(fp->g.y-dy, minof(tmp.y, fp->g.y+fp->g.h+dy-tmp.h)); } fp->g=tmp; break; case SIZEPOLICY_UNCONSTRAINED: if(reg!=NULL) region_size_hints_correct(reg, &tmp.w, &tmp.h, TRUE); fp->g=tmp; break; case SIZEPOLICY_FREE_GLUE: sizepolicy_free_snap(szplcy, reg, &tmp, rq_flags, fp); break; case SIZEPOLICY_FULL_BOUNDS: default: fp->mode=REGION_FIT_BOUNDS|extra; break; } }
static void sizepolicy_free_snap(WSizePolicy *szplcy, WRegion *reg, WRectangle *rq_geom, int rq_flags, WFitParams *fp) { WRectangle max_geom=fp->g; bool fullw=((rq_flags®ION_RQGEOM_WEAK_W) && (*szplcy&SIZEPOLICY_HORIZ_MASK)==SIZEPOLICY_HORIZ_CENTER); bool fullh=((rq_flags®ION_RQGEOM_WEAK_H) && (*szplcy&SIZEPOLICY_VERT_MASK)==SIZEPOLICY_VERT_CENTER); int w=(fullw ? max_geom.w : minof(rq_geom->w, max_geom.w)); int h=(fullh ? max_geom.h : minof(rq_geom->h, max_geom.h)); int x_=0, y_=0; if(!(rq_flags®ION_RQGEOM_WEAK_X) && rq_flags®ION_RQGEOM_WEAK_W){ x_=fit_x(rq_geom->x, 1, &max_geom); if(((*szplcy)&SIZEPOLICY_HORIZ_MASK)==SIZEPOLICY_HORIZ_RIGHT) w=max_geom.x+max_geom.w-x_; else w=minof(w, max_geom.x+max_geom.w-x_); } if(!(rq_flags®ION_RQGEOM_WEAK_Y) && rq_flags®ION_RQGEOM_WEAK_H){ y_=fit_x(rq_geom->y, 1, &max_geom); if(((*szplcy)&SIZEPOLICY_VERT_MASK)==SIZEPOLICY_VERT_BOTTOM) h=max_geom.y+max_geom.h-y_; else h=minof(h, max_geom.y+max_geom.h-y_); } if(reg!=NULL) region_size_hints_correct(reg, &w, &h, FALSE); fp->g.w=w; fp->g.h=h; if(!(rq_flags®ION_RQGEOM_WEAK_X) && rq_flags®ION_RQGEOM_WEAK_W){ fp->g.x=x_; }else if(rq_flags®ION_RQGEOM_WEAK_X){ switch((*szplcy)&SIZEPOLICY_HORIZ_MASK){ case SIZEPOLICY_HORIZ_CENTER: fp->g.x=max_geom.x+(max_geom.w-w)/2; break; case SIZEPOLICY_HORIZ_LEFT: fp->g.x=max_geom.x; break; case SIZEPOLICY_HORIZ_RIGHT: fp->g.x=max_geom.x+max_geom.w-w; break; default: fp->g.x=fit_x(rq_geom->x, w, &max_geom); break; } }else{ fp->g.x=fit_x(rq_geom->x, w, &max_geom); } if(!(rq_flags®ION_RQGEOM_WEAK_Y) && rq_flags®ION_RQGEOM_WEAK_H){ fp->g.y=y_; }else if(rq_flags®ION_RQGEOM_WEAK_Y){ switch((*szplcy)&SIZEPOLICY_VERT_MASK){ case SIZEPOLICY_VERT_CENTER: fp->g.y=max_geom.y+(max_geom.h-h)/2; break; case SIZEPOLICY_VERT_TOP: fp->g.y=max_geom.y; break; case SIZEPOLICY_VERT_BOTTOM: fp->g.y=max_geom.y+max_geom.h-h; break; default: fp->g.y=fit_y(rq_geom->y, h, &max_geom); break; } }else{ fp->g.y=fit_y(rq_geom->y, h, &max_geom); } (*szplcy)&=~(SIZEPOLICY_VERT_MASK|SIZEPOLICY_HORIZ_MASK); *szplcy|=( (fullw || fp->g.x<=max_geom.x ? SIZEPOLICY_HORIZ_LEFT : 0) |(fullw || fp->g.x+fp->g.w>=max_geom.x+max_geom.w ? SIZEPOLICY_HORIZ_RIGHT : 0) |(fullh || fp->g.y<=max_geom.y ? SIZEPOLICY_VERT_TOP : 0) |(fullh || fp->g.y+fp->g.h>=max_geom.y+max_geom.h ? SIZEPOLICY_VERT_BOTTOM : 0)); }