X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Fgroup-ws.c;fp=ioncore%2Fgroup-ws.c;h=3fd8cb765bd30577781dc8d57a736cf204a663a1;hp=647cef05e451da3f35cbdd6e9782ae85a444dff4;hb=a6561c9679cd701b0d50c3cfd44e4664f7df2b2f;hpb=cd09055902de482a1be019bf4b4efdae64c98d35 diff --git a/ioncore/group-ws.c b/ioncore/group-ws.c index 647cef0..3fd8cb7 100644 --- a/ioncore/group-ws.c +++ b/ioncore/group-ws.c @@ -120,44 +120,26 @@ EXTL_EXPORT_AS(WGroupWS, attach_framed) bool groupws_attach_framed_extl(WGroupWS *ws, WRegion *reg, ExtlTab t) { WGroupAttachParams ap=GROUPATTACHPARAMS_INIT; - WFramedParam fp=FRAMEDPARAM_INIT; - ExtlTab gt; + WFramedParam frp=FRAMEDPARAM_INIT; if(reg==NULL) return FALSE; - fp.gravity=ForgetGravity; - - if(extl_table_is_bool_set(t, "switchto")){ - ap.switchto_set=TRUE; - ap.switchto=TRUE; - } + group_get_attach_params(&ws->grp, t, &ap); - if(extl_table_gets_t(t, "geom", >)){ - int pos=0, size=0; - - fp.inner_geom.x=0; - fp.inner_geom.y=0; - - if(extl_table_gets_i(gt, "x", &(ap.geom.x))) - pos++; - if(extl_table_gets_i(gt, "y", &(ap.geom.y))) - pos++; - - if(extl_table_gets_i(gt, "w", &(ap.geom.w))) - size++; - if(extl_table_gets_i(gt, "h", &(ap.geom.h))) - size++; - - fp.inner_geom.w=maxof(fp.inner_geom.w, 1); - fp.inner_geom.h=maxof(fp.inner_geom.h, 1); + /* Sensible size is given in framedparams */ + if(ap.geom_set){ + ap.geom_set=0; + ap.geom_weak_set=1; + ap.geom_weak=0; - fp.inner_geom_gravity_set=(size==2 && pos==2); - - extl_unref_table(gt); + frp.inner_geom_gravity_set=1; + frp.inner_geom=ap.geom; + frp.gravity=NorthWestGravity; + extl_table_gets_i(t, "gravity", &frp.gravity); } - return groupws_attach_framed(ws, &ap, &fp, reg); + return groupws_attach_framed(ws, &ap, &frp, reg); } @@ -295,6 +277,33 @@ WPHolder *groupws_get_rescue_pholder_for(WGroupWS *ws, } +static bool group_empty_for_bottom_stdisp(WGroup *ws) +{ + WGroupIterTmp tmp; + WStacking *st; + + FOR_ALL_NODES_IN_GROUP(ws, st, tmp){ + if(st!=ws->bottom && st!=ws->managed_stdisp) + return FALSE; + } + + return TRUE; +} + + +static WRegion *groupws_managed_disposeroot(WGroupWS *ws, WRegion *reg) +{ + if(group_bottom(&ws->grp)==reg){ + if(group_empty_for_bottom_stdisp(&ws->grp)){ + WRegion *tmpr=region_disposeroot((WRegion*)ws); + return (tmpr!=NULL ? tmpr : reg); + } + } + + return reg; +} + + /*}}}*/ @@ -348,6 +357,9 @@ static DynFunTab groupws_dynfuntab[]={ {(DynFun*)region_prepare_manage_transient, (DynFun*)groupws_prepare_manage_transient}, + + {(DynFun*)region_managed_disposeroot, + (DynFun*)groupws_managed_disposeroot}, {(DynFun*)region_handle_drop, (DynFun*)groupws_handle_drop},