+/*{{{ Move, attach */
+
+
+typedef struct{
+ WMPlexPHolder *ph, *ph_head;
+ WRegionAttachData *data;
+ WFramedParam *param;
+} RP;
+
+
+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;
+ WRegion *reg;
+
+ frame=create_frame(par, fp, param->mode);
+
+ if(frame==NULL)
+ return NULL;
+
+ /* Move pholders to frame */
+ frame->mplex.mx_phs=ph_head;
+
+ for(phtmp=frame->mplex.mx_phs; phtmp!=NULL; phtmp=phtmp->next)
+ watch_setup(&(phtmp->mplex_watch), (Obj*)frame, mplex_watch_handler);
+
+ /* Attach */
+ if(fp->mode&(REGION_FIT_BOUNDS|REGION_FIT_WHATEVER))
+ ph->param.flags|=MPLEX_ATTACH_WHATEVER;
+
+ reg=mplex_do_attach_pholder(&frame->mplex, ph, rp->data);
+
+ ph->param.flags&=~MPLEX_ATTACH_WHATEVER;
+
+ if(reg==NULL){
+ /* Try to recover */
+ for(phtmp=frame->mplex.mx_phs; phtmp!=NULL; phtmp=phtmp->next)
+ watch_reset(&(phtmp->mplex_watch));
+ frame->mplex.mx_phs=NULL;
+
+ destroy_obj((Obj*)frame);
+
+ return NULL;
+ }else{
+ frame_adjust_to_initial(frame, fp, param, reg);
+
+ return (WRegion*)frame;
+ }
+}
+
+
+static WMPlexPHolder *get_head(WMPlexPHolder *ph)
+{
+ while(1){
+ /* ph->prev==NULL should not happen.. */
+ if(ph->prev==NULL || ph->prev->next==NULL)
+ break;
+ ph=ph->prev;
+ }
+
+ return ph;
+}
+
+
+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 *reg;
+ 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;
+
+ data2.type=REGION_ATTACH_NEW;
+ data2.u.n.fn=recreate_handler;
+ data2.u.n.param=&rp;
+
+ reg=pholder_do_attach(fph->cont, flags, &data2); /* == frame */
+
+ if(reg!=NULL){
+ destroy_obj((Obj*)fph);
+ rp.ph_head->recreate_pholder=NULL;
+ }
+
+ return reg;
+}