Esempio n. 1
0
inline
T clamp(T x, T lb, T ub)
{
	return clamp_down(clamp_up(x, ub), lb);

	return x;
}
Esempio n. 2
0
static void moveresmode_delta(WMoveresMode *mode,
                              int dx1, int dx2, int dy1, int dy2,
                              WRectangle *rret)
{
    int realdx1, realdx2, realdy1, realdy2;
    WRQGeomParams rq=RQGEOMPARAMS_INIT;
    int er=ioncore_edge_resistance;
    int w=0, h=0;

    realdx1=(mode->dx1+=dx1);
    realdx2=(mode->dx2+=dx2);
    realdy1=(mode->dy1+=dy1);
    realdy2=(mode->dy2+=dy2);
    rq.geom=mode->origgeom;

    /* snap */
    if(mode->snap_enabled){
        WRectangle *sg=&mode->snapgeom;

        if(mode->dx1!=0 && rq.geom.x+mode->dx1<sg->x && rq.geom.x+mode->dx1>sg->x-er)
            realdx1=sg->x-rq.geom.x;
        if(mode->dx2!=0 && rq.geom.x+rq.geom.w+mode->dx2>sg->x+sg->w && rq.geom.x+rq.geom.w+mode->dx2<sg->x+sg->w+er)
            realdx2=sg->x+sg->w-rq.geom.x-rq.geom.w;
        if(mode->dy1!=0 && rq.geom.y+mode->dy1<sg->y && rq.geom.y+mode->dy1>sg->y-er)
            realdy1=sg->y-rq.geom.y;
        if(mode->dy2!=0 && rq.geom.y+rq.geom.h+mode->dy2>sg->y+sg->h && rq.geom.y+rq.geom.h+mode->dy2<sg->y+sg->h+er)
            realdy2=sg->y+sg->h-rq.geom.y-rq.geom.h;
    }

    w=MAXOF(1, mode->origgeom.w-realdx1+realdx2);
    h=MAXOF(1, mode->origgeom.h-realdy1+realdy2);

    if(mode->snap_enabled && mode->hints.base_set){
        w=clamp_up(w, mode->hints.base_width-er, mode->hints.base_width);
        h=clamp_up(h, mode->hints.base_height-er, mode->hints.base_height);
    }

    /* Correct size */
    sizehints_correct(&mode->hints, &w, &h, TRUE, TRUE);

    /* Do not modify coordinates and sizes that were not requested to be
     * changed.
     */

    if(mode->dx1==mode->dx2){
        if(mode->dx1==0 || realdx1!=mode->dx1)
            rq.geom.x+=realdx1;
        else
            rq.geom.x+=realdx2;
    }else{
        rq.geom.w=w;
        if(mode->dx1==0 || realdx1!=mode->dx1)
            rq.geom.x+=realdx1;
        else
            rq.geom.x+=mode->origgeom.w-rq.geom.w;
    }


    if(mode->dy1==mode->dy2){
        if(mode->dy1==0 || realdy1!=mode->dy1)
            rq.geom.y+=realdy1;
        else
            rq.geom.y+=realdy2;
    }else{
        rq.geom.h=h;
        if(mode->dy1==0 || realdy1!=mode->dy1)
            rq.geom.y+=realdy1;
        else
            rq.geom.y+=mode->origgeom.h-rq.geom.h;
    }

    moveresmode_do_newgeom(mode, &rq);

    if(!mode->resize_cumulative)
        moveresmode_setorig(mode);

    if(rret!=NULL)
        *rret=mode->geom;
}