X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=ioncore%2Fresize.c;h=3608ecb88f17e693538a0c5739ec74df55307235;hb=0c733f17d41080cd8240eecc5251d08a1776cdc5;hp=33bfde01ada0f8f0fbb7f5a3ac833d49a56da9b6;hpb=471a5e5f9928e2d324b2e10422a420f458bd63ff;p=ion3.git diff --git a/ioncore/resize.c b/ioncore/resize.c index 33bfde0..3608ecb 100644 --- a/ioncore/resize.c +++ b/ioncore/resize.c @@ -1,12 +1,9 @@ /* * ion/ioncore/resize.c * - * Copyright (c) Tuomo Valkonen 1999-2007. + * Copyright (c) Tuomo Valkonen 1999-2009. * - * Ion is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. + * See the included file LICENSE for details. */ #include @@ -33,6 +30,9 @@ #define XOR_RESIZE (!ioncore_g.opaque_resize) +extern int ioncore_edge_resistance; + + /*{{{ Size/position display and rubberband */ @@ -142,14 +142,14 @@ static void moveres_draw_infowin(WMoveresMode *mode) w=mode->geom.w; h=mode->geom.h; - if((mode->hints.inc_set) && - (mode->hints.width_inc>1 || mode->hints.height_inc>1)){ - if(mode->hints.base_set){ - w-=mode->hints.base_width; - h-=mode->hints.base_height; - } - w/=mode->hints.width_inc; - h/=mode->hints.height_inc; + if(mode->hints.base_set){ + w=maxof(0, w-mode->hints.base_width); + h=maxof(0, h-mode->hints.base_height); + } + + if(mode->hints.inc_set){ + w/=maxof(1, mode->hints.width_inc); + h/=maxof(1, mode->hints.height_inc); } snprintf(buf, INFOWIN_BUFFER_LEN, "%dx%d", w, h); @@ -252,10 +252,9 @@ static bool moveresmode_init(WMoveresMode *mode, WRegion *reg, if(mgr==(WRegion*)parent){ mode->snapgeom.x=0; mode->snapgeom.y=0; - mode->snap_enabled=FALSE; - }else if(REGION_PARENT(mgr)==parent){ - mode->snap_enabled=TRUE; + /*mode->snap_enabled=FALSE;*/ } + mode->snap_enabled=TRUE; } if(!mode->hints.min_set || mode->hints.min_width<1) @@ -317,12 +316,46 @@ 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 int clamp_up(int t, int low, int high) +{ + return (t < high && t > low ? high : t); +} + + 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); @@ -334,7 +367,6 @@ static void moveresmode_delta(WMoveresMode *mode, /* snap */ if(mode->snap_enabled){ WRectangle *sg=&mode->snapgeom; - int er=CF_EDGE_RESISTANCE; if(mode->dx1!=0 && rq.geom.x+mode->dx1x && rq.geom.x+mode->dx1>sg->x-er) realdx1=sg->x-rq.geom.x; @@ -346,14 +378,15 @@ static void moveresmode_delta(WMoveresMode *mode, realdy2=sg->y+sg->h-rq.geom.y-rq.geom.h; } - w=mode->origgeom.w-realdx1+realdx2; - h=mode->origgeom.h-realdy1+realdy2; - - if(w<=0) - w=mode->hints.min_width; - if(h<=0) - h=mode->hints.min_height; + 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 @@ -387,26 +420,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 +447,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 +504,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 +546,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 +575,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); } @@ -725,9 +756,11 @@ void frame_maximize_vert(WFrame *frame) int oy, oh; if(frame->flags&FRAME_SHADED || frame->flags&FRAME_MAXED_VERT){ + if(frame->flags&FRAME_SHADED) + frame->flags|=FRAME_SHADED_TOGGLE; if(frame->flags&FRAME_SAVED_VERT) rqh(frame, frame->saved_y, frame->saved_h); - frame->flags&=~(FRAME_MAXED_VERT|FRAME_SAVED_VERT); + frame->flags&=~(FRAME_MAXED_VERT|FRAME_SAVED_VERT|FRAME_SHADED_TOGGLE); return; }