X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Fmplexpholder.c;h=2c8461eeade2e9d93d001d973b159ee9ec81e521;hp=712cfba7304fc0e6cd5a28bd5b7f8d858841e566;hb=HEAD;hpb=d851e7d55f99040bdfb6b5e1b799b7d6adad22b2 diff --git a/ioncore/mplexpholder.c b/ioncore/mplexpholder.c index 712cfba..2c8461e 100644 --- a/ioncore/mplexpholder.c +++ b/ioncore/mplexpholder.c @@ -1,7 +1,7 @@ /* * ion/ioncore/mplexpholder.c * - * Copyright (c) Tuomo Valkonen 2005-2008. + * Copyright (c) Tuomo Valkonen 2005-2009. * * See the included file LICENSE for details. */ @@ -84,17 +84,21 @@ void mplexpholder_do_unlink(WMPlexPHolder *ph, WMPlex *mplex) UNLINK_ITEM(ph->after->phs, ph, next, prev); }else if(mplex!=NULL && on_ph_list(mplex->misc_phs, ph)){ UNLINK_ITEM(mplex->misc_phs, ph, next, prev); - }else{ + }else if(ph->prev!=NULL){ WMPlexPHolder *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->after=NULL; @@ -260,7 +264,7 @@ static WRegion *mplexpholder_attach_recreate(WMPlexPHolder *ph, int flags, WRegionAttachData data2; WFramedPHolder *fph; WPHolder *root; - WRegion *frame; + WRegion *res; RP rp; rp.ph_head=get_head(ph); @@ -281,15 +285,17 @@ static WRegion *mplexpholder_attach_recreate(WMPlexPHolder *ph, int flags, data2.u.n.fn=recreate_handler; data2.u.n.param=&rp; - frame=pholder_do_attach(fph->cont, flags, &data2); + res=pholder_do_attach(fph->cont, flags, &data2); - if(frame!=NULL){ + if(res!=NULL){ rp.ph_head->recreate_pholder=NULL; /* It might be in use in attach chain! So defer. */ mainloop_defer_destroy((Obj*)fph); } - return rp.reg_ret; + return (flags&PHOLDER_ATTACH_RETURN_CREATEROOT + ? (WRegion*)res + : rp.reg_ret); }