@ -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 . 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
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