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