Exemple #1
0
static void
screenputc(char *buf)
{
	Point p;
	int w, pos;
	Rectangle r;
	static int *xp;
	static int xbuf[256];

	if(xp < xbuf || xp >= &xbuf[sizeof(xbuf)])
		xp = xbuf;

	switch(buf[0]) {
	case '\n':
		if(curpos.y+h >= window.max.y)
			scroll();
		curpos.y += h;
		screenputc("\r");
		break;
	case '\r':
		xp = xbuf;
		curpos.x = window.min.x;
		break;
	case '\t':
		p = memsubfontwidth(memdefont, " ");
		w = p.x;
		*xp++ = curpos.x;
		pos = (curpos.x-window.min.x)/w;
		pos = 8-(pos%8);
		r = Rect(curpos.x, curpos.y, curpos.x+pos*w, curpos.y + h);
		memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min, S);
		addflush(r);
		curpos.x += pos*w;
		break;
	case '\b':
		if(xp <= xbuf)
			break;
		xp--;
		r = Rect(*xp, curpos.y, curpos.x, curpos.y + h);
		memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min, S);
		addflush(r);
		curpos.x = *xp;
		break;
	default:
		p = memsubfontwidth(memdefont, buf);
		w = p.x;

		if(curpos.x >= window.max.x-w)
			screenputc("\n");

		*xp++ = curpos.x;
		r = Rect(curpos.x, curpos.y, curpos.x+w, curpos.y + h);
		memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min, S);
		memimagestring(gscreen, curpos, conscol, ZP, memdefont, buf);
		addflush(r);
		curpos.x += w;
	}
}
Exemple #2
0
static void
myscreenputs(char *s, int n)
{
	int i;
	Rune r;
	char buf[4];

	if(!islo()) {
		/* don't deadlock trying to print in interrupt */
		if(!canlock(&screenlock))
			return;	
	}
	else
		lock(&screenlock);

	while(n > 0){
		i = chartorune(&r, s);
		if(i == 0){
			s++;
			--n;
			continue;
		}
		memmove(buf, s, i);
		buf[i] = 0;
		n -= i;
		s += i;
		screenputc(buf);
	}
	unlock(&screenlock);
}
Exemple #3
0
static void
termscreenputs(char *s, int n)
{
	int i, locked;
	Rune r;
	char buf[4];

	lock(&screenlock);
	locked = drawcanqlock();
	while(n > 0){
		i = chartorune(&r, s);
		if(i == 0){
			s++;
			--n;
			continue;
		}
		memmove(buf, s, i);
		buf[i] = 0;
		n -= i;
		s += i;
		screenputc(buf);
	}
	if(locked)
		drawqunlock();
	screenflush();
	unlock(&screenlock);
}
Exemple #4
0
void
screenputc(int c)
{
    Fontchar *i;
    Point p;

    if(gscreen.base == nil)
        return;
    switch(c) {
    case '\n':
        out.pos.x = MINX;
        out.pos.y += defont0.height;
        if(out.pos.y > gscreen.r.max.y-defont0.height)
            out.pos.y = gscreen.r.min.y;
        gbitblt(&gscreen, Pt(0, out.pos.y), &gscreen,
                Rect(0, out.pos.y, gscreen.r.max.x, out.pos.y+2*defont0.height),
                Zero);
        break;
    case '\t':
        out.pos.x += (8-((out.pos.x-MINX)/out.bwid&7))*out.bwid;
        if(out.pos.x >= gscreen.r.max.x)
            screenputc('\n');
        break;
    case '\b':
        if(out.pos.x >= out.bwid+MINX) {
            out.pos.x -= out.bwid;
            screenputc(' ');
            out.pos.x -= out.bwid;
        }
        break;
    default:
        if(out.pos.x >= gscreen.r.max.x-out.bwid)
            screenputc('\n');
        c &= 0x7f;
        if(c <= 0 || c >= defont0.n)
            break;
        i = defont0.info + c;
        p = out.pos;
        gbitblt(&gscreen, Pt(p.x+i->left, p.y), defont0.bits,
                Rect(i[0].x, 0, i[1].x, defont0.height),
                S);
        out.pos.x = p.x + i->width;
        break;
    }
}
Exemple #5
0
void
screenputs(char *s, int n)
{
    while(n-- > 0)
        screenputc(*s++);
}