tAdd DEC alignment test - st - [fork] customized build of st, the simple termin… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 9e813947cf4631c0ca8e5f73ebfb269ef2f8252b | |
parent b7a7f171effb301ce8dbce07c1c77a6b06ef980f | |
Author: Roberto E. Vargas Caballero <[email protected]> | |
Date: Sun, 7 Oct 2012 11:06:17 +0200 | |
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(-) | |
Diffstat: | |
M st.c | 31 +++++++++++++++++++++++------… | |
1 file changed, 23 insertions(+), 8 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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 { | |
t@@ -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); | |
t@@ -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 */ | |
t@@ -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 | |
t@@ -1893,11 +1894,25 @@ tputc(char *c, int len) { | |
fprintf(stderr, "esc unhandled charset: ESC ( … | |
} | |
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 */ | |
t@@ -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 |