>From cf7afccdebabaa5d1a9c6d80b2756af7b62cd712 Mon Sep 17 00:00:00 2001
From: "Roberto E. Vargas Caballero" <k...@shike2.com>
Date: Sun, 7 Oct 2012 09:23:20 +0200
Subject: Fix Identification sequences

Do not send NUL character in the identification (use (sizeof(VT102ID) - 1),
and finish  the sequence once you execute it.
---
 st.c |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/st.c b/st.c
index 85b0b59..8c8efaf 100644
--- a/st.c
+++ b/st.c
@@ -1514,7 +1514,7 @@ csihandle(void) {
 		break;
 	case 'c': /* DA -- Device Attributes */
 		if(csiescseq.arg[0] == 0)
-			ttywrite(VT102ID, sizeof(VT102ID));
+			ttywrite(VT102ID, sizeof(VT102ID) - 1);
 		break;
 	case 'C': /* CUF -- Cursor <n> Forward */
 	case 'a':
@@ -1940,7 +1940,8 @@ tputc(char *c, int len) {
 				term.esc = 0;
 				break;
 			case 'Z': /* DECID -- Identify Terminal */
-				ttywrite(VT102ID, sizeof(VT102ID));
+				ttywrite(VT102ID, sizeof(VT102ID) - 1);
+				term.esc = 0;
 				break;
 			case 'c': /* RIS -- Reset to inital state */
 				treset();
-- 
1.7.10.4

>From 8971b250d5c5670c42c135f4fb2d2f9571e027a7 Mon Sep 17 00:00:00 2001
From: "Roberto E. Vargas Caballero" <k...@shike2.com>
Date: Sun, 7 Oct 2012 09:57:27 +0200
Subject: Avoid initialization of vt100_0 in each call to tsetchar

If vt100_0 is a automatic variable then it is initializated in each call to
tsetchar, but if the variable is static it is initializated only in compile
time.
---
 st.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/st.c b/st.c
index 8c8efaf..33a1501 100644
--- a/st.c
+++ b/st.c
@@ -1183,7 +1183,7 @@ tmoveto(int x, int y) {
 
 void
 tsetchar(char *c) {
-	char *vt100_0[62] = { /* 0x41 - 0x7e */
+	static char *vt100_0[62] = { /* 0x41 - 0x7e */
 		"↑", "↓", "→", "←", "█", "▚", "☃", /* A - G */
 		0, 0, 0, 0, 0, 0, 0, 0, /* H - O */
 		0, 0, 0, 0, 0, 0, 0, 0, /* P - W */
-- 
1.7.10.4

>From dc702034e0c2e38a3e5273974c798f8965368530 Mon Sep 17 00:00:00 2001
From: "Roberto E. Vargas Caballero" <k...@shike2.com>
Date: Sun, 7 Oct 2012 10:27:55 +0200
Subject: Add DEC alignment test

This sequence was used by DEC personal in to for verifying the screen adjust
of terminals. It is the unique test sequence implemented by all the
emulators, and I think it is because they want be conforms with vttest which
uses this sequence in some tests.
---
 st.c |   31 +++++++++++++++++++++++--------
 1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/st.c b/st.c
index 33a1501..693739e 100644
--- a/st.c
+++ b/st.c
@@ -123,6 +123,7 @@ enum escape_state {
 	ESC_STR	= 4, /* DSC, OSC, PM, APC */
 	ESC_ALTCHARSET = 8,
 	ESC_STR_END    = 16, /* a final string was encountered */
+	ESC_TEST       = 32, /* Enter in test mode */
 };
 
 enum window_state {
@@ -289,7 +290,7 @@ static int tresize(int, int);
 static void tscrollup(int, int);
 static void tscrolldown(int, int);
 static void tsetattr(int*, int);
-static void tsetchar(char*);
+static void tsetchar(char *, Glyph *, int, int);
 static void tsetscroll(int, int);
 static void tswapscreen(void);
 static void tsetdirt(int, int);
@@ -1182,7 +1183,7 @@ tmoveto(int x, int y) {
 }
 
 void
-tsetchar(char *c) {
+tsetchar(char *c, Glyph *attr, int x, int y) {
 	static char *vt100_0[62] = { /* 0x41 - 0x7e */
 		"↑", "↓", "→", "←", "█", "▚", "☃", /* A - G */
 		0, 0, 0, 0, 0, 0, 0, 0, /* H - O */
@@ -1197,17 +1198,17 @@ tsetchar(char *c) {
 	/*
 	 * The table is proudly stolen from rxvt.
 	 */
-	if(term.c.attr.mode & ATTR_GFX) {
+	if(attr->mode & ATTR_GFX) {
 		if(c[0] >= 0x41 && c[0] <= 0x7e
 				&& vt100_0[c[0] - 0x41]) {
 			c = vt100_0[c[0] - 0x41];
 		}
 	}
 
-	term.dirty[term.c.y] = 1;
-	term.line[term.c.y][term.c.x] = term.c.attr;
-	memcpy(term.line[term.c.y][term.c.x].c, c, UTF_SIZ);
-	term.line[term.c.y][term.c.x].state |= GLYPH_SET;
+	term.dirty[y] = 1;
+	term.line[y][x] = *attr;
+	memcpy(term.line[y][x].c, c, UTF_SIZ);
+	term.line[y][x].state |= GLYPH_SET;
 }
 
 void
@@ -1893,11 +1894,25 @@ tputc(char *c, int len) {
 				fprintf(stderr, "esc unhandled charset: ESC ( %c\n", ascii);
 			}
 			term.esc = 0;
+		} else if(term.esc & ESC_TEST) {
+			if(ascii == '8') { /* DEC screen alignment test. */
+				char E[UTF_SIZ] = "E";
+				int x, y;
+
+				for(x = 0; x < term.col; ++x) {
+					for(y = 0; y < term.row; ++y)
+						tsetchar(E, &term.c.attr, x, y);
+				}
+			}
+			term.esc = 0;
 		} else {
 			switch(ascii) {
 			case '[':
 				term.esc |= ESC_CSI;
 				break;
+			case '#':
+				term.esc |= ESC_TEST;
+				break;
 			case 'P': /* DCS -- Device Control String */
 			case '_': /* APC -- Application Program Command */
 			case '^': /* PM -- Privacy Message */
@@ -1988,7 +2003,7 @@ tputc(char *c, int len) {
 		sel.bx = -1;
 	if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT)
 		tnewline(1); /* always go to first col */
-	tsetchar(c);
+	tsetchar(c, &term.c.attr, term.c.x, term.c.y);
 	if(term.c.x+1 < term.col)
 		tmoveto(term.c.x+1, term.c.y);
 	else
-- 
1.7.10.4

Reply via email to