X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=ioncore%2Fgrouppholder.c;h=2d941e4166bf15d08cd8438b055ec2a5f9f1e31b;hb=3102bb90c325d9b29ac304d8f3ea0a17df564fc8;hp=afd8ac675f54808d674b3b2f59bf9de22bca7c51;hpb=3a5221140c3d59e7e964f9766f490e688a41ef4c;p=ion3.git diff --git a/ioncore/grouppholder.c b/ioncore/grouppholder.c index afd8ac6..2d941e4 100644 --- a/ioncore/grouppholder.c +++ b/ioncore/grouppholder.c @@ -1,7 +1,7 @@ /* * ion/ioncore/grouppholder.c * - * Copyright (c) Tuomo Valkonen 2005-2007. + * Copyright (c) Tuomo Valkonen 2005-2008. * * See the included file LICENSE for details. */ @@ -72,17 +72,21 @@ void grouppholder_do_unlink(WGroupPHolder *ph) if(group!=NULL){ UNLINK_ITEM(group->phs, ph, next, prev); - }else{ + }else if(ph->prev!=NULL){ WGroupPHolder *next=ph->next; - if(ph->prev!=NULL) - ph->prev->next=next; + ph->prev->next=next; if(next==NULL){ next=get_head(ph); assert(next->prev==ph); } next->prev=ph->prev; + }else{ + /* ph should not be on a list, if prev pointer is NULL (whereas + * next alone can be NULL in our semi-doubly-linked lists). + */ + assert(ph->next==NULL); } ph->group=NULL; @@ -193,9 +197,13 @@ static WRegion *recreate_handler(WWindow *par, if(grp==NULL) return NULL; + + rp->ph->param.whatever=(fp->mode®ION_FIT_WHATEVER ? 1 : 0); rp->reg_ret=group_do_attach(grp, &rp->ph->param, rp->data); + rp->ph->param.whatever=0; + if(rp->reg_ret==NULL){ destroy_obj((Obj*)grp); return NULL; @@ -206,6 +214,9 @@ static WRegion *recreate_handler(WWindow *par, phtmp->group=grp; } + if(fp->mode®ION_FIT_WHATEVER) + REGION_GEOM(grp)=REGION_GEOM(rp->reg_ret); + return (WRegion*)grp; } @@ -274,18 +285,21 @@ WRegion *grouppholder_do_attach(WGroupPHolder *ph, int flags, bool grouppholder_do_goto(WGroupPHolder *ph) { - WGroup *ws=ph->group; - - if(ws!=NULL) - return region_goto((WRegion*)ws); - - return FALSE; + return (ph->group!=NULL + ? region_goto((WRegion*)ph->group) + : (ph->recreate_pholder!=NULL + ? pholder_do_goto(ph->recreate_pholder) + : FALSE)); } WRegion *grouppholder_do_target(WGroupPHolder *ph) { - return (WRegion*)ph->group; + return (ph->group!=NULL + ? (WRegion*)ph->group + : (ph->recreate_pholder!=NULL + ? pholder_do_target(ph->recreate_pholder) + : NULL)); }