xterm - patch #31 - T.Dickey This implements vt52 emulation in xterm (ifdef'd so it can be removed). I've been using it for testing for the past month or so. -------------------------------------------------------------------------------- VTPrsTbl.c | 655 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- VTparse.def | 1 VTparse.h | 10 charproc.c | 105 ++++++++- ctlseqs.ms | 62 ++++- input.c | 52 ++++ ptyx.h | 10 xterm.man | 1 8 files changed, 868 insertions, 28 deletions -------------------------------------------------------------------------------- Index: VTPrsTbl.c --- xterm-29+/VTPrsTbl.c Sun Sep 15 21:51:25 1996 +++ xterm-30/VTPrsTbl.c Sat Oct 5 20:36:26 1996 @@ -28,12 +28,15 @@ #include "VTparse.h" +/* FIXME: there should be a single config.h */ +#define OPT_VT52_MODE 1 /* true if xterm supports VT52 emulation */ + /* * Stupid Apollo C preprocessor can't handle long lines. So... To keep * it happy, we put each onto a separate line.... Sigh... */ -Const PARSE_T groundtable[] = +Const PARSE_T ansi_table[] = { /* NUL SOH STX ETX */ CASE_IGNORE, @@ -4572,3 +4575,653 @@ CASE_IGNORE, CASE_IGNORE, }; + +#if OPT_VT52_MODE +Const PARSE_T vt52_table[] = +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_IGNORE, +/* NP CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_IGNORE, +CASE_IGNORE, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* $ % & ' */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* ( ) * + */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* , - . / */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* 0 1 2 3 */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* 4 5 6 7 */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* 8 9 : ; */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* < = > ? */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* @ A B C */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* D E F G */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* H I J K */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* L M N O */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* P Q R S */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* T U V W */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* X Y Z [ */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* \ ] ^ _ */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* ` a b c */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* d e f g */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* h i j k */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* l m n o */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* p q r s */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* t u v w */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* x y z { */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* | } ~ DEL */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x90 0x91 0x92 0x93 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x94 0x95 0x96 0x97 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x98 0x99 0x9a 0x9b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Eth Ntilde Ograve Oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* agrave aacute acircumflex atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* adiaeresis aring ae ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* igrave iacute icircumflex idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* eth ntilde ograve oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ocircumflex otilde odiaeresis division */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* oslash ugrave uacute ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +}; + +Const PARSE_T vt52_esc_table[] = +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* BS HT NL VT */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* NP CR SO SI */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* $ % & ' */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ( ) * + */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* , - . / */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0 1 2 3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 4 5 6 7 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 8 9 : ; */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* < = > ? */ +CASE_ANSI_LEVEL_1, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* @ A B C */ +CASE_IGNORE, +CASE_CUU, +CASE_CUD, +CASE_CUF, +/* D E F G */ +CASE_CUB, +CASE_IGNORE, +CASE_SO, +CASE_SI, +/* H I J K */ +CASE_CUP, +CASE_RI, +CASE_ED, +CASE_EL, +/* L M N O */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* P Q R S */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* T U V W */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* X Y Z [ */ +CASE_IGNORE, +CASE_VT52_CUP, +CASE_DECID, +CASE_IGNORE, +/* \ ] ^ _ */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ` a b c */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* d e f g */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* h i j k */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* l m n o */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* p q r s */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* t u v w */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* x y z { */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* | } ~ DEL */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x90 0x91 0x92 0x93 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x94 0x95 0x96 0x97 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x98 0x99 0x9a 0x9b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Eth Ntilde Ograve Oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* agrave aacute acircumflex atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* adiaeresis aring ae ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* igrave iacute icircumflex idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* eth ntilde ograve oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ocircumflex otilde odiaeresis division */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* oslash ugrave uacute ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +}; +#endif /* OPT_VT52_MODE */ Index: VTparse.def --- xterm-29+/VTparse.def Sun Sep 15 21:42:20 1996 +++ xterm-30/VTparse.def Sat Oct 5 20:35:38 1996 @@ -112,3 +112,4 @@ CASE_DA2 CASE_DEC3_STATE CASE_DECRPTUI +CASE_VT52_CUP Index: VTparse.h --- xterm-29+/VTparse.h Sun Sep 15 21:48:11 1996 +++ xterm-30/VTparse.h Sat Oct 5 20:35:38 1996 @@ -36,21 +36,26 @@ */ typedef char PARSE_T; +extern Const PARSE_T ansi_table[]; extern Const PARSE_T csi_quo_table[]; extern Const PARSE_T csi_table[]; -extern Const PARSE_T dec_table[]; extern Const PARSE_T dec2_table[]; extern Const PARSE_T dec3_table[]; +extern Const PARSE_T dec_table[]; extern Const PARSE_T eigtable[]; extern Const PARSE_T esc_sp_table[]; extern Const PARSE_T esc_table[]; -extern Const PARSE_T groundtable[]; extern Const PARSE_T iestable[]; extern Const PARSE_T igntable[]; extern Const PARSE_T scrtable[]; extern Const PARSE_T scstable[]; extern Const PARSE_T sos_table[]; +#if OPT_VT52_MODE +extern Const PARSE_T vt52_table[]; +extern Const PARSE_T vt52_esc_table[]; +#endif + /* * The following list of definitions is generated from VTparse.def using the * following command line: @@ -168,3 +173,4 @@ #define CASE_DA2 103 #define CASE_DEC3_STATE 104 #define CASE_DECRPTUI 105 +#define CASE_VT52_CUP 106 Index: charproc.c --- xterm-29+/charproc.c Sun Sep 15 21:47:26 1996 +++ xterm-30/charproc.c Sat Oct 5 20:36:19 1996 @@ -321,7 +321,7 @@ static int defaultNMarginBell = N_MARGINBELL; static int defaultMultiClickTime = MULTICLICKTIME; static int defaultBellSuppressTime = BELLSUPPRESSMSEC; -static int default_DECID = MIN_DECID; +static int default_DECID = DFT_DECID; static char * _Font_Selected_ = "yes"; /* string is arbitrary */ #if OPT_BLINK_CURS @@ -847,6 +847,11 @@ static Char *string_area; static Size_t string_size, string_used; +#if OPT_VT52_MODE + static Bool vt52_cup = FALSE; +#endif + + Const PARSE_T *groundtable = ansi_table; register TScreen *screen = &term->screen; register Const PARSE_T *parsestate; register unsigned int c; @@ -858,6 +863,7 @@ /* We longjmp back to this point in VTReset() */ (void)setjmp(vtjmpbuf); + groundtable = screen->ansi_level ? ansi_table : vt52_table; parsestate = groundtable; scstype = 0; private_function = False; @@ -881,6 +887,29 @@ string_used = 0; } + /* + * VT52 is a little ugly in the one place it has a parameterized + * control sequence, since the parameter falls after the character + * that denotes the type of sequence. + */ +#if OPT_VT52_MODE + if (vt52_cup) { + param[nparam++] = (c & 0x7f) - 32; + if (nparam < 2) + continue; + vt52_cup = FALSE; + if((row = param[0]) < 0) + row = 0; + if((col = param[1]) < 0) + col = 0; + CursorSet(screen, row, col, term->flags); + parsestate = vt52_table; + param[0] = 0; + param[1] = 0; + continue; + } +#endif + switch (parsestate[c]) { case CASE_PRINT: /* printable characters */ @@ -888,6 +917,10 @@ cp = bptr; *--bptr = c; while(top > 0 && isprint(*cp & 0x7f)) { +#if OPT_VT52_MODE + if (screen->ansi_level <= 1) + *cp &= 0x7f; +#endif top--; bcnt--; cp++; @@ -959,9 +992,19 @@ case CASE_ESC: /* escape */ + if_OPT_VT52_MODE(screen,{ + parsestate = vt52_esc_table; + break;}) parsestate = esc_table; break; +#if OPT_VT52_MODE + case CASE_VT52_CUP: + vt52_cup = TRUE; + nparam = 0; + break; +#endif + case CASE_VMOT: /* * form feed, line feed, vertical tab @@ -998,10 +1041,12 @@ case CASE_SI: screen->curgl = 0; + parsestate = groundtable; break; case CASE_SO: screen->curgl = 1; + parsestate = groundtable; break; case CASE_SCR_STATE: @@ -1202,6 +1247,13 @@ break; case CASE_DECID: + if_OPT_VT52_MODE(screen,{ + unparseputc(ESC, screen->respond); + unparseputc('/', screen->respond); + unparseputc('Z', screen->respond); + parsestate = groundtable; + break; + }) param[0] = -1; /* Default ID parameter */ /* FALLTHRU */ case CASE_DA1: @@ -1519,6 +1571,12 @@ case CASE_DECRST: /* DECRST */ dpmodes(term, bitclr); +#if OPT_VT52_MODE + if (screen->ansi_level == 0) + groundtable = vt52_table; + else if (screen->terminal_id >= 100) + groundtable = ansi_table; +#endif parsestate = groundtable; break; @@ -1583,14 +1641,22 @@ * equivalents of DECSCL - T.Dickey) */ case CASE_ANSI_LEVEL_1: - screen->ansi_level = 1; - screen->control_eight_bits = False; + if (screen->terminal_id >= 100) { + screen->ansi_level = 1; + screen->control_eight_bits = False; +#if OPT_VT52_MODE + groundtable = + parsestate = ansi_table; +#endif + } break; case CASE_ANSI_LEVEL_2: - screen->ansi_level = 2; + if (screen->terminal_id >= 200) + screen->ansi_level = 2; break; case CASE_ANSI_LEVEL_3: - screen->ansi_level = 3; + if (screen->terminal_id >= 300) + screen->ansi_level = 3; break; case CASE_DECSCL: @@ -1772,6 +1838,10 @@ break; case CASE_S8C1T: +#if OPT_VT52_MODE + if (screen->ansi_level <= 1) + break; +#endif screen->control_eight_bits = True; parsestate = groundtable; break; @@ -2333,14 +2403,26 @@ update_appcursor(); break; case 2: /* ANSI/VT52 mode */ - if (func == bitset) { + if (func == bitset) { /* ANSI (VT100) */ screen->gsets[0] = - screen->gsets[1] = - screen->gsets[2] = - screen->gsets[3] = 'B'; + screen->gsets[1] = + screen->gsets[2] = + screen->gsets[3] = 'B'; screen->curgl = 0; screen->curgr = 2; + if_OPT_VT52_MODE(screen,{ + screen->ansi_level = 1;}) + } +#if OPT_VT52_MODE + else if (screen->terminal_id >= 100) { /* VT52 */ + screen->ansi_level = 0; + param[0] = 0; + param[1] = 0; + screen->curgl = 0; + screen->gsets[0] = 'B'; + screen->gsets[1] = '0'; } +#endif break; case 3: /* DECCOLM */ if(screen->c132) { @@ -2449,6 +2531,9 @@ FromAlternate(screen); } break; + case 66: /* DECNKM */ + /* FIXME: numeric keypad */ + break; case 67: /* DECBKM */ /* FIXME: back-arrow mapped to backspace or delete(D)*/ break; @@ -2867,7 +2952,7 @@ register int inters; unparseputc1(c = ap->a_type, fd); - if (c==ESC || c==DCS || c==CSI || c==OSC || c==PM || c==APC) { + if (c==ESC || c==DCS || c==CSI || c==OSC || c==PM || c==APC || c==SS3) { if (ap->a_pintro != 0) unparseputc((char) ap->a_pintro, fd); for (i=0; ia_nparam; ++i) { Index: ctlseqs.ms --- xterm-29+/ctlseqs.ms Sun Sep 15 22:00:25 1996 +++ xterm-30/ctlseqs.ms Sat Oct 5 20:35:39 1996 @@ -135,6 +135,8 @@ .[] : : .[] ; ; .[] = = +.[] / / +.[] < < .[] > > .[] ? ? .[] @ @ @@ -160,6 +162,7 @@ .[] V V .[] W W .[] XX X +.[] Y Y .[] Z Z .[] [[ [ .[] ]] ] @@ -295,8 +298,8 @@ .LP Most of these control sequences are standard VT102 control sequences, but there is support for later DEC VT terminals (i.e., VT220 and VT320), too. -VT102 features not supported are double size -characters, blinking characters, and VT52 mode. +VT102 features not supported are +double size characters and blinking characters. There are additional control sequences to provide \fIxterm-\fPdependent functions, such as the scrollbar or window size. Where the function is specified by DEC or ISO 6429, the code assigned @@ -539,7 +542,7 @@ .IP \\*(Cs\\*(Ps\\*s\\*S Scroll up \*(Ps lines (default = 1) (SU) . -.IP \\*(Cs\\*(Ps\\*s\\*\\*T +.IP \\*(Cs\\*(Ps\\*s\\*T Scroll down \*(Ps lines (default = 1) (SD, according to DEC) . .IP \\*(Cs\\*(Ps\\*s\\*;\\*(Ps\\*s\\*;\\*(Ps\\*s\\*;\\*(Ps\\*s\\*;\\*(Ps\\*s\\*T @@ -553,7 +556,7 @@ .IP \\*(Cs\\*(Ps\\*s\\*Z Cursor Backward Tabulation \*(Ps tab stops (default = 1) (CBT) . -.IP \\*(Cs\\*(Ps\\*s\\*\\*^ +.IP \\*(Cs\\*(Ps\\*s\\*^ Scroll down \*(Ps lines (default = 1) (SD, according to ISO) . .IP \\*(Cs\\*(Ps\\*s\\*c @@ -691,9 +694,8 @@ .IP \\*(Cs\\*?\\*(Pm\\*s\\*h DEC Private Mode Set (DECSET) \*(Ps = \*1 \(-> Application Cursor Keys (DECCKM) - \*(Ps = \*2 \(-> Designate USASCII for character sets G0-G3. -(In the VT102, this selects VT52 mode (DECANM), which \fIxterm\fP -doesn't support.) + \*(Ps = \*2 \(-> Designate USASCII for character sets G0-G3 (DECANM), +and set VT100 mode. \*(Ps = \*3 \(-> 132 Column Mode (DECCOLM) \*(Ps = \*4 \(-> Smooth (Slow) Scroll (DECSCLM) \*(Ps = \*5 \(-> Reverse Video (DECSCNM) @@ -720,6 +722,7 @@ .IP \\*(Cs\\*?\\*(Pm\\*s\\*l DEC Private Mode Reset (DECRST) \*(Ps = \*1 \(-> Normal Cursor Keys (DECCKM) + \*(Ps = \*2 \(-> Designate VT52 mode (DECANM). \*(Ps = \*3 \(-> 80 Column Mode (DECCOLM) \*(Ps = \*4 \(-> Jump (Fast) Scroll (DECSCLM) \*(Ps = \*5 \(-> Normal Video (DECSCNM) @@ -934,4 +937,49 @@ .IP \\*(Us Alpha Mode (Ctrl-_) .Ed +. +. +.br +.ds RH VT52 Mode +.SH +VT52 Mode +.LP +Parameters for cursor movement are at the end of the \*(Es\*Y escape sequence. +Each ordinate is encoded in a single character as \fIvalue\fP+040. +For example, \*! is 1. +The screen coodinate system is 0-based. +.St +.IP \\*(Es\\*A +Cursor up. +.IP \\*(Es\\*(cB +Cursor down. +.IP \\*(Es\\*C +Cursor right. +.IP \\*(Es\\*D +Cursor left. +.IP \\*(Es\\*F +Enter graphics mode. +.IP \\*(Es\\*G +Exit graphics mode. +.IP \\*(Es\\*H +Move the cursor to the home position. +.IP \\*(Es\\*I +Reverse line feed. +.IP \\*(Es\\*J +Erase from the cursor to the end of the screen. +.IP \\*(Es\\*K +Erase from the cursor to the end of the line. +.IP \\*(Es\\*Y\\*(Ps\\*s\\*(Ps +Move the cursor to given row and column. +.IP \\*(Es\\*Z +Identify + \(-> \*(Es\*s\*/\*s\*Z (``I am a VT52.'') +.IP \\*(Es\\*= +Enter alternate keypad mode. +.IP \\*(Es\\*> +Exit alternate keypad mode. +.IP \\*(Es\\*< +Exit VT52 mode (Enter VT100 mode). +.Ed +. .if n .pl \n(nlu+1v Index: input.c --- xterm-29+/input.c Tue Aug 13 14:51:20 1996 +++ xterm-30/input.c Sat Oct 5 20:35:39 1996 @@ -109,19 +109,33 @@ keysym += XK_Home - XK_KP_Home; } +#define VT52_KEYPAD \ + if_OPT_VT52_MODE(screen,{ \ + reply.a_type = ESC; \ + reply.a_pintro = '?'; \ + }) + +#define VT52_CURSOR_KEYS \ + if_OPT_VT52_MODE(screen,{ \ + reply.a_type = ESC; \ + }) + if (IsPFKey(keysym)) { reply.a_type = SS3; + reply.a_final = keysym-XK_KP_F1+'P'; + VT52_CURSOR_KEYS unparseseq(&reply, pty); - unparseputc((char)(keysym-XK_KP_F1+'P'), pty); key = TRUE; } else if (IsCursorKey(keysym) && keysym != XK_Prior && keysym != XK_Next) { if (keyboard->flags & CURSOR_APL) { reply.a_type = SS3; + reply.a_final = cur[keysym-XK_Home]; + VT52_CURSOR_KEYS unparseseq(&reply, pty); - unparseputc(cur[keysym-XK_Home], pty); } else { reply.a_type = CSI; + if_OPT_VT52_MODE(screen,{ reply.a_type = ESC; }) reply.a_final = cur[keysym-XK_Home]; unparseseq(&reply, pty); } @@ -130,17 +144,32 @@ keysym == XK_Prior || keysym == XK_Next || keysym == DXK_Remove || keysym == XK_KP_Delete || keysym == XK_KP_Insert) { - if ((string = udk_lookup(funcvalue(keysym), &nbytes)) != 0) { + int dec_code = funcvalue(keysym); + if ((string = udk_lookup(dec_code, &nbytes)) != 0) { while (nbytes-- > 0) unparseputc(*string++, pty); - } else { + } +#if OPT_VT52_MODE + /* + * Interpret F1-F4 as PF1-PF4 for VT52, VT100 + */ + else if (screen->ansi_level <= 1 + && (dec_code >= 11 && dec_code <= 14)) + { + reply.a_type = SS3; + VT52_CURSOR_KEYS + reply.a_final = dec_code - 11 + 'P'; + unparseseq(&reply, pty); + } +#endif + else { reply.a_type = CSI; reply.a_nparam = 1; if (sunFunctionKeys) { reply.a_param[0] = sunfuncvalue (keysym); reply.a_final = 'z'; } else { - reply.a_param[0] = funcvalue (keysym); + reply.a_param[0] = dec_code; reply.a_final = '~'; } if (reply.a_param[0] > 0) @@ -148,10 +177,21 @@ } key = TRUE; } else if (IsKeypadKey(keysym)) { +#if OPT_VT52_MODE + /* + * DEC keyboards don't have keypad(+), but do have keypad(,) + * instead. Other (Sun, PC) keyboards commonly have keypad(+), + * but no keypad(,) - it's a pain for users to work around. + */ + if (!sunFunctionKeys + && keysym == XK_KP_Add) + keysym = XK_KP_Separator; +#endif if (keyboard->flags & KYPD_APL) { reply.a_type = SS3; + reply.a_final = kypd_apl[keysym-XK_KP_Space]; + VT52_KEYPAD unparseseq(&reply, pty); - unparseputc(kypd_apl[keysym-XK_KP_Space], pty); } else unparseputc(kypd_num[keysym-XK_KP_Space], pty); key = TRUE; Index: ptyx.h --- xterm-29+/ptyx.h Sun Sep 15 21:27:09 1996 +++ xterm-30/ptyx.h Sat Oct 5 20:35:39 1996 @@ -188,7 +188,8 @@ #define APC 0x9F #define RDEL 0xFF -#define MIN_DECID 100 /* emulate VT100 */ +#define MIN_DECID 52 /* can emulate VT52 */ +#define DFT_DECID 100 /* default VT100 */ #define MAX_DECID 420 /* ...through VT420 */ #define NMENUFONTS 9 /* entries in fontMenu */ @@ -286,6 +287,7 @@ #define OPT_ISO_COLORS 1 /* true if xterm is configured with ISO colors */ #define OPT_BLINK_CURS 0 /* FIXME: do this later (96/7/31) */ +#define OPT_VT52_MODE 1 /* true if xterm supports VT52 emulation */ /***====================================================================***/ @@ -321,6 +323,12 @@ #define MAX_PTRS term->num_ptrs #else #define MAX_PTRS 2 +#endif + +#if OPT_VT52_MODE +#define if_OPT_VT52_MODE(screen, code) if(screen->ansi_level == 0) code +#else +#define if_OPT_VT52_MODE(screen, code) /* nothing */ #endif /* ScrnBuf-level macros */ Index: xterm.man --- xterm-29+/xterm.man Sun Sep 15 19:58:11 1996 +++ xterm-30/xterm.man Sat Oct 5 20:35:39 1996 @@ -56,7 +56,6 @@ menu in the 4014 window. .SH EMULATIONS The VT102 emulation is fairly complete, but does not support -VT52 mode, autorepeat, the blinking character attribute nor the double-wide and double-size character sets.