static void FreePerp(struct canvas *pcv) { struct canvas *cv; if (!pcv->c_slperp) return; cv = pcv->c_slperp; cv->c_slprev = pcv->c_slprev; if (cv->c_slprev) cv->c_slprev->c_slnext = cv; cv->c_slback = pcv->c_slback; if (cv->c_slback && cv->c_slback->c_slperp == pcv) cv->c_slback->c_slperp = cv; cv->c_slorient = pcv->c_slorient; cv->c_slweight = pcv->c_slweight; while (cv->c_slnext) { cv = cv->c_slnext; cv->c_slorient = pcv->c_slorient; cv->c_slback = pcv->c_slback; cv->c_slweight = pcv->c_slweight; } cv->c_slnext = pcv->c_slnext; if (cv->c_slnext) cv->c_slnext->c_slprev = cv; LayerCleanupMemory(&pcv->c_blank); free(pcv); }
void FreeCanvas(struct canvas *cv) { struct viewport *vp, *nvp; struct canvas **cvp; struct win *p; if (cv->c_slprev) cv->c_slprev->c_slnext = cv->c_slnext; if (cv->c_slnext) cv->c_slnext->c_slprev = cv->c_slprev; if (cv->c_slback && cv->c_slback->c_slperp == cv) cv->c_slback->c_slperp = cv->c_slnext ? cv->c_slnext : cv->c_slprev; if (cv->c_slperp) { while (cv->c_slperp) FreeCanvas(cv->c_slperp); LayerCleanupMemory(&cv->c_blank); free(cv); return; } if (display) { if (D_forecv == cv) D_forecv = 0; /* remove from canvas chain as SetCanvasWindow might call * some layer function */ for (cvp = &D_cvlist; *cvp; cvp = &(*cvp)->c_next) if (*cvp == cv) { *cvp = cv->c_next; break; } } p = cv->c_layer ? Layer2Window(cv->c_layer) : 0; SetCanvasWindow(cv, 0); if (p) WindowChanged(p, 'u'); if (flayer == cv->c_layer) flayer = 0; for (vp = cv->c_vplist; vp; vp = nvp) { vp->v_canvas = 0; nvp = vp->v_next; vp->v_next = 0; free(vp); } evdeq(&cv->c_captev); LayerCleanupMemory(&cv->c_blank); free(cv); }
void ExitOverlayPage(void) { Layer *oldlay; Window *p; int doredisplay = 0; Canvas *cv, *ocv; Layout *lay; oldlay = flayer; if (oldlay->l_data) { if (oldlay->l_layfn->lf_LayFree) LayFree(oldlay->l_data); free(oldlay->l_data); } p = Layer2Window(flayer); flayer = oldlay->l_next; if (flayer->l_layfn == &WinLf) { if (oldlay->l_blocking) { p->w_blocked--; } /* don't warp dead layers: check cvlist */ if (p->w_blocked && p->w_savelayer && p->w_savelayer != flayer && oldlay->l_cvlist) { /* warp ourself into savelayer */ flayer = p->w_savelayer; doredisplay = 1; } } if (p && p->w_savelayer == oldlay) p->w_savelayer = flayer; if (p && oldlay == p->w_paster.pa_pastelayer) p->w_paster.pa_pastelayer = NULL; for (lay = layouts; lay; lay = lay->lay_next) for (cv = lay->lay_cvlist; cv; cv = cv->c_next) if (cv->c_layer == oldlay) cv->c_layer = flayer; /* add all canvases back into next layer's canvas list */ for (ocv = NULL, cv = oldlay->l_cvlist; cv; cv = cv->c_lnext) { cv->c_layer = flayer; ocv = cv; } if (ocv) { cv = flayer->l_cvlist; ocv->c_lnext = NULL; flayer->l_cvlist = oldlay->l_cvlist; /* redisplay only the warped cvs */ if (doredisplay) LRefreshAll(flayer, 0); ocv->c_lnext = cv; } oldlay->l_cvlist = NULL; LayerCleanupMemory(oldlay); free((char *)oldlay); LayRestore(); LaySetCursor(); }