Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #3
0
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();
}