~petersanchez/st

b78c5085f72d66de26468e2c07fb3c72d0afe63b — Christoph Lohmann 11 years ago b4b513c
Implementing Back Color Erase (BCE).
2 files changed, 40 insertions(+), 25 deletions(-)

M st.c
M st.info
M st.c => st.c +39 -24
@@ 152,7 152,7 @@ typedef struct {
	uchar state; /* state flags    */
} Glyph;

typedef Glyph* Line;
typedef Glyph *Line;

typedef struct {
	Glyph attr;	 /* current char attributes */


@@ 303,7 303,7 @@ static void strhandle(void);
static void strparse(void);
static void strreset(void);

static void tclearregion(int, int, int, int);
static void tclearregion(int, int, int, int, int);
static void tcursor(int);
static void tdeletechar(int);
static void tdeleteline(int);


@@ 1113,7 1113,7 @@ treset(void) {
	term.bot = term.row - 1;
	term.mode = MODE_WRAP;

	tclearregion(0, 0, term.col-1, term.row-1);
	tclearregion(0, 0, term.col-1, term.row-1, 0);
	tmoveto(0, 0);
	tcursor(CURSOR_SAVE);
}


@@ 1157,7 1157,7 @@ tscrolldown(int orig, int n) {

	LIMIT(n, 0, term.bot-orig+1);

	tclearregion(0, term.bot-n+1, term.col-1, term.bot);
	tclearregion(0, term.bot-n+1, term.col-1, term.bot, 0);

	for(i = term.bot; i >= orig+n; i--) {
		temp = term.line[i];


@@ 1177,7 1177,7 @@ tscrollup(int orig, int n) {
	Line temp;
	LIMIT(n, 0, term.bot-orig+1);

	tclearregion(0, orig, term.col-1, orig+n-1);
	tclearregion(0, orig, term.col-1, orig+n-1, 0);

	for(i = orig; i <= term.bot-n; i++) {
		 temp = term.line[i];


@@ 1305,7 1305,7 @@ tsetchar(char *c, Glyph *attr, int x, int y) {
}

void
tclearregion(int x1, int y1, int x2, int y2) {
tclearregion(int x1, int y1, int x2, int y2, int bce) {
	int x, y, temp;

	if(x1 > x2)


@@ 1320,8 1320,15 @@ tclearregion(int x1, int y1, int x2, int y2) {

	for(y = y1; y <= y2; y++) {
		term.dirty[y] = 1;
		for(x = x1; x <= x2; x++)
			term.line[y][x].state = 0;
		for(x = x1; x <= x2; x++) {
			if(bce) {
				term.line[y][x] = term.c.attr;
				memcpy(term.line[y][x].c, " ", 2);
				term.line[y][x].state |= GLYPH_SET;
			} else {
				term.line[y][x].state = 0;
			}
		}
	}
}



@@ 1334,13 1341,13 @@ tdeletechar(int n) {
	term.dirty[term.c.y] = 1;

	if(src >= term.col) {
		tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
		tclearregion(term.c.x, term.c.y, term.col-1, term.c.y, 0);
		return;
	}

	memmove(&term.line[term.c.y][dst], &term.line[term.c.y][src],
			size * sizeof(Glyph));
	tclearregion(term.col-n, term.c.y, term.col-1, term.c.y);
	tclearregion(term.col-n, term.c.y, term.col-1, term.c.y, 0);
}

void


@@ 1352,13 1359,13 @@ tinsertblank(int n) {
	term.dirty[term.c.y] = 1;

	if(dst >= term.col) {
		tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
		tclearregion(term.c.x, term.c.y, term.col-1, term.c.y, 0);
		return;
	}

	memmove(&term.line[term.c.y][dst], &term.line[term.c.y][src],
			size * sizeof(Glyph));
	tclearregion(src, term.c.y, dst - 1, term.c.y);
	tclearregion(src, term.c.y, dst - 1, term.c.y, 0);
}

void


@@ 1542,8 1549,10 @@ tsetmode(bool priv, bool set, int *args, int narg) {
			case 47:
			case 1047: {
				alt = IS_SET(MODE_ALTSCREEN);
				if(alt)
					tclearregion(0, 0, term.col-1, term.row-1);
				if(alt) {
					tclearregion(0, 0, term.col-1,
							term.row-1, 0);
				}
				if(set ^ alt)		/* set is always 1 or 0 */
					tswapscreen();
				if(*args != 1049)


@@ 1662,17 1671,19 @@ csihandle(void) {
		sel.bx = -1;
		switch(csiescseq.arg[0]) {
		case 0: /* below */
			tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
			if(term.c.y < term.row-1)
				tclearregion(0, term.c.y+1, term.col-1, term.row-1);
			tclearregion(term.c.x, term.c.y, term.col-1, term.c.y, 1);
			if(term.c.y < term.row-1) {
				tclearregion(0, term.c.y+1, term.col-1,
						term.row-1, 1);
			}
			break;
		case 1: /* above */
			if(term.c.y > 1)
				tclearregion(0, 0, term.col-1, term.c.y-1);
			tclearregion(0, term.c.y, term.c.x, term.c.y);
				tclearregion(0, 0, term.col-1, term.c.y-1, 1);
			tclearregion(0, term.c.y, term.c.x, term.c.y, 1);
			break;
		case 2: /* all */
			tclearregion(0, 0, term.col-1, term.row-1);
			tclearregion(0, 0, term.col-1, term.row-1, 1);
			break;
		default:
			goto unknown;


@@ 1681,13 1692,14 @@ csihandle(void) {
	case 'K': /* EL -- Clear line */
		switch(csiescseq.arg[0]) {
		case 0: /* right */
			tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
			tclearregion(term.c.x, term.c.y, term.col-1,
					term.c.y, 1);
			break;
		case 1: /* left */
			tclearregion(0, term.c.y, term.c.x, term.c.y);
			tclearregion(0, term.c.y, term.c.x, term.c.y, 1);
			break;
		case 2: /* all */
			tclearregion(0, term.c.y, term.col-1, term.c.y);
			tclearregion(0, term.c.y, term.col-1, term.c.y, 1);
			break;
		}
		break;


@@ 1712,7 1724,8 @@ csihandle(void) {
		break;
	case 'X': /* ECH -- Erase <n> char */
		DEFAULT(csiescseq.arg[0], 1);
		tclearregion(term.c.x, term.c.y, term.c.x + csiescseq.arg[0], term.c.y);
		tclearregion(term.c.x, term.c.y, term.c.x + csiescseq.arg[0],
				term.c.y, 0);
		break;
	case 'P': /* DCH -- Delete <n> char */
		DEFAULT(csiescseq.arg[0], 1);


@@ 2505,6 2518,7 @@ xinit(void) {
		xw.fy = 0;
	}

	/* Events */
	attrs.background_pixel = dc.col[defaultbg].pixel;
	attrs.border_pixel = dc.col[defaultbg].pixel;
	attrs.bit_gravity = NorthWestGravity;


@@ 2898,6 2912,7 @@ drawregion(int x1, int y1, int x2, int y2) {
					ox = x;
					base = new;
				}

				sl = utf8size(new.c);
				memcpy(buf+ib, new.c, sl);
				ib += sl;

M st.info => st.info +1 -1
@@ 3,7 3,7 @@
st| simpleterm,
	acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
	am,
#	bce,
	bce,
	bel=^G,
#	blink=\E[5m,
	bold=\E[1m,