コード例 #1
0
ファイル: dock.c プロジェクト: dkogan/notion
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);
}
コード例 #2
0
ファイル: sizepolicy.c プロジェクト: Soren-Nordstrom/Ion3
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));
}
コード例 #3
0
ファイル: resize.c プロジェクト: dkogan/notion
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);
}
コード例 #4
0
ファイル: resize.c プロジェクト: dkogan/notion
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);
}
コード例 #5
0
ファイル: sizepolicy.c プロジェクト: Soren-Nordstrom/Ion3
void sizepolicy(WSizePolicy *szplcy, WRegion *reg,
                const WRectangle *rq_geom, int rq_flags,
                WFitParams *fp)
{
    uint extra=fp->mode&REGION_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;
    }
}
コード例 #6
0
ファイル: sizepolicy.c プロジェクト: Soren-Nordstrom/Ion3
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&REGION_RQGEOM_WEAK_W) &&
                (*szplcy&SIZEPOLICY_HORIZ_MASK)==SIZEPOLICY_HORIZ_CENTER);
    bool fullh=((rq_flags&REGION_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&REGION_RQGEOM_WEAK_X) 
       && rq_flags&REGION_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&REGION_RQGEOM_WEAK_Y)
       && rq_flags&REGION_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&REGION_RQGEOM_WEAK_X) 
       && rq_flags&REGION_RQGEOM_WEAK_W){
        fp->g.x=x_;
    }else if(rq_flags&REGION_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&REGION_RQGEOM_WEAK_Y)
       && rq_flags&REGION_RQGEOM_WEAK_H){
        fp->g.y=y_;
    }else if(rq_flags&REGION_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));
}