X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Fresize.c;h=ec94cdade243f3bcfe8c9844741fb29fa7ab3bb3;hp=33bfde01ada0f8f0fbb7f5a3ac833d49a56da9b6;hb=de22e45179cb3bafa490294d31d47f361047a30a;hpb=803afbc1cd633f6c025bcd9537e9b7e9aedadd0d diff --git a/ioncore/resize.c b/ioncore/resize.c index 33bfde0..ec94cda 100644 --- a/ioncore/resize.c +++ b/ioncore/resize.c @@ -317,6 +317,33 @@ WMoveresMode *region_begin_move(WRegion *reg, WDrawRubberbandFn *rubfn, } +static void moveresmode_setorig(WMoveresMode *mode) +{ + mode->dx1=0; + mode->dx2=0; + mode->dy1=0; + mode->dy2=0; + mode->origgeom=mode->geom; +} + + +static void moveresmode_do_newgeom(WMoveresMode *mode, WRQGeomParams *rq) +{ + if(XOR_RESIZE) + moveres_draw_rubberband(mode); + + if(mode->reg!=NULL){ + rq->flags|=mode->rqflags; + region_rqgeom(mode->reg, rq, &mode->geom); + } + + moveres_draw_infowin(mode); + + if(XOR_RESIZE) + moveres_draw_rubberband(mode); +} + + static void moveresmode_delta(WMoveresMode *mode, int dx1, int dx2, int dy1, int dy2, WRectangle *rret) @@ -387,26 +414,10 @@ static void moveresmode_delta(WMoveresMode *mode, rq.geom.y+=mode->origgeom.h-rq.geom.h; } - if(XOR_RESIZE) - moveres_draw_rubberband(mode); + moveresmode_do_newgeom(mode, &rq); - if(mode->reg!=NULL){ - rq.flags=mode->rqflags; - region_rqgeom(mode->reg, &rq, &mode->geom); - } - - if(!mode->resize_cumulative){ - mode->dx1=0; - mode->dx2=0; - mode->dy1=0; - mode->dy2=0; - mode->origgeom=mode->geom; - } - - moveres_draw_infowin(mode); - - if(XOR_RESIZE) - moveres_draw_rubberband(mode); + if(!mode->resize_cumulative) + moveresmode_setorig(mode); if(rret!=NULL) *rret=mode->geom; @@ -430,6 +441,15 @@ void moveresmode_delta_move(WMoveresMode *mode, } +void moveresmode_rqgeom(WMoveresMode *mode, WRQGeomParams *rq, + WRectangle *rret) +{ + mode->mode=MOVERES_SIZE; + moveresmode_do_newgeom(mode, rq); + moveresmode_setorig(mode); +} + + /* It is ugly to do this here, but it will have to do for now... */ static void set_saved(WMoveresMode *mode, WRegion *reg) { @@ -478,7 +498,7 @@ bool moveresmode_do_end(WMoveresMode *mode, bool apply) set_saved(mode, reg); if(mode->infowin!=NULL){ - region_dispose((WRegion*)mode->infowin, FALSE); + mainloop_defer_destroy((Obj*)mode->infowin); mode->infowin=NULL; } destroy_obj((Obj*)mode); @@ -520,6 +540,26 @@ void region_rqgeom(WRegion *reg, const WRQGeomParams *rq, } +void rqgeomparams_from_table(WRQGeomParams *rq, + const WRectangle *origg, ExtlTab g) +{ + rq->geom=*origg; + rq->flags=REGION_RQGEOM_WEAK_ALL; + + if(extl_table_gets_i(g, "x", &(rq->geom.x))) + rq->flags&=~REGION_RQGEOM_WEAK_X; + if(extl_table_gets_i(g, "y", &(rq->geom.y))) + rq->flags&=~REGION_RQGEOM_WEAK_Y; + if(extl_table_gets_i(g, "w", &(rq->geom.w))) + rq->flags&=~REGION_RQGEOM_WEAK_W; + if(extl_table_gets_i(g, "h", &(rq->geom.h))) + rq->flags&=~REGION_RQGEOM_WEAK_H; + + rq->geom.w=maxof(1, rq->geom.w); + rq->geom.h=maxof(1, rq->geom.h); +} + + /*EXTL_DOC * Attempt to resize and/or move \var{reg}. The table \var{g} is a usual * geometry specification (fields \var{x}, \var{y}, \var{w} and \var{h}), @@ -529,29 +569,14 @@ void region_rqgeom(WRegion *reg, const WRQGeomParams *rq, EXTL_EXPORT_AS(WRegion, rqgeom) ExtlTab region_rqgeom_extl(WRegion *reg, ExtlTab g) { - WRectangle ogeom=REGION_GEOM(reg); WRQGeomParams rq=RQGEOMPARAMS_INIT; + WRectangle res; + rqgeomparams_from_table(&rq, ®ION_GEOM(reg), g); - rq.geom=ogeom; - rq.flags=REGION_RQGEOM_WEAK_ALL; - - - if(extl_table_gets_i(g, "x", &(rq.geom.x))) - rq.flags&=~REGION_RQGEOM_WEAK_X; - if(extl_table_gets_i(g, "y", &(rq.geom.y))) - rq.flags&=~REGION_RQGEOM_WEAK_Y; - if(extl_table_gets_i(g, "w", &(rq.geom.w))) - rq.flags&=~REGION_RQGEOM_WEAK_W; - if(extl_table_gets_i(g, "h", &(rq.geom.h))) - rq.flags&=~REGION_RQGEOM_WEAK_H; - - rq.geom.w=maxof(1, rq.geom.w); - rq.geom.h=maxof(1, rq.geom.h); - - region_rqgeom(reg, &rq, &ogeom); + region_rqgeom(reg, &rq, &res); - return extl_table_from_rectangle(&ogeom); + return extl_table_from_rectangle(&res); }