/*
* ion/ioncore/sizepolicy.c
*
- * Copyright (c) Tuomo Valkonen 1999-2007.
+ * Copyright (c) Tuomo Valkonen 1999-2009.
*
* See the included file LICENSE for details.
*/
}
+static WSizePolicy org(WSizePolicy base, WSizePolicy g)
+{
+ if((base&SIZEPOLICY_VERT_MASK)==0)
+ base|=g&SIZEPOLICY_VERT_MASK;
+
+ if((base&SIZEPOLICY_HORIZ_MASK)==0)
+ base|=g&SIZEPOLICY_HORIZ_MASK;
+
+ return base;
+}
+
+
void sizepolicy(WSizePolicy *szplcy, WRegion *reg,
const WRectangle *rq_geom, int rq_flags,
WFitParams *fp)
break;
case SIZEPOLICY_STRETCH_LEFT:
- gravity_stretch_policy(SIZEPOLICY_HORIZ_LEFT|SIZEPOLICY_VERT_CENTER,
+ gravity_stretch_policy(org(*szplcy, SIZEPOLICY_HORIZ_LEFT|SIZEPOLICY_VERT_CENTER),
reg, &tmp, fp, FALSE, TRUE);
break;
case SIZEPOLICY_STRETCH_RIGHT:
- gravity_stretch_policy(SIZEPOLICY_HORIZ_RIGHT|SIZEPOLICY_VERT_CENTER,
+ gravity_stretch_policy(org(*szplcy, SIZEPOLICY_HORIZ_RIGHT|SIZEPOLICY_VERT_CENTER),
reg, &tmp, fp, FALSE, TRUE);
break;
case SIZEPOLICY_STRETCH_TOP:
- gravity_stretch_policy(SIZEPOLICY_VERT_TOP|SIZEPOLICY_HORIZ_CENTER,
+ gravity_stretch_policy(org(*szplcy, SIZEPOLICY_VERT_TOP|SIZEPOLICY_HORIZ_CENTER),
reg, &tmp, fp, TRUE, FALSE);
break;
case SIZEPOLICY_STRETCH_BOTTOM:
- gravity_stretch_policy(SIZEPOLICY_VERT_BOTTOM|SIZEPOLICY_HORIZ_CENTER,
+ gravity_stretch_policy(org(*szplcy, SIZEPOLICY_VERT_BOTTOM|SIZEPOLICY_HORIZ_CENTER),
reg, &tmp, fp, TRUE, FALSE);
break;
case SIZEPOLICY_FULL_EXACT:
- gravity_stretch_policy(SIZEPOLICY_VERT_CENTER|SIZEPOLICY_HORIZ_CENTER,
+ 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;
{"free_glue_southwest", SIZEPOLICY_FREE_GLUE__SOUTHWEST},
{"free_glue_south", SIZEPOLICY_FREE_GLUE__SOUTH},
{"free_glue_southeast", SIZEPOLICY_FREE_GLUE__SOUTHEAST},
+ {"visibility_constrained", SIZEPOLICY_VISIBILITY_CONSTRAINED},
+ {"unconstrained", SIZEPOLICY_UNCONSTRAINED},
{ NULL, SIZEPOLICY_DEFAULT} /* end marker */
};