X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=ioncore%2Fframedpholder.c;h=de437a23c6921ae10cbd132f93697f7f0691ffc4;hb=ae4260bb64817c11f9a7140324cd3e3ba113e297;hp=43375f2d2a51cb1f7c2a3c770999e426653b602c;hpb=8366314611bf30a0f31d25bf5f5023186fa87692;p=ion3.git diff --git a/ioncore/framedpholder.c b/ioncore/framedpholder.c index 43375f2..de437a2 100644 --- a/ioncore/framedpholder.c +++ b/ioncore/framedpholder.c @@ -1,12 +1,9 @@ /* * ion/ioncore/framedpholder.c * - * Copyright (c) Tuomo Valkonen 2005-2006. + * Copyright (c) Tuomo Valkonen 2005-2007. * - * 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 @@ -65,37 +62,13 @@ typedef struct{ } AP; -WRegion *framed_handler(WWindow *par, - const WFitParams *fp, - void *ap_) +void frame_adjust_to_initial(WFrame *frame, const WFitParams *fp, + const WFramedParam *param, WRegion *reg) { - AP *ap=(AP*)ap_; - WMPlexAttachParams mp=MPLEXATTACHPARAMS_INIT; - WFramedParam *param=ap->param; WRectangle rqg, mg; - WFrame *frame; - WRegion *reg; - - if(param->mkframe!=NULL) - frame=(WFrame*)(param->mkframe)(par, fp); - else - frame=create_frame(par, fp, FRAME_MODE_FLOATING); - - if(frame==NULL) - return NULL; - - if(fp->mode&(REGION_FIT_BOUNDS|REGION_FIT_WHATEVER)) - mp.flags|=MPLEX_ATTACH_WHATEVER; - - reg=mplex_do_attach(&frame->mplex, &mp, ap->data); - - if(reg==NULL){ - destroy_obj((Obj*)frame); - return NULL; - } - + if(!(fp->mode&(REGION_FIT_BOUNDS|REGION_FIT_WHATEVER))) - return (WRegion*)frame; + return; mplex_managed_geom((WMPlex*)frame, &mg); @@ -111,9 +84,9 @@ WRegion *framed_handler(WWindow *par, int bt=mg.y; int bb=REGION_GEOM(frame).h-(mg.y+mg.h); - rqg.x=(fp->g.x+param->inner_geom.x+ + rqg.x=(/*fp->g.x+*/param->inner_geom.x+ xgravity_deltax(param->gravity, bl, br)); - rqg.y=(fp->g.y+param->inner_geom.y+ + rqg.y=(/*fp->g.y+*/param->inner_geom.y+ xgravity_deltay(param->gravity, bt, bb)); rqg.w=maxof(1, param->inner_geom.w+(REGION_GEOM(frame).w-mg.w)); rqg.h=maxof(1, param->inner_geom.h+(REGION_GEOM(frame).h-mg.h)); @@ -123,6 +96,35 @@ WRegion *framed_handler(WWindow *par, rectangle_constrain(&rqg, &fp->g); region_fit((WRegion*)frame, &rqg, REGION_FIT_EXACT); +} + + +WRegion *framed_handler(WWindow *par, + const WFitParams *fp, + void *ap_) +{ + AP *ap=(AP*)ap_; + WMPlexAttachParams mp=MPLEXATTACHPARAMS_INIT; + WFramedParam *param=ap->param; + WFrame *frame; + WRegion *reg; + + frame=create_frame(par, fp, param->mode); + + if(frame==NULL) + return NULL; + + if(fp->mode&(REGION_FIT_BOUNDS|REGION_FIT_WHATEVER)) + mp.flags|=MPLEX_ATTACH_WHATEVER; + + reg=mplex_do_attach(&frame->mplex, &mp, ap->data); + + if(reg==NULL){ + destroy_obj((Obj*)frame); + return NULL; + } + + frame_adjust_to_initial(frame, fp, param, reg); return (WRegion*)frame; } @@ -162,7 +164,7 @@ WRegion *framedpholder_do_attach(WFramedPHolder *ph, int flags, ap.data=data; ap.param=&ph->param; - return pholder_attach_(ph->cont, flags, &data2); + return pholder_do_attach(ph->cont, flags, &data2); } @@ -174,19 +176,32 @@ WRegion *framedpholder_do_attach(WFramedPHolder *ph, int flags, bool framedpholder_do_goto(WFramedPHolder *ph) { - if(ph->cont!=NULL) - return pholder_goto(ph->cont); - - return FALSE; + return (ph->cont!=NULL + ? pholder_goto(ph->cont) + : FALSE); } WRegion *framedpholder_do_target(WFramedPHolder *ph) { - if(ph->cont!=NULL) - return pholder_target(ph->cont); + return (ph->cont!=NULL + ? pholder_target(ph->cont) + : NULL); +} + + +WPHolder *framedpholder_do_root(WFramedPHolder *ph) +{ + WPHolder *root; + + if(ph->cont==NULL) + return NULL; + + root=pholder_root(ph->cont); - return NULL; + return (root!=ph->cont + ? root + : &ph->ph); } @@ -205,6 +220,9 @@ static DynFunTab framedpholder_dynfuntab[]={ {(DynFun*)pholder_do_target, (DynFun*)framedpholder_do_target}, + + {(DynFun*)pholder_do_root, + (DynFun*)framedpholder_do_root}, END_DYNFUNTAB };