X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Fmplexpholder.c;fp=ioncore%2Fmplexpholder.c;h=8bb7ddb1e89ee279d3f99ec0229b68dd3e956d63;hp=c3a57ce5979b178fe5415c2d6f6278d4bdd7609d;hb=a6561c9679cd701b0d50c3cfd44e4664f7df2b2f;hpb=cd09055902de482a1be019bf4b4efdae64c98d35 diff --git a/ioncore/mplexpholder.c b/ioncore/mplexpholder.c index c3a57ce..8bb7ddb 100644 --- a/ioncore/mplexpholder.c +++ b/ioncore/mplexpholder.c @@ -15,6 +15,7 @@ #include "mplexpholder.h" #include "llist.h" #include "framedpholder.h" +#include "basicpholder.h" static void mplex_watch_handler(Watch *watch, Obj *mplex); @@ -102,7 +103,18 @@ static void mplex_watch_handler(Watch *watch, Obj *mplex) } -static WMPlexAttachParams dummy_param={0, 0, {0, 0, 0, 0}, 0, 0}; +static void mplex_get_attach_params(WMPlex *mplex, WStacking *st, + WMPlexAttachParams *param) +{ + param->flags=(MPLEX_ATTACH_SIZEPOLICY| + MPLEX_ATTACH_GEOM| + MPLEX_ATTACH_LEVEL| + (st->hidden ? MPLEX_ATTACH_HIDDEN : 0)| + (st->lnode==NULL ? MPLEX_ATTACH_UNNUMBERED : 0)); + param->szplcy=st->szplcy; + param->geom=REGION_GEOM(st->reg); + param->level=st->level; +} bool mplexpholder_init(WMPlexPHolder *ph, WMPlex *mplex, WStacking *st, @@ -122,25 +134,20 @@ bool mplexpholder_init(WMPlexPHolder *ph, WMPlex *mplex, WStacking *st, return FALSE; } - if(param==NULL) - param=&dummy_param; - if(st!=NULL){ - if(st->lnode!=NULL) + mplex_get_attach_params(mplex, st, &ph->param); + + if(st->lnode!=NULL){ mplexpholder_do_link(ph, mplex, LIST_LAST(st->lnode->phs, next, prev), st->lnode); - else - ph->param.flags|=MPLEX_ATTACH_UNNUMBERED; - - ph->param.flags|=(MPLEX_ATTACH_SIZEPOLICY| - MPLEX_ATTACH_GEOM| - MPLEX_ATTACH_LEVEL| - (st->hidden ? MPLEX_ATTACH_HIDDEN : 0)); - ph->param.szplcy=st->szplcy; - ph->param.geom=REGION_GEOM(st->reg); - ph->param.level=st->level; + } }else{ + static WMPlexAttachParams dummy_param={0, 0, {0, 0, 0, 0}, 0, 0}; + + if(param==NULL) + param=&dummy_param; + ph->param=*param; if(!(param->flags&MPLEX_ATTACH_UNNUMBERED)){ @@ -437,11 +444,51 @@ WMPlexPHolder *mplex_managed_get_pholder(WMPlex *mplex, WRegion *mgd) } -WMPlexPHolder *mplex_get_rescue_pholder_for(WMPlex *mplex, WRegion *mgd) +/*}}}*/ + + +/*{{ Rescue */ + + +WRegion *mplex_rescue_attach(WMPlex *mplex, int flags, WRegionAttachData *data) { + WMPlexAttachParams param; + + param.flags=0; + + /* Improved attach parametrisation hack for WMPlex source */ + if(data->type==REGION_ATTACH_REPARENT){ + WRegion *reg=data->u.reg; + WMPlex *src_mplex=REGION_MANAGER_CHK(reg, WMPlex); + if(src_mplex!=NULL){ + WStacking *st=ioncore_find_stacking(reg); + if(st!=NULL) + mplex_get_attach_params(src_mplex, st, ¶m); + } + } + + param.flags|=(MPLEX_ATTACH_INDEX| + (flags&PHOLDER_ATTACH_SWITCHTO ? MPLEX_ATTACH_SWITCHTO : 0)); + param.index=LLIST_INDEX_LAST; + + return mplex_do_attach(mplex, ¶m, data); +} + + +WPHolder *mplex_get_rescue_pholder_for(WMPlex *mplex, WRegion *mgd) +{ +#if 0 WStacking *st=mplex_find_stacking(mplex, mgd); + WMPlexAttachParams param; + + param.flags=MPLEX_ATTACH_INDEX; + param.index=LLIST_INDEX_LAST; - return create_mplexpholder(mplex, st, NULL); + return create_mplexpholder(mplex, st, ¶m); +#else + return (WPHolder*)create_basicpholder((WRegion*)mplex, + (WBasicPHolderHandler*)mplex_rescue_attach); +#endif }