]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/grouppholder.c
Imported Upstream version 20090110
[ion3.git] / ioncore / grouppholder.c
index afd8ac675f54808d674b3b2f59bf9de22bca7c51..052f67725941761d643e4f2d1a286054146f607c 100644 (file)
@@ -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&REGION_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&REGION_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));
 }