+static WPHolder *get_recreate_ph(WGroupPHolder *ph)
+{
+ return get_head(ph)->recreate_pholder;
+}
+
+
+typedef struct{
+ WGroupPHolder *ph, *ph_head;
+ WRegionAttachData *data;
+ WRegion *reg_ret;
+} RP;
+
+
+static WRegion *recreate_handler(WWindow *par,
+ const WFitParams *fp,
+ void *rp_)
+{
+ WGroupPHolder *phtmp;
+ RP *rp=(RP*)rp_;
+ WGroup *grp;
+
+ grp=(WGroup*)create_groupcw(par, fp);
+
+ 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;
+ }else{
+ grp->phs=rp->ph_head;
+
+ for(phtmp=grp->phs; phtmp!=NULL; phtmp=phtmp->next)
+ phtmp->group=grp;
+ }
+
+ if(fp->mode®ION_FIT_WHATEVER)
+ REGION_GEOM(grp)=REGION_GEOM(rp->reg_ret);
+
+ return (WRegion*)grp;
+}
+
+
+
+static WRegion *grouppholder_attach_recreate(WGroupPHolder *ph, int flags,
+ WRegionAttachData *data)
+{
+ WRegionAttachData data2;
+ WPHolder *root, *rph;
+ WGroup *grp;
+ RP rp;
+
+ rp.ph_head=get_head(ph);
+
+ assert(rp.ph_head!=NULL);
+
+ rph=rp.ph_head->recreate_pholder;
+
+ if(rph==NULL)
+ return NULL;
+
+ rp.ph=ph;
+ rp.data=data;
+ rp.reg_ret=NULL;
+
+ data2.type=REGION_ATTACH_NEW;
+ data2.u.n.fn=recreate_handler;
+ data2.u.n.param=&rp;
+
+ grp=(WGroup*)pholder_do_attach(rph, flags, &data2);
+
+ if(grp!=NULL){
+ assert(OBJ_IS(grp, WGroup));
+ 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;
+}
+
+