示例#1
0
文件: resize.c 项目: amade/screen
void ResizeLayersToCanvases()
{
    Canvas *cv;
    Layer *l;
    int lx, ly;

    D_kaablamm = 0;
    for (cv = D_cvlist; cv; cv = cv->c_next) {
        l = cv->c_layer;
        if (l == 0)
            continue;
        if (l->l_width == cv->c_xe - cv->c_xs + 1 && l->l_height == cv->c_ye - cv->c_ys + 1) {
            continue;
        }
        if (MayResizeLayer(l)) {
            ResizeLayer(l, cv->c_xe - cv->c_xs + 1, cv->c_ye - cv->c_ys + 1, display);
        }

        /* normalize window, see screen.c */
        lx = cv->c_layer->l_x;
        ly = cv->c_layer->l_y;
        if (ly + cv->c_yoff < cv->c_ys) {
            cv->c_yoff = cv->c_ys - ly;
            RethinkViewportOffsets(cv);
        } else if (ly + cv->c_yoff > cv->c_ye) {
            cv->c_yoff = cv->c_ye - ly;
            RethinkViewportOffsets(cv);
        }
        if (lx + cv->c_xoff < cv->c_xs) {
            int n = cv->c_xs - (lx + cv->c_xoff);
            if (n < (cv->c_xe - cv->c_xs + 1) / 2)
                n = (cv->c_xe - cv->c_xs + 1) / 2;
            if (cv->c_xoff + n > cv->c_xs)
                n = cv->c_xs - cv->c_xoff;
            cv->c_xoff += n;
            RethinkViewportOffsets(cv);
        } else if (lx + cv->c_xoff > cv->c_xe) {
            int n = lx + cv->c_xoff - cv->c_xe;
            if (n < (cv->c_xe - cv->c_xs + 1) / 2)
                n = (cv->c_xe - cv->c_xs + 1) / 2;
            if (cv->c_xoff - n + cv->c_layer->l_width - 1 < cv->c_xe)
                n = cv->c_xoff + cv->c_layer->l_width - 1 - cv->c_xe;
            cv->c_xoff -= n;
            RethinkViewportOffsets(cv);
        }
    }
    Redisplay(0);
    if (D_kaablamm) {
        kaablamm();
        D_kaablamm = 0;
    }
}
示例#2
0
文件: canvas.c 项目: cuidi/screen
void SetCanvasWindow(struct canvas *cv, struct win *win)
{
	struct win *p = 0, **pp;
	struct layer *l;
	struct canvas *cvp, **cvpp;

	l = cv->c_layer;
	display = cv->c_display;

	if (l) {
		/* remove old layer */
		for (cvpp = &l->l_cvlist; (cvp = *cvpp); cvpp = &cvp->c_lnext)
			if (cvp == cv)
				break;
		ASSERT(cvp);
		*cvpp = cvp->c_lnext;

		p = Layer2Window(l);
		l = cv->c_layer;
		cv->c_layer = 0;

		if (p && cv == D_forecv) {
			if (p->w_silence) {
				SetTimeout(&p->w_silenceev, p->w_silencewait * 1000);
				evenq(&p->w_silenceev);
			}
			D_other = fore;
			D_fore = 0;
		}
		if (l->l_cvlist == 0 && (p == 0 || l != p->w_savelayer))
			KillLayerChain(l);
	}

	/* find right layer to display on canvas */
	if (win && win->w_type != W_TYPE_GROUP) {
		l = &win->w_layer;
		if (win->w_savelayer && (win->w_blocked || win->w_savelayer->l_cvlist == 0))
			l = win->w_savelayer;
	} else {
		l = &cv->c_blank;
		if (win)
			l->l_data = (char *)win;
		else
			l->l_data = 0;
	}

	/* add our canvas to the layer's canvaslist */
	ASSERT(l->l_cvlist != cv);
	cv->c_lnext = l->l_cvlist;
	l->l_cvlist = cv;
	cv->c_layer = l;
	cv->c_xoff = cv->c_xs;
	cv->c_yoff = cv->c_ys;
	RethinkViewportOffsets(cv);

	if (flayer == 0)
		flayer = l;

	if (win && win->w_type == W_TYPE_GROUP) {
		/* auto-start windowlist on groups */
		struct display *d = display;
		struct layer *oldflayer = flayer;
		flayer = l;
		display_windows(0, 0, win);
		flayer = oldflayer;
		display = d;
	}

	if (win && D_other == win)
		D_other = win->w_next;	/* Might be 0, but that's OK. */
	if (cv == D_forecv) {
		D_fore = win;
		fore = D_fore;	/* XXX ? */
		if (win) {
			/*
			 * Place the window at the head of the most-recently-used list
			 */
			if (windows != win) {
				for (pp = &windows; (p = *pp); pp = &p->w_next)
					if (p == win)
						break;
				ASSERT(p);
				*pp = p->w_next;
				p->w_next = windows;
				windows = p;
				WListLinkChanged();
			}
		}
	}
}