+/*{{{ Move, attach */
+
+
+typedef struct{
+ WMPlexPHolder *ph, *ph_head;
+ WRegionAttachData *data;
+ WFramedParam *param;
+ WRegion *reg_ret;
+} RP;
+
+
+static WRegion *recreate_handler(WWindow *par,
+ const WFitParams *fp,
+ void *rp_)
+{
+ RP *rp=(RP*)rp_;
+ WMPlexPHolder *ph=rp->ph, *ph_head=rp->ph_head, *phtmp;
+ WFramedParam *param=rp->param;
+ WFrame *frame;
+
+ frame=create_frame(par, fp, param->mode);
+
+ if(frame==NULL)
+ return NULL;
+
+ /* Move pholders to frame */
+ frame->mplex.misc_phs=ph_head;
+
+ for(phtmp=frame->mplex.misc_phs; phtmp!=NULL; phtmp=phtmp->next)
+ phtmp->mplex=&frame->mplex;
+
+ /* Attach */
+ if(fp->mode&(REGION_FIT_BOUNDS|REGION_FIT_WHATEVER))
+ ph->param.flags|=MPLEX_ATTACH_WHATEVER;
+
+ rp->reg_ret=mplex_do_attach_pholder(&frame->mplex, ph, rp->data);
+
+ ph->param.flags&=~MPLEX_ATTACH_WHATEVER;
+
+ if(rp->reg_ret==NULL){
+ /* Try to recover */
+ for(phtmp=frame->mplex.misc_phs; phtmp!=NULL; phtmp=phtmp->next)
+ phtmp->mplex=NULL;
+
+ frame->mplex.misc_phs=NULL;
+
+ destroy_obj((Obj*)frame);
+
+ return NULL;
+ }else{
+ frame_adjust_to_initial(frame, fp, param, rp->reg_ret);
+
+ return (WRegion*)frame;
+ }
+}
+
+
+static WFramedPHolder *get_recreate_ph(WMPlexPHolder *ph)
+{
+ return get_head(ph)->recreate_pholder;
+}
+
+
+static WRegion *mplexpholder_attach_recreate(WMPlexPHolder *ph, int flags,
+ WRegionAttachData *data)
+{
+ WRegionAttachData data2;
+ WFramedPHolder *fph;
+ WPHolder *root;
+ WRegion *res;
+ RP rp;
+
+ rp.ph_head=get_head(ph);
+
+ assert(rp.ph_head!=NULL);
+
+ fph=rp.ph_head->recreate_pholder;
+
+ if(fph==NULL)
+ return NULL;
+
+ rp.ph=ph;
+ rp.data=data;
+ rp.param=&fph->param;
+ rp.reg_ret=NULL;
+
+ data2.type=REGION_ATTACH_NEW;
+ data2.u.n.fn=recreate_handler;
+ data2.u.n.param=&rp;
+
+ res=pholder_do_attach(fph->cont, flags, &data2);
+
+ 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 (flags&PHOLDER_ATTACH_RETURN_CREATEROOT
+ ? (WRegion*)res
+ : rp.reg_ret);
+}