inline T clamp(T x, T lb, T ub) { return clamp_down(clamp_up(x, ub), lb); return x; }
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; }