X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Fgrouppholder.c;h=052f67725941761d643e4f2d1a286054146f607c;hp=afd8ac675f54808d674b3b2f59bf9de22bca7c51;hb=HEAD;hpb=f869221ce49f0fb7cca48eee28daff8684305963 diff --git a/ioncore/grouppholder.c b/ioncore/grouppholder.c index afd8ac6..052f677 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-2009. * * 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; } @@ -216,7 +227,7 @@ static WRegion *grouppholder_attach_recreate(WGroupPHolder *ph, int flags, { WRegionAttachData data2; WPHolder *root, *rph; - WGroup *grp; + WRegion *res; RP rp; rp.ph_head=get_head(ph); @@ -236,16 +247,17 @@ static WRegion *grouppholder_attach_recreate(WGroupPHolder *ph, int flags, data2.u.n.fn=recreate_handler; data2.u.n.param=&rp; - grp=(WGroup*)pholder_do_attach(rph, flags, &data2); + res=pholder_do_attach(rph, flags, &data2); - if(grp!=NULL){ - assert(OBJ_IS(grp, WGroup)); + if(res!=NULL){ rp.ph_head->recreate_pholder=NULL; /* It might be in use in attach chain! So defer. */ mainloop_defer_destroy((Obj*)rph); } - return rp.reg_ret; + return (flags&PHOLDER_ATTACH_RETURN_CREATEROOT + ? (WRegion*)res + : rp.reg_ret); } @@ -274,18 +286,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)); }