/* C K O W Y S . C -- Wyse Emulation */ /* Author: Jeffrey Altman , Secure Endpoints Inc., New York City. Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New York. */ /* the WYSE 160 manual describes additional keys that we don't support yet */ /* Prg KeyName */ /* # ESC W Delete */ /* ( ESC R Shift Delete */ /* X ESC P Shift Print Screen */ /* : ESC J PgUp */ /* ; Shift PgUp */ /* \ ESC T End */ /* ] ESC Y Shift End */ #ifdef NT #include #else /* NT */ #include #undef COMMENT #endif /* NT */ #include "ckcdeb.h" #ifndef NOTERM #include "ckcker.h" #include "ckcasc.h" #include "ckuusr.h" #include "ckcuni.h" #include "ckocon.h" #include "ckokey.h" #include "ckowys.h" #include "ckctel.h" extern bool keyclick ; extern int cursorena[], keylock, duplex, duplex_sav, screenon ; extern int printon, aprint, cprint, uprint, xprint, seslog ; extern int insertmode, tnlm, ttmdm, decssdt, cmask; extern int escstate, debses, decscnm, tt_cursor ; #ifdef PCTERM extern int tt_pcterm; #endif /* PCTERM */ extern int tt_type, tt_type_mode, tt_max, tt_answer, tt_status[VNUM], tt_szchng[] ; extern int tt_modechg ; extern int tt_cols[], tt_rows[], tt_wrap ; extern int wherex[], wherey[], margintop, marginbot ; extern int marginbell, marginbellcol ; extern char answerback[], htab[] ; extern struct tt_info_rec tt_info[] ; extern vtattrib attrib ; extern unsigned char attribute, colorstatus; extern char * udkfkeys[]; extern int tt_senddata ; extern int tt_hidattr; extern int tt_sac; extern bool xprintff; /* Print formfeed */ extern int tcsl; extern struct _vtG G[]; extern struct _vtG *GL, *GR; #ifdef TCPSOCKET #ifdef CK_NAWS extern int tn_snaws(); #endif /* CK_NAWS */ #endif /* TCPSOCKET */ int protect = FALSE ; int autoscroll = TRUE ; int writeprotect = FALSE ; int linelock = FALSE ; int wysegraphics = FALSE ; int wyse8bit = FALSE; int attrmode = ATTR_CHAR_MODE ; int wy_keymode = FALSE ; int wy_enhanced = TRUE ; int wy_widthclr = FALSE ; int wy_autopage = FALSE ; int wy_nullsuppress = TRUE; int wy_monitor = FALSE ; int wy_blockend = EOB_US_CR ; int wy_block = FALSE; /* Wyse/TVI Block Mode */ static char wy_labelmsg[MAXTERMCOL+1] ; static char wy_labelline[MAXTERMCOL+1] ; static char wy_shiftlabelline[MAXTERMCOL+1] ; extern char fkeylabel[16][32]; vtattrib WPattrib ={0,0,0,0,0,1,0,1,0,0,0} ;/* Dim, and Protected */ vtattrib defWPattrib={0,0,0,0,0,1,0,1,0,0,0} ;/* Dim, and Protected */ int wyinc(void) { extern int pmask, cmask; extern int tt_utf8; int ch; loop: ch = ttinc(0); if ( ch < 0 ) return ch; if ( seslog ) logchar(ch); /* Handle the UTF8 conversion if we are in that mode */ if ( tt_utf8 ) { USHORT * ucs2 = NULL; int rc = utf8_to_ucs2( (CHAR)(ch & 0xFF), &ucs2 ); if ( rc > 0 ) goto loop; else if ( rc < 0 ) ch = 0xfffd; else ch = *ucs2; } if ( !xprint ) { #ifndef NOXFER autodown(ch); #endif /* NOXFER */ autoexitchk(ch); } ch = ch & pmask & cmask; debugses(ch); if (printon && (is_xprint() || is_uprint())) prtchar(ch); return ch; } USHORT xlwygrph( CHAR c ) { USHORT cx = 0 ; extern struct _vtG *GNOW; extern int win95lucida, win95hsl; if ( isunicode() ) { cx = (*xl_u[TX_WYSE60G_N])(c) ; if ( win95hsl && cx >= 0x23BA && cx <= 0x23BD ) cx = tx_hslsub(cx); else if ( cx >= 0xE000 && cx <= 0xF8FF ) cx = tx_usub(cx); if (win95lucida && cx > 0x017f) cx = tx_lucidasub(cx); } else { cx = (*xl_u[TX_WYSE60G_N])(c) ; if ( GNOW->itol ) cx = (*GNOW->itol)(cx); } return(cx); } void wyse_tab( VOID ) { int i; if ( !protect ) { /* Typewriter tabs */ i = wherex[VTERM]; if (i < VscrnGetWidth(VTERM)) { do { i++; cursorright(0); } while ((htab[i] != 'T') && (i <= VscrnGetWidth(VTERM)-1)); } } else { /* Field tabs */ int w = VscrnGetWidth(VTERM); int h = VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0); int x = wherex[VTERM]-1; int y = wherey[VTERM]-1; int field_found = 0; vtattrib vta = {0,0,0,0,0,1,0,0,0,0,0}; /* Protected */ for ( ; y < h ; y++,x=0 ) { for ( ; x < w ; x++ ) { vta = VscrnGetVtCharAttr( VTERM, x, y ) ; if ( !field_found ) { if (vta.unerasable) field_found = 1; } else { if ( !vta.unerasable ) goto nextstep; } } } nextstep: if ( y == h ) { y = 0; x = 0; for ( ; y <= wherey[VTERM]-1 ; y++, x=0 ) { for ( ; y == wherey[VTERM]-1 ? x < wherex[VTERM]-1 : x < w ; x++ ) { vta = VscrnGetVtCharAttr( VTERM, x, y ) ; if ( !field_found ) { if (vta.unerasable) field_found = 1; } else { if ( !vta.unerasable ) goto nextstep2; } } } } nextstep2: if ( field_found ) lgotoxy(VTERM,x+1,y+1); } VscrnIsDirty(VTERM); } void wyse_backtab( VOID ) { int i; if ( !protect ) { /* Typewriter tabs */ i = wherex[VTERM]; if (i > 1) { do { i--; cursorleft(0); } while ((htab[i] != 'T') && (i >= 2)); /* if the current cell is a protected cell, we must move the current cursor to the first unprotected position. */ VscrnIsDirty(VTERM); } } else { /* Field tabs */ /* This code, because it uses Vscrn...() functions, uses 0-based * offsets instead of 1-based offsets as in where[xy] vars. */ int w = VscrnGetWidth(VTERM); int h = VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0); int x = wherex[VTERM]-1; int y = wherey[VTERM]-1; int field_found = 0; vtattrib vta = {0,0,0,0,0,1,0,0,0,0,0}; /* Protected */ /* First, we must find the beginning of the current field that we are on. */ /* Then we must find the end of the previous field. */ /* And finally we must find the beginning of that field and position the cursor. */ for ( ; y >= 0 ; y--,x=w-1 ) { for ( ; x >= 0 ; x-- ) { vta = VscrnGetVtCharAttr( VTERM, x, y ); if ( field_found == 1 ) { if (!vta.unerasable) field_found = 2; } else { if (vta.unerasable) { if ( field_found == 2 ) { field_found = 3; goto nextstep1; } else field_found = 1; } } } } nextstep1: if ( y == -1 ) { y = h-1; x = w-1; for ( ; y >= wherey[VTERM]-1 ; y--, x=w-1 ) { for ( ; y == wherey[VTERM]-1 ? (x > wherex[VTERM]-1) : (x >= 0); x-- ) { vta = VscrnGetVtCharAttr( VTERM, x, y ) ; if ( field_found == 1 ) { if (!vta.unerasable) field_found = 2; } else { if (vta.unerasable) { if ( field_found == 2 ) { field_found = 3; goto nextstep2; } else field_found = 1; } } } } } nextstep2: if ( field_found == 3 ) { x++; if ( x == w ) { x = 0; y++; if ( y == h ) y = 0; } lgotoxy(VTERM,x+1,y+1); VscrnIsDirty(VTERM); } } } void wysectrl( int ch ) { int i,j; if ( !xprint ) { switch ( ch ) { case ETX: debug(F110,"Wyse Ctrl","keylock off",0); if ( debses ) break; if ( wy_enhanced ) keylock = FALSE ; break; case EOT: debug(F110,"Wyse Ctrl","keylock on",0); if ( debses ) break; if ( wy_enhanced ) keylock = TRUE ; break; case ENQ: debug(F110,"Wyse Ctrl","Request Answerback String",0); if ( debses ) break; if (tt_answer) sendchars(answerback,strlen(answerback)) ; break; case ACK: debug(F110,"Wyse Ctrl","Cursor Right",0); if ( debses ) break; if ( wy_enhanced ) cursorright(0); break; case BEL: debug(F110,"Wyse Ctrl","Ring Bell",0); if ( debses ) break; bleep(BP_BEL); break; case BS: debug(F110,"Wyse Ctrl","Cursor Left",0); if ( debses ) break; cursorleft(0) ; break; case HT: debug(F110,"Wyse Ctrl","Horizontal Tab",0); if ( debses ) break; wyse_tab(); break; case LF: debug(F110,"Wyse Ctrl","Line Feed",0); if ( debses ) break; if ( autoscroll && !protect || wherey[VTERM] < marginbot ) wrtch((char) LF); break; case VT: debug(F110,"Wyse Ctrl","Cursor Up",0); if ( debses ) break; cursorup(0) ; break; case FF: debug(F110,"Wyse Ctrl","Cursor Right",0); if ( debses ) break; cursorright(0) ; break; case CR: debug(F110,"Wyse Ctrl","Carriage Return",0); if ( debses ) break; wrtch((char) CR); break; case SO: debug(F110,"Wyse Ctrl","keylock off",0); if ( debses ) break; keylock = FALSE ; break; case SI: debug(F110,"Wyse Ctrl","keylock on",0); if ( debses ) break; keylock = TRUE ; break; case DLE: if ( !ISWY60(tt_type_mode) ) { if ( wy_enhanced ) { /* Address cursor to column */ int col = wyinc() ; debug(F111,"Wyse Ctrl","Address cursor to column",col); if ( debses ) break; lgotoxy(VTERM,col-31,wherey[VTERM]); } } else { CHAR ch; ch = wyinc() ; debug(F111,"Wyse Ctrl","Print single char (not implemented)",ch); if ( debses ) break; } break; case DC1: /* Enable transmission */ debug(F110,"Wyse Ctrl","Enable transmission",0); break; case DC2: /* WY30 defines this as Copy Print */ /* transparent printer with screen display */ debug(F110,"Wyse Ctrl","Copy Print On",0); if ( debses ) break; cprint = TRUE ; if ( !printon ) printeron() ; break; case DC3: /* Disable transmission */ debug(F110,"Wyse Ctrl","Disable Transmission",0); break; case DC4: /* Turn all print modes off */ debug(F110,"Wyse Ctrl","Print Off",0); if ( debses ) break; xprint = cprint = FALSE ; setaprint(FALSE); if ( !uprint && !xprint && !cprint && !aprint && printon ) printeroff(); break; case NAK: debug(F110,"Wyse Ctrl","Cursor Left",0); if ( debses ) break; if ( wy_enhanced ) cursorleft(0) ; break; case SYN: /* Cursordown - no scroll */ debug(F110,"Wyse Ctrl","Cursor Down",0); if ( debses ) break; cursordown(0) ; break; case ETB: /* Cursor Off */ debug(F110,"Wyse Ctrl","Cursor Off",0); if ( debses ) break; if ( wy_enhanced ) cursorena[VTERM] = FALSE; break; case CAN: /* Transparent print on */ debug(F110,"Wyse Ctrl","Transparent Print On",0); if ( debses ) break; if ( wy_enhanced ) { xprint = TRUE ; if ( !printon ) printeron() ; } break; case SUB: /* Clear unprotected page to spaces */ debug(F110,"Wyse Ctrl","Clear unprotected page to spaces",0); if ( debses ) break; if ( protect ) selclrscreen( VTERM, SP ) ; else clrscreen( VTERM, SP ) ; lgotoxy(VTERM,1,1); break; case ESC: debug(F110,"Wyse Ctrl","Initiate Escape Sequence",0); /* initiate escape sequence */ escstate = ES_GOTESC ; break; case XRS: /* Home cursor */ debug(F110,"Wyse Ctrl","Home Cursor",0); if ( debses ) break; lgotoxy(VTERM,1,1) ; break; case US: /* Cursor to start on next line */ debug(F110,"Wyse Ctrl","Cursor to Next Line",0); if ( debses ) break; if (autoscroll && !protect) { wrtch((CHAR)CR); wrtch((CHAR)LF); } break; } } else { /* xprint */ switch ( ch ) { case DC4: /* Turn all print modes off */ debug(F110,"Wyse Ctrl","Print Off",0); if ( debses ) break; xprint = cprint = FALSE ; setaprint(FALSE); if ( !uprint && !xprint && !cprint && !aprint && printon ) printeroff(); break; case ESC: /* initiate escape sequence */ debug(F110,"Wyse Ctrl","Initiate Escape Sequence",0); escstate = ES_GOTESC ; break; } } } vtattrib wysecharattr( int ch ) { vtattrib a ; a.blinking = FALSE; /* No blink */ a.bold = FALSE; /* No bold */ a.dim = FALSE; /* No dim */ a.invisible = FALSE; /* Visible */ a.underlined = FALSE; /* No underline */ a.reversed = FALSE; /* No reverse video */ a.unerasable = attrib.unerasable ; /* Erasable */ a.graphic = FALSE ; /* Not graphic character */ a.wyseattr = FALSE ; /* WYSE attribute */ debug(F111,"Wyse","Character Attribute",ch); switch ( ch ) { case '0': /* Normal */ break; case '1': /* Blank (no display) */ a.invisible = TRUE ; break; case '2': /* Blink */ a.blinking = TRUE ; break; case '3': /* Blank */ a.invisible = TRUE ; break; case '4': /* Reverse */ a.reversed = TRUE ; break; case '5': /* Reverse and Blank */ a.reversed = TRUE ; a.invisible = TRUE ; break; case '6': /* Reverse and Blink */ a.reversed = TRUE ; a.blinking = TRUE ; break; case '7': /* Reverse, blink?, and blank */ a.reversed = TRUE ; a.blinking = TRUE ; a.invisible = TRUE ; break; case '8': /* Underscore */ a.underlined = TRUE ; break; case '9': /* Underscore and blank */ a.underlined = TRUE ; a.invisible = TRUE ; break; case ':': /* Underscore and blink */ a.underlined = TRUE ; a.blinking = TRUE ; break; case ';': /* Underscore, blink, and blank */ a.underlined = TRUE ; a.blinking = TRUE ; a.invisible = TRUE ; break; case '<': /* Underscore and Reverse */ a.underlined = TRUE ; a.reversed = TRUE ; break; case '=': /* Underscore, Reverse, and blank */ a.underlined = TRUE ; a.reversed = TRUE ; a.invisible = TRUE; break; case '>': /* Underscore, Reverse, and blink */ a.underlined = TRUE ; a.reversed = TRUE ; a.blinking = TRUE ; break; case '?': /* Underscore, Reverse, Blink, and Blank */ a.underlined = TRUE ; a.reversed = TRUE ; a.blinking = TRUE ; a.invisible = TRUE ; break; case 'p': /* Dim */ a.dim = TRUE ; break; case 'q': /* Dim and Blank */ a.dim = TRUE ; a.invisible = TRUE ; break; case 'r': /* Dim and Blink */ a.dim = TRUE ; a.blinking = TRUE ; break; case 's': /* Dim, Blink?, and Blank */ a.dim = TRUE ; a.blinking = TRUE ; a.invisible = TRUE ; break; case 't': /* Dim and Reverse */ a.dim = TRUE ; a.reversed = TRUE ; break; case 'u': /* Dim, Reverse, and Blank */ a.dim = TRUE ; a.reversed = TRUE ; a.invisible = TRUE ; break; case 'v': /* Dim, Reverse, and Blink */ a.dim = TRUE ; a.reversed = TRUE ; a.blinking = TRUE ; break; case 'w': /* Dim, Reverse, Blink?, and Blank */ a.dim = TRUE ; a.reversed = TRUE ; a.blinking = TRUE ; a.invisible = TRUE ; break; case 'x': /* Dim and Underscore */ a.dim = TRUE ; a.underlined = TRUE ; break; case 'y': /* Dim, Underscore, and Blank */ a.dim = TRUE ; a.underlined = TRUE ; a.invisible = TRUE ; break; case 'z': /* Dim, Underscore, and Blink */ a.dim = TRUE ; a.underlined = TRUE ; a.blinking = TRUE ; break; case '{': /* Dim, Underscore, Blink, and Blank */ a.dim = TRUE ; a.underlined = TRUE ; a.blinking = TRUE ; a.invisible = TRUE ; break; case '|': /* Dim, Underscore, and Reverse */ a.dim = TRUE ; a.underlined = TRUE ; a.reversed = TRUE ; break; case '}': /* Dim, Underscore, Reverse, and Blank */ a.dim = TRUE ; a.underlined = TRUE ; a.reversed = TRUE ; a.invisible = TRUE ; break; case '~': /* Dim, Underscore, Reverse, and Blink */ a.dim = TRUE ; a.underlined = TRUE ; a.reversed = TRUE ; a.blinking = TRUE ; break; } return a; } USHORT wyselineattr( int ch ) { USHORT lineattr = 0 ; debug(F111,"Wyse","Line Attribute",ch); switch ( ch ) { case '@': lineattr = VT_LINE_ATTR_NORMAL ; break; case 'A': lineattr = VT_LINE_ATTR_DOUBLE_WIDE ; break; case 'B': lineattr = VT_LINE_ATTR_DOUBLE_HIGH | VT_LINE_ATTR_UPPER_HALF ; break; case 'C': lineattr = VT_LINE_ATTR_DOUBLE_HIGH | VT_LINE_ATTR_LOWER_HALF ; break; case 'D': lineattr = VT_LINE_ATTR_DOUBLE_HIGH | VT_LINE_ATTR_UPPER_HALF | VT_LINE_ATTR_DOUBLE_WIDE ; break; case 'E': lineattr = VT_LINE_ATTR_DOUBLE_HIGH | VT_LINE_ATTR_LOWER_HALF | VT_LINE_ATTR_DOUBLE_WIDE ; break; } return lineattr ; } USHORT wyselinebg( int ch ) { USHORT linebg = 0; debug(F111,"Wyse","Line Background",ch); switch ( ch ) { case 'G': linebg = WY_LINE_ATTR_BG_NORMAL ; break; case 'H': linebg = WY_LINE_ATTR_BG_BOLD ; break; case 'I': linebg = WY_LINE_ATTR_BG_INVISIBLE ; break; case 'J': linebg = WY_LINE_ATTR_BG_DIM ; break; } return linebg; } void ApplyPageAttribute( int vmode, int x, int y, vtattrib vta ) { vtattrib oldvta, prevvta ; int rc ; RequestVscrnMutex( vmode, SEM_INDEFINITE_WAIT ) ; prevvta = VscrnGetVtCharAttr( vmode, x-1, y-1 ) ; if ( !tt_hidattr || ISHP(tt_type_mode) ) vta.wyseattr = TRUE ; VscrnSetVtCharAttr( vmode, x-1, y-1, vta ) ; vta.wyseattr = FALSE ; oldvta = prevvta ; while ( TRUE ) { if ( ++x > VscrnGetWidth(vmode) ) { if ( ++y > marginbot ) { break ; /* we are done */ } x = 1 ; } /* Retrieve the attributes of the new position */ oldvta = VscrnGetVtCharAttr( vmode, x-1, y-1 ) ; if ( (!tt_hidattr || ISHP(tt_type_mode)) && oldvta.wyseattr) break; if ( oldvta.unerasable && protect) continue; if ( tt_hidattr && (oldvta.reversed != prevvta.reversed || oldvta.blinking != prevvta.blinking || oldvta.underlined != prevvta.underlined || oldvta.bold != prevvta.bold || oldvta.invisible != prevvta.invisible || oldvta.dim != prevvta.dim)) break; vta.unerasable = oldvta.unerasable; VscrnSetVtCharAttr( vmode, x-1, y-1, vta ) ; } ReleaseVscrnMutex( vmode ) ; } void ApplyLineAttribute( int vmode, int x, int y, vtattrib vta ) { vtattrib oldvta, prevvta ; RequestVscrnMutex( vmode, SEM_INDEFINITE_WAIT ) ; prevvta = VscrnGetVtCharAttr( vmode, x-1, y-1 ) ; if ( !tt_hidattr || ISHP(tt_type_mode) ) vta.wyseattr = TRUE ; VscrnSetVtCharAttr( vmode, x-1, y-1, vta ) ; vta.wyseattr = FALSE ; oldvta = prevvta ; for ( x++ ; x <= VscrnGetWidth(vmode); x++ ) { /* Retrieve the attributes of the new position */ oldvta = VscrnGetVtCharAttr( vmode, x-1, y-1 ) ; if ( (!tt_hidattr || ISHP(tt_type_mode)) && oldvta.wyseattr) break; if ( oldvta.unerasable ) continue; if ( tt_hidattr && (oldvta.reversed != prevvta.reversed || oldvta.blinking != prevvta.blinking || oldvta.underlined != prevvta.underlined || oldvta.bold != prevvta.bold || oldvta.invisible != prevvta.invisible || oldvta.dim != prevvta.dim)) break; vta.unerasable = oldvta.unerasable; VscrnSetVtCharAttr( vmode, x-1, y-1, vta ) ; } ReleaseVscrnMutex( vmode ) ; } char * wysedefkey( int key ) { debug(F111,"Wyse","Define Key to Default",key); #ifndef NOKVERBS switch ( key + K_WYF01 ) { case K_WYF01: return strdup("\01@\r"); /* F1 */ case K_WYF02: return strdup("\01A\r"); case K_WYF03: return strdup("\01B\r"); case K_WYF04: return strdup("\01C\r"); case K_WYF05: return strdup("\01D\r"); case K_WYF06: return strdup("\01E\r"); case K_WYF07: return strdup("\01F\r"); case K_WYF08: return strdup("\01G\r"); case K_WYF09: return strdup("\01H\r"); case K_WYF10: return strdup("\01I\r"); case K_WYF11: return strdup("\01J\r"); case K_WYF12: return strdup("\01K\r"); case K_WYF13: return strdup("\01L\r"); case K_WYF14: return strdup("\01M\r"); case K_WYF15: return strdup("\01N\r"); case K_WYF16: return strdup("\01O\r"); case K_WYF17: return strdup("\01P\r"); case K_WYF18: return strdup("\01Q\r"); case K_WYF19: return strdup("\01R\r"); case K_WYF20: return strdup("\01S\r"); /* F20 */ case K_WYSF01: return strdup("\01`\r"); /* Shift-F1 */ case K_WYSF02: return strdup("\01a\r"); case K_WYSF03: return strdup("\01b\r"); case K_WYSF04: return strdup("\01c\r"); case K_WYSF05: return strdup("\01d\r"); case K_WYSF06: return strdup("\01e\r"); case K_WYSF07: return strdup("\01f\r"); case K_WYSF08: return strdup("\01g\r"); case K_WYSF09: return strdup("\01h\r"); case K_WYSF10: return strdup("\01i\r"); case K_WYSF11: return strdup("\01j\r"); case K_WYSF12: return strdup("\01k\r"); case K_WYSF13: return strdup("\01l\r"); case K_WYSF14: return strdup("\01m\r"); case K_WYSF15: return strdup("\01n\r"); case K_WYSF16: return strdup("\01o\r"); case K_WYSF17: return strdup("\01p\r"); case K_WYSF18: return strdup("\01q\r"); case K_WYSF19: return strdup("\01r\r"); case K_WYSF20: return strdup("\01s\r"); /* Shift-F20 */ case K_WYBS : return strdup("\x08"); /* Backspace */ case K_WYCLRLN : return strdup("\x1BT"); /* Clr Line */ case K_WYSCLRLN : return strdup("\x1Bt"); /* Shift Clr Line */ case K_WYCLRPG : return strdup("\x1BY"); /* Clr Page */ case K_WYSCLRPG : return strdup("\x1By"); /* Shift Clr Page */ case K_WYDELCHAR: return strdup("\x1BW"); /* Del Char */ case K_WYDELLN : return strdup("\x1BR"); /* Del Line */ case K_WYENTER : return strdup("\x0D"); /* Enter */ case K_WYESC : return strdup("\x1B"); /* Escape */ case K_WYHOME : return strdup("\x1E"); /* Home */ case K_WYSHOME : return strdup("\x1B{"); /* Shift Home */ case K_WYINSERT : return strdup("\x1Bq"); /* Insert */ case K_WYINSCHAR: return strdup("\x1BQ"); /* Ins Char */ case K_WYINSLN : return strdup("\x1B\x45"); /* Ins Line */ case K_WYPGNEXT : return strdup("\x1BK"); /* Page Next*/ case K_WYPGPREV : return strdup("\x1BJ"); /* Page Prev*/ case K_WYREPLACE: return strdup("\x1Br"); /* Replace */ case K_WYRETURN: return strdup("\x0D"); /* Return */ case K_WYTAB : return strdup("\x09"); /* Tab */ case K_WYSTAB : return strdup("\x1BI"); /* Shift Tab */ case K_WYPRTSCN: return strdup("\x1BP"); /* Print Screen */ case K_WYSESC : return NULL; /* Shift Esc */ case K_WYSBS : return strdup("\x08"); /* Shift BS */ case K_WYSENTER : return NULL ; /* Shift Enter */ case K_WYSRETURN: return NULL ; /* Shift Return */ case K_WYUPARR : return strdup("\x0b"); /* Up Arrow - VT */ case K_WYDNARR : return strdup("\x0a"); /* Dn Arrow - LF */ case K_WYLFARR : return strdup("\x08"); /* Left Arrow - BS */ case K_WYRTARR : return strdup("\x0c"); /* Right Arrow - NL */ case K_WYSUPARR: return NULL ; /* Shift Up Arrow */ case K_WYSDNARR: return NULL ; /* Shift Dn Arrow */ case K_WYSLFARR: return NULL ; /* Shift Left Arrow */ case K_WYSRTARR: return NULL ; /* Shift Right Arrow */ case K_WYSEND : return strdup("\x1B\x37"); /* Send */ case K_WYSSEND: return NULL ; /* Shift Send */ default: debug(F111,"Wyse","Key undefined",key); return NULL ; } #else return(NULL); #endif /* NOKVERBS */ } void wyseascii( int ch ) { int i,j,k,n,x,y,z; vtattrib attr ; viocell blankvcell; if (printon && (is_xprint() || is_uprint())) prtchar(ch); if ( escstate == ES_GOTESC )/* Process character as part of an escstate sequence */ { if ( ch < SP ) { escstate = ES_NORMAL ; wysectrl(ch) ; } else { escstate = ES_ESCSEQ ; if ( !xprint ) { switch ( ch ) { case SP: /* Reports the terminal identification to the */ /* Host computer */ debug(F110,"Wyse Escape","Terminal ID Request",0); if ( !debses ) sendchars( tt_info[tt_type].x_id, strlen(tt_info[tt_type].x_id) ) ; break; case '!': if ( !ISWY60(tt_type_mode) ) { /* Writes all unprotected character positions with */ /* a specified attribute code. This has a format of */ /* ESC ! ATTR where ATTR = attribute code. */ /* This is not supported by the Wyse 60 */ int xs = VscrnGetWidth(VTERM); int ys = VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0); vtattrib vta ; debug(F110,"Wyse Escape","Write Unprotected with Attribute",0); ch = wyinc(); switch ( ch ) { case SP: { if ( debses ) break; if ( protect ) selclrscreen( VTERM, SP ) ; else clrscreen( VTERM, SP ); lgotoxy(VTERM,1,1); /* and home the cursor */ break; } case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '<': case '=': case '>': case '?': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '{': case '|': case '}': case '~': { attr = wysecharattr( ch ) ; if ( debses ) break; for ( y = 0 ; y < ys ; y++ ) for ( x = 0 ; x < xs ; x++ ) { vta = VscrnGetVtCharAttr( VTERM, x, y ) ; if ( !protect || !vta.unerasable ) VscrnSetVtCharAttr( VTERM, x, y, attr ) ; } break; } } } break; case '"': /* Unlocks the keyboard */ debug(F110,"Wyse Escape","keylock off",0); if ( !debses ) keylock = FALSE ; break; case '#': /* Locks the keyboard */ debug(F110,"Wyse Escape","keylock on",0); if ( !debses ) keylock = TRUE ; break; case '$': debug(F110,"Wyse Escape","$",0); break; case '%': debug(F110,"Wyse Escape","%",0); break; case '&': /* Turns the protect submode on and prevents the auto */ /* scroll operation */ debug(F110,"Wyse Escape","Protect On",0); if ( !debses ) protect = TRUE ; break; case '\'': /* Turns the protect submode off and allows the auto */ /* scroll operation */ debug(F110,"Wyse Escape","Protect Off",0); if ( !debses ) protect = FALSE ; break; case '(': /* Turns the write protect submode off */ debug(F110,"Wyse Escape","Write Protect Off",0); if ( debses || !writeprotect ) break; writeprotect = FALSE ; attrib.unerasable = FALSE; break; case ')': /* Turns the write protect submode on */ debug(F110,"Wyse Escape","Write Protect On",0); if ( debses || writeprotect ) break; writeprotect = TRUE ; attrib.unerasable = TRUE ; break; case '*': /* Clears the screen to nulls. */ /* The protect submode is turned off */ debug(F110,"Wyse Escape","Clear screen to NUL; Protect Off; Home Cursor",0); if ( debses ) break; protect = FALSE ; writeprotect = FALSE ; insertmode = FALSE ; clrscreen( VTERM, NUL ) ; lgotoxy(VTERM,1,1); /* and home the cursor */ break; case '+': /* Clears the screen to spaces. */ /* The protect submode is turned off */ debug(F110,"Wyse Escape","Clear screen to SP; Protect Off; Home Cursor",0); if ( debses ) break; attrib.unerasable = FALSE; protect = FALSE ; writeprotect = FALSE ; insertmode = FALSE ; clrscreen( VTERM, SP ); lgotoxy(VTERM,1,1); /* and home the cursor */ break; case ',': { /* Clears the screen to protected spaces. */ /* The protect submode is turned off */ /* Home Cursor */ int xs = VscrnGetWidth(VTERM); int ys = VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0); vtattrib vta = {0,0,0,0,0,1,0,0,0,0,0}; /* Protected */ debug(F110,"Wyse Escape","Clear screen to Protected SP; Protect Off; Home Cursor",0); if ( debses ) break; clrscreen( VTERM, SP ) ; lgotoxy(VTERM,1,1); /* and home the cursor */ for ( y = 0 ; y < ys ; y++ ) for ( x = 0 ; x < xs ; x++ ) VscrnSetVtCharAttr( VTERM, x, y, vta ) ; protect = FALSE ; writeprotect = FALSE ; insertmode = FALSE ; break; } case '-': { /* Moves the cursor to a specified text segment. */ /* This has a multiple code sequence of: */ /* ESC - nrc */ /* where n = the text segment number, 0 or 1 */ /* r = the row code */ /* c = the column code */ int n,r,c ; debug(F110,"Wyse Escape","Move cursor to text segment",0); n = wyinc(); r = wyinc(); c = wyinc(); if ( debses ) break; if ( n == WY_FIELD_APPL ) lgotoxy(VTERM,c-31,r-31); break; } case '.': { /* Clears all unprotected character positions with */ /* a specified character code. This has a format of: */ /* ESC . CODE where CODE = the character hex value */ /* Use protected characters if write-protect mode is on */ int xs = VscrnGetWidth(VTERM); int ys = VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0); vtattrib vta = {0,0,0,0,0,1,0,0,0,0,0}; /* Protected */ int C1, C2, C ; debug(F110,"Wyse Escape","Clear unprotected chars with code",0); C1 = wyinc() ; C2 = wyinc() ; if ( debses ) break; C = unhex(C1) * 16 + unhex(C2) ; if ( protect ) selclrscreen(VTERM, C) ; else clrscreen( VTERM, C ) ; lgotoxy(VTERM,1,1); /* and home the cursor */ if ( writeprotect ) { for ( y = 0 ; y < ys ; y++ ) for ( x = 0 ; x < xs ; x++ ) { vta = VscrnGetVtCharAttr( VTERM, x, y ) ; vta.unerasable = TRUE ; VscrnSetVtCharAttr( VTERM, x, y, vta ) ; } } protect = FALSE ; break; } case '/': { /* Transmits the active text segment number and cursor */ /* address. */ char buf[5] ; debug(F110,"Wyse Escape","Request Active Text Segment and Cursor Position",0); if ( debses ) break; buf[0] = 0; buf[1] = wherey[VTERM]+31 ; buf[2] = wherex[VTERM]+31 ; buf[3] = CR ; buf[4] = NUL ; sendchars( buf, 4 ) ; break; } case '0': /* Clears all tab settings */ debug(F110,"Wyse Escape","Clear all tab settings",0); if ( debses ) break; for (j = 1; j <=MAXTERMCOL; ++j) htab[j] = '0'; break; case '1': /* Sets a tab stop */ debug(F110,"Wyse Escape","Set tab stop",0); if ( debses ) break; htab[wherex[VTERM]] = 'T'; break; case '2': /* Clears a tab stop */ debug(F110,"Wyse Escape","Clear tab stop",0); if ( debses ) break; htab[wherex[VTERM]] = '0'; break; case '3': /* Clears all tab stops - WY30 */ debug(F110,"Wyse Escape","Clear all tab stops",0); if ( debses ) break; for (j = 1; j <=MAXTERMCOL; ++j) htab[j] = '0'; break; case '4': { /* Sends all unprotected characters from the start-of-row */ /* to the host computer. */ int x, fs=1 ; debug(F110,"Wyse Escape","Send all unprotected chars from BOL",0); if ( debses ) break; for ( x=0;x<=wherex[VTERM]-1;x++ ) { if ( !VscrnGetVtCharAttr(VTERM, x, wherey[VTERM]-1).unerasable ) { int ch = VscrnGetCell( VTERM, x, wherey[VTERM]-1 )->c ; if ( ch || !wy_nullsuppress ) { if ( tt_senddata ) { unsigned char * bytes; int nbytes; if ( isunicode() ) nbytes = utorxlat(ch,&bytes); else nbytes = utorxlat(ch,&bytes); while ( nbytes-- > 0 ) sendchar(*bytes++) ; } else sendchar(SP); } fs = 0 ; } else if ( !fs ) { sendchar(XFS); fs = 1 ; } } switch ( wy_blockend ) { case EOB_CRLF_ETX: sendchar(ETX); break; case EOB_US_CR: sendchar(CR); break; } break; } case '5': { /* Sends all unprotected characters from the start-of-text */ /* to the host computer */ int x,y,fs=1 ; debug(F110,"Wyse Escape","Send all unprotected chars from BOS",0); if ( debses ) break; for ( y=0;y<=wherey[VTERM]-1; y++ ) { int xe; if (y == wherey[VTERM]-1) xe = wherex[VTERM]-1; else xe = VscrnGetWidth(VTERM)-1; for ( x=0;x<=xe;x++ ) if ( !VscrnGetVtCharAttr(VTERM, x, y).unerasable ) { int ch = VscrnGetCell( VTERM, x, y )->c ; if ( ch || !wy_nullsuppress ) { if ( tt_senddata ) { unsigned char * bytes; int nbytes; if ( isunicode() ) nbytes = utorxlat(ch,&bytes); else nbytes = utorxlat(ch,&bytes); while ( nbytes-- > 0 ) sendchar(*bytes++) ; } else sendchar(SP); } fs = 0 ; } else if ( !fs ) { sendchar(XFS); fs = 1 ; } if ( y < wherey[VTERM]-1 ) { switch ( wy_blockend ) { case EOB_CRLF_ETX: sendchar(CR); sendchar(LF); break; case EOB_US_CR: sendchar(US); break; } } } switch ( wy_blockend ) { case EOB_CRLF_ETX: sendchar(ETX); break; case EOB_US_CR: sendchar(CR); break; } break; } case '6': { /* Sends all characters from the start-of-row to the host */ /* computer */ int x, fs=0, ch=0 ; debug(F110,"Wyse Escape","Send all chars from BOL",0); if ( debses ) break; for ( x=0;x<=wherex[VTERM];x++ ) { if ( !VscrnGetVtCharAttr(VTERM, x, wherey[VTERM]-1).unerasable ) { if ( fs ) { sendchars("\x1b(",2); fs = 0; } } else if ( !fs ) { sendchars("\x1b)",2); fs = 1 ; } ch = VscrnGetCell( VTERM, x, wherey[VTERM]-1 )->c ; if ( ch || !wy_nullsuppress ) { if ( tt_senddata ) { unsigned char * bytes; int nbytes; if ( isunicode() ) nbytes = utorxlat(ch,&bytes); else nbytes = utorxlat(ch,&bytes); while ( nbytes-- > 0 ) sendchar(*bytes++) ; } else sendchar(SP); } } switch ( wy_blockend ) { case EOB_CRLF_ETX: sendchar(ETX); break; case EOB_US_CR: sendchar(CR); break; } break; } case '7': { /* Sends all characters from the start-of-text to the host */ /* computer */ int x,y,fs=0,ch=0; debug(F110,"Wyse Escape","Send all chars from BOS",0); if ( debses ) break; for ( y=0;y<=wherey[VTERM]-1; y++ ) { int xe; if (y == wherey[VTERM]-1) xe = wherex[VTERM]-1; else xe = VscrnGetWidth(VTERM)-1; for ( x=0;x<=xe;x++ ) { if ( !VscrnGetVtCharAttr(VTERM, x, y).unerasable ) { if ( fs ) { sendchars("\x1b(",2); fs = 0; } } else if ( !fs ) { sendchars("\x1b)",2); fs = 1 ; } ch = VscrnGetCell( VTERM, x, y )->c; if ( ch || !wy_nullsuppress ) { if ( tt_senddata ) { unsigned char * bytes; int nbytes; if ( isunicode() ) nbytes = utorxlat(ch,&bytes); else nbytes = utorxlat(ch,&bytes); while ( nbytes-- > 0 ) sendchar(*bytes++) ; } else sendchar(SP); } } if ( y < wherey[VTERM]-1 ) { switch ( wy_blockend ) { case EOB_CRLF_ETX: sendchar(CR); sendchar(LF); break; case EOB_US_CR: sendchar(US); break; } } } switch ( wy_blockend ) { case EOB_CRLF_ETX: sendchar(ETX); break; case EOB_US_CR: sendchar(CR); break; } break; } case '8': /* Enters a start-of-message character (STX) */ debug(F110,"Wyse Escape","Enter Start of message Char",0); if ( debses ) break; wrtch(STX); break; case '9': /* Enters an end-of-message character (ETX) */ debug(F110,"Wyse Escape","Enter End of message Char",0); if ( debses ) break; wrtch(ETX); break; case ':': /* Clears all unprotected characters to nulls */ /* Home Cursor */ debug(F110,"Wyse Escape","Clear all unprotected chars to NUL; Home Cursor",0); if ( debses ) break; if ( protect ) selclrscreen(VTERM,NUL); else clrscreen( VTERM, NUL ) ; lgotoxy(VTERM,1,1); break; case ';': /* Clears all unprotected characters to spaces */ /* Home Cursor */ debug(F110,"Wyse Escape","Clear all unprotected chars to SP; Home Cursor",0); if ( debses ) break; if ( protect ) selclrscreen(VTERM,SP); else clrscreen( VTERM, SP ); lgotoxy(VTERM,1,1); break; case '<': /* Turn off keyclick - WY30 */ debug(F110,"Wyse Escape","keyclick Off",0); if ( debses ) break; if ( wy_enhanced ) setkeyclick(FALSE); break; case '=': { /* Moves the cursor to a specified row and column for */ /* an 80-column screen. This has a format of: */ /* ESC = rc where */ /* r = the row code; and c = the column code */ int r,c ; debug(F110,"Wyse Escape","Move cursor to row and column (80)",0); r = wyinc() ; if ( r < SP ) { escstate = ES_NORMAL ; wyseascii(r) ; return ; } c = wyinc() ; if ( c < SP ) { escstate = ES_NORMAL ; wyseascii(c) ; return ; } if ( debses ) break; if ( /* VscrnGetWidth(VTERM) == 80 && */ c > 31 && r > 31 ) lgotoxy(VTERM,c-31,r-31); else { break; } break; } case '>': /* Turn on keyclick - WY30 */ debug(F110,"Wyse Escape","keyclick on ",0); if ( debses ) break; if ( wy_enhanced ) setkeyclick(TRUE); break; case '?': /* Transmits the cursor address for the active text */ /* segment of an 80-column screen only. The format is */ /* rc CR where r = the row code; and c = the column */ /* code. */ debug(F110,"Wyse Escape","Request Cursor Position (80)",0); if ( debses ) break; if ( 1 /* VscrnGetWidth(VTERM) == 80 */ ) { char buf[4] ; buf[0] = (char)(wherey[VTERM]+31) ; buf[1] = (char)(wherex[VTERM]+31) ; buf[2] = CR ; buf[3] = NUL ; sendchars(buf,3) ; } break; case '@': /* Sends all unprotected characters from the start-of-text */ /* to the auxiliary port. Each row is terminated with: */ /* CR LF NULL */ debug(F110,"Wyse Escape","Send all unprotected chars from BOS to AUX",0); break; case 'A': { /* Sets a video attribute for a specific message field or */ /* the entire application display area. This has a */ /* multiple code sequence of ESC A n ATTR where: */ /* n = field code; ATTR = attribute code */ int field = wyinc() ; int n = wyinc(); debug(F110,"Wyse Escape", "Set attribute for message field or entire display",0); if ( debses ) break; if ( n == SP ) { if ( field == WY_FIELD_APPL ) { wrtch(tt_sac); } } else { attr = wysecharattr( n ) ; if ( field == WY_FIELD_APPL ) { if ( attrmode == ATTR_PAGE_MODE ) { int x = wherex[VTERM]; int y = wherey[VTERM]; if ( !tt_hidattr ) wrtch(tt_sac) ; ApplyPageAttribute( VTERM, x, y, attr ) ; } else if ( attrmode == ATTR_LINE_MODE ) { int x = wherex[VTERM]; int y = wherey[VTERM]; if ( !tt_hidattr ) wrtch(tt_sac) ; ApplyLineAttribute( VTERM, x, y, attr ) ; } /* set attribute for additional chars */ attrib = attr ; } } break; } case 'B': /* Places the terminal in the block mode. */ debug(F110,"Wyse Escape","Enter Block Mode",0); if ( debses ) break; wy_block = TRUE; break; case 'C': /* Places ther terminal in a conversational mode */ debug(F110,"Wyse Escape","Enter Conversational Mode",0); if ( debses ) break; wy_block = FALSE; break; case 'D': { /* Selects the full duplex or half-duplex conversation */ /* modes. This has the multiple code sequence: */ /* ESC D x where x = F full duplex mode; H half duplex */ int n = wyinc(); if ( debses ) break; switch ( n ) { case 'F': debug(F110,"Wyse Escape","Full Duplex Mode",0); if ( duplex_sav < 0 ) duplex_sav = duplex ; duplex = FALSE ; break; case 'H': debug(F110,"Wyse Escape","Half Duplex Mode",0); if ( duplex_sav < 0 ) duplex_sav = duplex ; duplex = TRUE ; break; } break; } case 'E': /* Inserts a row of spaces */ debug(F110,"Wyse Escape","Insert row of spaces",0); if ( debses ) break; if ( !protect ) VscrnScroll(VTERM, DOWNWARD, wherey[VTERM] - 1, marginbot - 1, 1, FALSE, SP); break; case 'F': { /* Enters a message in the host message field. This has */ /* a format of: ESC F aaaa CR where */ /* aaaa = a character string of up to 46 characters */ /* for an 80-column screen or up to 100 */ /* characters for a 132-column screen */ /* This is also known as the Title Bar. So set window title */ char buf[102] = "" ; int n = 0 ; debug(F110,"Wyse Escape","Enter message into message field",0); for ( ; n < ((VscrnGetWidth(VTERM)<=80)?46:100); n++ ) { buf[n] = wyinc(); if ( buf[n] == CR ) break; } buf[n] = '\0'; if ( debses ) break; /* assign buf to host message field */ os2settitle(buf,1); break; } case 'G': { /* Sets a video attribute within the application display */ /* area. The attribute occupies a space. This has a */ /* multiple code sequence of: ESC G ATTR where: */ /* ATTR = attribute code. */ int n = wyinc() ; debug(F110,"Wyse Escape","Set attribute within display area",0); if ( debses ) break; switch ( n ) { case SP: if ( tt_hidattr ) { n = '0'; /* Same as normal */ } else { wrtch(tt_sac) ; break; } case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '<': case '=': case '>': case '?': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '{': case '|': case '}': case '~':{ attr = wysecharattr( n ) ; if ( attrmode == ATTR_PAGE_MODE ) { int x = wherex[VTERM]; int y = wherey[VTERM]; if ( !tt_hidattr ) wrtch(tt_sac) ; ApplyPageAttribute( VTERM, x, y, attr ) ; } else if ( attrmode == ATTR_LINE_MODE ) { int x = wherex[VTERM]; int y = wherey[VTERM]; if ( !tt_hidattr ) wrtch(tt_sac) ; ApplyLineAttribute( VTERM, x, y, attr ) ; } attrib = attr ; break; } case '@': case 'A': case 'B': case 'C': case 'D': case 'E': { wyselineattr( n ) ; if ( !tt_hidattr && (attrmode == ATTR_PAGE_MODE || attrmode == ATTR_LINE_MODE) ) wrtch(tt_sac) ; break; } case 'G': case 'H': case 'I': case 'J': { wyselinebg( n ) ; if ( !tt_hidattr && (attrmode == ATTR_PAGE_MODE || attrmode == ATTR_LINE_MODE) ) wrtch(tt_sac) ; break; } } break; } case 'H': { /* Enters a graphic character at the cursor locations. */ /* This has a multiple code sequence of ESC H x where */ /* x = the graphic character code */ /* ESC H STX (CTRL B) turns on the graphic submode */ /* ESC H ETX (CTRL C) turns off the graphic submode */ int x = wyinc(), gch = NUL ; switch ( x ) { case 2: debug(F110,"Wyse Escape","Graphic Chars On",0); if ( debses ) break; wysegraphics = TRUE ; break; case 3: debug(F110,"Wyse Escape","Graphic Chars Off",0); if ( debses ) break; wysegraphics = FALSE ; break; default: debug(F110,"Wyse Escape","Enter Graphic Char",0); if ( debses ) break; gch = xlwygrph(x); if ( gch ) wrtch( gch ) ; else { escstate = ES_NORMAL ; wyseascii(x); return ; } } break; } case 'I': /* Moves the cursor left to the previous tab stop */ debug(F110,"Wyse Escape","Reverse tab",0); if ( debses ) break; wyse_backtab(); break; case 'J': /* Activates the alternate text segment */ debug(F110,"Wyse Escape","Activate alternate text segment",0); break; case 'K': /* Activates the alternate text segment. Same as ESC J */ debug(F110,"Wyse Escape","Activate alternate text segment",0); break; case 'L': /* Sends all characters unformatted to the auxiliary port. */ /* Attribute codes are sent as spaces. Row-end */ /* sequences are not sent. Same as ESC p. */ debug(F110,"Wyse Escape","Send all chars unformatted to AUX ",0); break; case 'M': /* Cause the terminal to send the character at the cursor */ /* position to the host computer. */ debug(F110,"Wyse Escape","Send current char to host",0); if ( debses ) break; if ( tt_senddata ) { unsigned char * bytes; int nbytes; unsigned short ch = VscrnGetCell( VTERM, wherex[VTERM]-1, wherey[VTERM]-1 )->c; if ( isunicode() ) nbytes = utorxlat(ch,&bytes); else nbytes = utorxlat(ch,&bytes); while ( nbytes-- > 0 ) sendchar(*bytes++) ; } else sendchar(SP); break; case 'N': /* turns the no scroll submode on */ debug(F110,"Wyse Escape","No Scroll on",0); if ( debses ) break; autoscroll = FALSE ; break; case 'O': /* Turns the no scroll submode off */ debug(F110,"Wyse Escape","No Scroll off",0); if ( debses ) break; autoscroll = TRUE ; break; case 'P': { /* Sends all protected and unprotected characters to the */ /* auxiliary port, regardless of the mode setting. */ int x; debug(F110,"Wyse Escape","Send all chars to AUX",0); if ( debses ) break; x = xprintff; xprintff = 0; /* Print/Dump current screen */ prtscreen(VTERM,1,VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0)); xprintff = x; if ( wy_enhanced ) ttoc(ACK); break; } case 'Q': /* Inserts a space. */ debug(F110,"Wyse Escape","Insert SP",0); if ( debses ) break; blankvcell.c = SP; blankvcell.a = geterasecolor(VTERM); VscrnScrollRt(VTERM, wherey[VTERM] - 1, wherex[VTERM] - 1, wherey[VTERM] - 1, VscrnGetWidth(VTERM) - 1, 1, blankvcell); break; case 'R': /* Deletes a row. */ debug(F110,"Wyse Escape","Delete a row",0); if ( debses ) break; VscrnScroll(VTERM, UPWARD, wherey[VTERM] - 1, marginbot - 1, 1, FALSE, SP); break; case 'S': { /* Sends a message unprotected */ int x,y,ch, w=VscrnGetWidth(VTERM), h=VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0), xs=-1, ys=-1, xe=w-1, ye=h-1, fs=1 ; debug(F110,"Wyse Escape","Send a message unprotected",0); if ( debses ) break; /* First figure out if we have markers, STX then ETX */ for ( y=0;yc ; if ( ch == STX && xs < 0 && ys < 0 ) { xs = x+1 ; ys = y ; } else if ( ch == ETX && xs >= 0 && ys >= 0 ) { xe = x-1 ; ye = y ; break; } } if ( xs < 0 || ys < 0 ) { xs = 0 ; ys = 0 ; } /* Now send the data */ for ( y=ys;y<=ye; y++ ) { for ( x=(y==ys)?xs:0 ; x <= (y==ye?xe:w-1) ; x++ ) if ( !VscrnGetVtCharAttr(VTERM, x, y).unerasable ) { ch = VscrnGetCell( VTERM, x, y )->c; if ( ch || !wy_nullsuppress ) { if ( tt_senddata ) { unsigned char * bytes; int nbytes; if ( isunicode() ) nbytes = utorxlat(ch,&bytes); else nbytes = utorxlat(ch,&bytes); while ( nbytes-- > 0 ) sendchar(*bytes++) ; } else sendchar(SP); } fs = 0 ; } else if ( !fs ) { sendchar(XFS); fs = 1 ; } if ( y < ye ) { switch ( wy_blockend ) { case EOB_CRLF_ETX: sendchar(CR); sendchar(LF); break; case EOB_US_CR: sendchar(US); break; } } } switch ( wy_blockend ) { case EOB_CRLF_ETX: sendchar(ETX); break; case EOB_US_CR: sendchar(CR); break; } break; } case 'T': /* Clear unprotected line to spaces from cursor - WY60 */ debug(F110,"Wyse Escape","Clear unprotected line to space from cursor",0); if ( debses ) break; if ( protect ) selclrtoeoln( VTERM, SP ) ; else clrtoeoln( VTERM, SP ) ; break; case 'U': /* Turns the monitor submode on */ debug(F110,"Wyse Escape","Monitor mode on",0); if ( debses || wy_monitor ) break; setdebses(TRUE); wy_monitor = TRUE ; break; case 'V': if ( ISWY60(tt_type_mode) ) { /* Clear cursor column - wy60 */ viocell cell = {SP,geterasecolor(VTERM)}; int ys = VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0); vtattrib vta = attrib; debug(F110,"Wyse Escape","Clear cursor column",0); if ( debses ) break; x = wherex[VTERM]-1 ; vta.unerasable = TRUE ; for ( y=wherey[VTERM]-1 ; y= 1 ; x-- ) { vta = VscrnGetVtCharAttr( VTERM, x-1, wherey[VTERM]-1 ) ; if ( vta.wyseattr ) { ApplyLineAttribute( VTERM, x, wherey[VTERM], vta ); return; } } ApplyLineAttribute( VTERM, 1, wherey[VTERM], vta ); } else if ( attrmode == ATTR_PAGE_MODE ) { /* Scan backward to beginning of screen to find previous */ /* cell which is an attribute. Then reapply it. */ int x,y; x = wherex[VTERM]-1; for ( y=wherey[VTERM]-1 ; y >= 1 ; y-- ) { for ( ; x >= 1 ; x-- ) { vta = VscrnGetVtCharAttr( VTERM, x-1, y-1 ) ; if ( vta.wyseattr ) { ApplyPageAttribute( VTERM, x, y, vta ); return; } } x = VscrnGetWidth( VTERM ); } ApplyPageAttribute( VTERM, 1, 1, vta ); } } break; } case 'X': /* Turns the monitor submode off */ debug(F110,"Wyse Escape","Monitor mode off",0); if ( !wy_monitor ) break; setdebses(FALSE); wy_monitor = FALSE ; break; case 'Y': if ( ISWY60(tt_type_mode) ) { /* clear unprotected page to space characters */ /* from cursor */ debug(F110,"Wyse Escape","Clear unprotected page to SP from cursor",0); if ( debses ) break; if ( protect ) selclreoscr_escape( VTERM, SP ) ; else clreoscr_escape( VTERM, SP ) ; } else { /* Erases all characters to the end of the active text */ /* segment and replaces them with spaces. */ debug(F110,"Wyse Escape","Clear all chars to end of segment with SP",0); if ( debses ) break; clreoscr_escape( VTERM, SP ) ; } /* ??? we really need to figure out what the last */ /* assigned attribute was so that we know what */ /* to assign to these cleared cells */ break; case 'Z': { /* ESC Z dir key sequence DEL = */ /* Program key direction and definition */ /* ESC Z ~ key = */ /* Read key direction and definition */ char keydef[256] = "" ; int dir = wyinc() ; int key = wyinc() ; int i=0,j=0 ; int keyi = -1 ; if ( dir == '~' ) { /* Report Key Definition to host */ debug(F110,"Wyse Escape","Report Key Definition to Host",0); if ( debses ) break; #ifndef NOSETKEY keydef[i++] = '1' ; /* Direction = remote */ keydef[i++] = key ; /* Key */ keydef[i] = NUL; /* So we can use strcat */ /* actual definition goes here */ if ( key >= '@' && key <= 'O' ) { keyi = key-'@'; } #ifndef NOKVERBS else if ( key >= '`' && key <= 'o' ) { keyi = key-'`'+K_WYSF01-K_WYF01 ; } else switch (key) { case '"': /* Backspace */ keyi = K_WYBS-K_WYF01 ; break; case '}': /* Clear Line */ keyi = K_WYCLRLN-K_WYF01; break; case 'z': /* Shift Clear Line - Clear Screen */ keyi = K_WYSCLRLN-K_WYF01; break; /* Clear Page */ /* Shift Clear Page */ case '5': /* Del Char */ keyi = K_WYDELCHAR-K_WYF01; break; case '6': /* Del Line */ keyi = K_WYDELLN-K_WYF01; break; case 's': /* Enter */ keyi = K_WYENTER-K_WYF01; break; case SP: /* Escape */ keyi = K_WYESC-K_WYF01; break; case '*': /* Home */ keyi = K_WYHOME-K_WYF01; break; case '/': /* Shift Home */ keyi = K_WYSHOME-K_WYF01; break; case '8': /* Shift Replace (Insert) */ keyi = K_WYINSERT-K_WYF01; break; case 'q': /* Insert Char */ keyi = K_WYINSCHAR-K_WYF01; break; case 'p': /* Insert Line */ keyi = K_WYINSLN-K_WYF01; break; case 'r': /* Page Next */ keyi = K_WYPGNEXT-K_WYF01; break; case 'w': /* Page Prev */ keyi = K_WYPGPREV-K_WYF01; break; case '7': /* Replace */ keyi = K_WYREPLACE-K_WYF01; break; case '$': /* Return */ keyi = K_WYRETURN-K_WYF01; break; case '!': /* Tab */ keyi = K_WYTAB-K_WYF01; break; case '&': /* Shift Tab */ keyi = K_WYSTAB-K_WYF01; break; case 'R': /* Print Screen */ keyi = K_WYPRTSCN-K_WYF01; break; case '%': /* Shift Esc */ keyi = K_WYSESC-K_WYF01; break; case '\'': /* Shift Backspace */ keyi = K_WYSBS-K_WYF01; break; case '4': /* Shift Enter */ keyi = K_WYSENTER-K_WYF01; break; case ')': /* Shift Return */ keyi = K_WYSRETURN-K_WYF01; break; case '+': /* Up arrow */ keyi = K_WYUPARR-K_WYF01; break; case ',': /* Dn arrow */ keyi = K_WYDNARR-K_WYF01; break; case '-': /* Left arrow */ keyi = K_WYLFARR-K_WYF01; break; case '.': /* Right arrow */ keyi = K_WYRTARR-K_WYF01; break; case '0': /* Shift Up arrow */ keyi = K_WYSUPARR-K_WYF01; break; case '1': /* Shift Dn arrow */ keyi = K_WYSDNARR-K_WYF01; break; case '2': /* Shift Left arrow */ keyi = K_WYSLFARR-K_WYF01; break; case '3': /* Shift Right arrow */ keyi = K_WYSRTARR-K_WYF01; break; case 'u': /* Send */ keyi = K_WYSEND-K_WYF01; break; case 't': /* Shift Send */ keyi = K_WYSSEND-K_WYF01; break; case 'Q': /* F17 */ keyi = K_WYF17-K_WYF01; break; case 'W': /* Shift F17 */ keyi = K_WYSF17-K_WYF01; break; case 'S': /* F18 */ keyi = K_WYF18-K_WYF01; break; case 'Y': /* Shift F18 */ keyi = K_WYSF18-K_WYF01; break; case 'T': /* F19 */ keyi = K_WYF19-K_WYF01; break; case 'Z': /* Shift F19 */ keyi = K_WYSF19-K_WYF01; break; case 'P': /* F20 */ keyi = K_WYF20-K_WYF01; break; case 'V': /* Shift F20 */ keyi = K_WYSF20-K_WYF01; break; case '#': /* Del */ case '(': /* Shift Del */ case 'X': /* Shift Print Screen */ case ':': /* PgUp */ case ';': /* Shift PgUp */ case '\\': /* End */ case ']': /* Shift End */ default: debug(F111,"Wyse (ESC Z ~)","key",key); break; } #endif /* NOKVERBS */ if ( keyi >= 0 ) { if ( udkfkeys[keyi] != NULL ) { strcat( keydef, udkfkeys[keyi] ); i += strlen(udkfkeys[keyi]); } } keydef[i++] = DEL ; /* End of report */ keydef[i] = NUL ; /* For debugging */ sendchars(keydef,i); #endif /* NOSETKEY */ break; } else { debug(F110,"Wyse Escape","Assign Key Definition",0); i = 0 ; while ( (keydef[i]=wyinc()) != DEL ) i++; keydef[i] = NUL ; if ( debses ) break; if ( key >= '@' && key <= 'O' ) { keyi = key-'@'; } #ifndef NOKVERBS else if ( key >= '`' && key <= 'o' ) { keyi = key-'`'+(K_WYSF01-K_WYF01); } else switch (key) { case '"': /* Backspace */ keyi = K_WYBS-K_WYF01 ; break; case '}': /* Clear Line */ keyi = K_WYCLRLN-K_WYF01; break; case 'z': /* Shift Clear Line - Clear Screen */ keyi = K_WYSCLRLN-K_WYF01; break; /* Clear Page */ /* Shift Clear Page */ case '5': /* Del Char */ keyi = K_WYDELCHAR-K_WYF01; break; case '6': /* Del Line */ keyi = K_WYDELLN-K_WYF01; break; case 's': /* Enter */ keyi = K_WYENTER-K_WYF01; break; case SP: /* Escape */ keyi = K_WYESC-K_WYF01; break; case '*': /* Home */ keyi = K_WYHOME-K_WYF01; break; case '/': /* Shift Home */ keyi = K_WYSHOME-K_WYF01; break; case '8': /* Shift Replace (Insert) */ keyi = K_WYINSERT-K_WYF01; break; case 'q': /* Insert Char */ keyi = K_WYINSCHAR-K_WYF01; break; case 'p': /* Insert Line */ keyi = K_WYINSLN-K_WYF01; break; case 'r': /* Page Next */ keyi = K_WYPGNEXT-K_WYF01; break; case 'w': /* Page Prev */ keyi = K_WYPGPREV-K_WYF01; break; case '7': /* Replace */ keyi = K_WYREPLACE-K_WYF01; break; case '$': /* Return */ keyi = K_WYRETURN-K_WYF01; break; case '!': /* Tab */ keyi = K_WYTAB-K_WYF01; break; case '&': /* Shift Tab */ keyi = K_WYSTAB-K_WYF01; break; case 'R': /* Print Screen */ keyi = K_WYPRTSCN-K_WYF01; break; case '%': /* Shift Esc */ keyi = K_WYSESC-K_WYF01; break; case '\'': /* Shift Backspace */ keyi = K_WYSBS-K_WYF01; break; case '4': /* Shift Enter */ keyi = K_WYSENTER-K_WYF01; break; case ')': /* Shift Return */ keyi = K_WYSRETURN-K_WYF01; break; case '+': /* Up arrow */ keyi = K_WYUPARR-K_WYF01; break; case ',': /* Dn arrow */ keyi = K_WYDNARR-K_WYF01; break; case '-': /* Left arrow */ keyi = K_WYLFARR-K_WYF01; break; case '.': /* Right arrow */ keyi = K_WYRTARR-K_WYF01; break; case '0': /* Shift Up arrow */ keyi = K_WYSUPARR-K_WYF01; break; case '1': /* Shift Dn arrow */ keyi = K_WYSDNARR-K_WYF01; break; case '2': /* Shift Left arrow */ keyi = K_WYSLFARR-K_WYF01; break; case '3': /* Shift Right arrow */ keyi = K_WYSRTARR-K_WYF01; break; case 'Q': /* F17 */ keyi = K_WYF17-K_WYF01; break; case 'W': /* Shift F17 */ keyi = K_WYSF17-K_WYF01; break; case 'S': /* F18 */ keyi = K_WYF18-K_WYF01; break; case 'Y': /* Shift F18 */ keyi = K_WYSF18-K_WYF01; break; case 'T': /* F19 */ keyi = K_WYF19-K_WYF01; break; case 'Z': /* Shift F19 */ keyi = K_WYSF19-K_WYF01; break; case 'P': /* F20 */ keyi = K_WYF20-K_WYF01; break; case 'V': /* Shift F20 */ keyi = K_WYSF20-K_WYF01; break; case 'u': /* Send */ keyi = K_WYSEND-K_WYF01; break; case 't': /* Shift Send */ keyi = K_WYSSEND-K_WYF01; break; case '#': /* Del */ case '(': /* Shift Del */ case 'X': /* Shift Print Screen */ case ':': /* PgUp */ case ';': /* Shift PgUp */ case '\\': /* End */ case ']': /* Shift End */ default: debug(F111,"Wyse (ESC Z)","unimplemented key",key); break; } #endif /* NOKVERBS */ #ifndef NOSETKEY if ( keyi >= 0 ) { if ( udkfkeys[keyi] ){ free( udkfkeys[keyi] ) ; udkfkeys[keyi]=NULL; } if ( strlen(keydef) ) { char buf[80]; udkfkeys[keyi] = strdup( keydef ) ; sprintf(buf,"Wyse [Define Key]=%d",keyi); hexdump(buf,keydef,strlen(keydef)); } else { udkfkeys[keyi] = wysedefkey( keyi ); } } #endif /* NOSETKEY */ } break; } case '[': { /* Address cursor to specific row */ int line = wyinc(); debug(F110,"Wyse Escape","Address cursor to row",0); if ( debses ) break; lgotoxy(VTERM,wherex[VTERM],line-31); break; } case '\\': debug(F110,"Wyse Escape","\\",0); break; case ']': /* Activates text segment 0 - Upper Window */ debug(F110,"Wyse Escape","Activate Text Segment 0",0); break; case '^': /* ESC ^ 0 - Restore normal screen */ /* ESC ^ 1 - Reverse screen */ { int n = wyinc() ; if ( debses ) break; switch ( n ) { case '0': /* Restore normal screen */ debug(F110,"Wyse Escape","Restore Normal screen",0); if (!decscnm) /* Already normal? */ break; else { flipscreen(VTERM); VscrnIsDirty(VTERM); } break; case '1': /* Reverse screen */ debug(F110,"Wyse Escape","Reverse screen",0); if (decscnm) /* Already reverse */ break; else { flipscreen(VTERM); VscrnIsDirty(VTERM) ; } break; } } break; case '_': { /* Address cursor to column */ int col = wyinc() ; debug(F110,"Wyse Escape","Address cursor to col",0); if ( debses ) break; lgotoxy(VTERM,col-31,wherey[VTERM]); break; } case '`': { /* Sets the screen features. This mode has the following */ /* multiple code sequence: ESC ' n where: */ /* n = screen feature code */ int n = wyinc() ; switch ( n ) { case '0': /* Cursor display off */ debug(F110,"Wyse Escape","Cursor display off",0); if ( debses ) break; cursorena[VTERM] = FALSE ; break; case '1': /* Cursor display on (default) */ debug(F110,"Wyse Escape","Cursor display on",0); if ( debses ) break; cursorena[VTERM] = TRUE ; break; case '2': /* Steady block cursor */ debug(F110,"Wyse Escape","Steady block cursor",0); if ( debses ) break; tt_cursor = TTC_BLOCK ; setcursormode() ; cursorena[VTERM] = TRUE ; break; case '3': /* Blinking line cursor */ debug(F110,"Wyse Escape","Blinking line cursor",0); if ( debses ) break; tt_cursor = TTC_ULINE ; setcursormode() ; cursorena[VTERM] = TRUE ; break; case '4': /* Steady line cursor */ debug(F110,"Wyse Escape","Steady line cursor",0); if ( debses ) break; tt_cursor = TTC_ULINE ; setcursormode() ; cursorena[VTERM] = TRUE ; break; case '5': /* Blinking block cursor (default) */ debug(F110,"Wyse Escape","Blinking block cursor",0); if ( debses ) break; tt_cursor = TTC_BLOCK ; setcursormode() ; cursorena[VTERM] = TRUE ; break; /* These attributes are used only in Write-Protect Mode */ case '6': /* Reverse protect character */ debug(F110,"Wyse Escape","Write Protect Attribute: Reverse",0); if ( debses ) break; WPattrib.blinking = FALSE; /* No blink */ WPattrib.bold = FALSE; /* No bold */ WPattrib.invisible = FALSE; /* Visible */ WPattrib.underlined = FALSE; /* No underline */ WPattrib.reversed = TRUE; /* Reverse video */ WPattrib.unerasable = TRUE; /* Write-Protected */ WPattrib.graphic = FALSE ; /* Not graphic character */ WPattrib.dim = FALSE ; /* No dim */ break; case '7': /* Dim protect character (default) */ debug(F110,"Wyse Escape","Write Protect Attribute: Dim",0); if ( debses ) break; WPattrib.blinking = FALSE; /* No blink */ WPattrib.bold = FALSE; /* No bold */ WPattrib.invisible = FALSE; /* Visible */ WPattrib.underlined = FALSE; /* No underline */ WPattrib.reversed = FALSE; /* No reverse video */ WPattrib.unerasable = TRUE; /* Write-Protected */ WPattrib.graphic = FALSE ; /* Not graphic character */ WPattrib.dim = TRUE ; /* Dim */ break; case 'A': /* Normal protect character */ debug(F110,"Wyse Escape","Write Protect Attribute: Normal",0); if ( debses ) break; WPattrib.blinking = FALSE; /* No blink */ WPattrib.bold = FALSE; /* No bold */ WPattrib.invisible = FALSE; /* Visible */ WPattrib.underlined = FALSE; /* No underline */ WPattrib.reversed = FALSE; /* No reverse video */ WPattrib.unerasable = TRUE; /* Write-Protected */ WPattrib.graphic = FALSE ; /* Not graphic character */ WPattrib.dim = FALSE ; /* No dim */ break; case 'B': if ( ISWY60(tt_type_mode) ) { /* Blink on */ debug(F110,"Wyse Escape","Write Protect Attribute: Blink",0); if ( debses ) break; WPattrib.blinking = TRUE ; } else if ( ISWY30( tt_type_mode ) ) { /* Reverse and Dim */ debug(F110,"Wyse Escape","Write Protect Attribute: Reverse and Dim",0); if ( debses ) break; WPattrib.blinking = FALSE; /* No blink */ WPattrib.bold = FALSE; /* No bold */ WPattrib.invisible = FALSE; /* Visible */ WPattrib.underlined = FALSE; /* No underline */ WPattrib.reversed = TRUE; /* reverse video */ WPattrib.unerasable = TRUE; /* Write-Protected */ WPattrib.graphic = FALSE ; /* Not graphic character */ WPattrib.dim = TRUE ; /* dim */ } break; case 'C': if ( ISWY60(tt_type_mode) ) { /* Invisible on */ debug(F110,"Wyse Escape","Write Protect Attribute: Invisible",0); if ( debses ) break; WPattrib.invisible = TRUE ; } else if ( ISWY30( tt_type_mode ) ) { /* Double-wide and normal */ debug(F110,"Wyse Escape","Write Protect Attribute: Double Wide and Normal",0); if ( debses ) break; WPattrib.blinking = FALSE; /* No blink */ WPattrib.bold = FALSE; /* No bold */ WPattrib.invisible = FALSE; /* Visible */ WPattrib.underlined = FALSE; /* No underline */ WPattrib.reversed = FALSE; /* No reverse video */ WPattrib.unerasable = TRUE; /* Write-Protected */ WPattrib.graphic = FALSE ; /* Not graphic character */ WPattrib.dim = FALSE ; /* No dim */ } break; case 'D': if ( ISWY30( tt_type_mode ) ) { /* Double-wide and reverse */ debug(F110,"Wyse Escape","Write Protect Attribute: Double Wide and Reverse",0); if ( debses ) break; WPattrib.blinking = FALSE; /* No blink */ WPattrib.bold = FALSE; /* No bold */ WPattrib.invisible = FALSE; /* Visible */ WPattrib.underlined = FALSE; /* No underline */ WPattrib.reversed = TRUE; /* reverse video */ WPattrib.unerasable = TRUE; /* Write-Protected */ WPattrib.graphic = FALSE ; /* Not graphic character */ WPattrib.dim = FALSE ; /* No dim */ } break; case 'E': if ( ISWY60(tt_type_mode) ) { /* Underline on */ debug(F110,"Wyse Escape","Write Protect Attribute: Underline",0); if ( debses ) break; WPattrib.underlined = TRUE ; } else if ( ISWY30( tt_type_mode ) ) { /* Double-wide and dim */ debug(F110,"Wyse Escape","Write Protect Attribute: Double Wide and Dim",0); if ( debses ) break; WPattrib.blinking = FALSE; /* No blink */ WPattrib.bold = FALSE; /* No bold */ WPattrib.invisible = FALSE; /* Visible */ WPattrib.underlined = FALSE; /* No underline */ WPattrib.reversed = FALSE; /* No reverse video */ WPattrib.unerasable = TRUE; /* Write-Protected */ WPattrib.graphic = FALSE ; /* Not graphic character */ WPattrib.dim = TRUE ; /* dim */ } break; case 'F': if ( ISWY60(tt_type_mode) ) { /* Reverse on */ debug(F110,"Wyse Escape","Write Protect Attribute: Reverse",0); if ( debses ) break; WPattrib.reversed = TRUE ; } else if ( ISWY30( tt_type_mode ) ) { /* Double-wide, reverse, and dim */ debug(F110,"Wyse Escape","Write Protect Attribute: Double Wide, Reverse and Dim",0); if ( debses ) break; WPattrib.blinking = FALSE; /* No blink */ WPattrib.bold = FALSE; /* No bold */ WPattrib.invisible = FALSE; /* Visible */ WPattrib.underlined = FALSE; /* No underline */ WPattrib.reversed = TRUE; /* reverse video */ WPattrib.unerasable = TRUE; /* Write-Protected */ WPattrib.graphic = FALSE ; /* Not graphic character */ WPattrib.dim = TRUE ; /* dim */ } break; case 'G': if ( ISWY60( tt_type_mode ) ) { /* Dim on */ debug(F110,"Wyse Escape","Write Protect Attribute: Dim",0); if ( debses ) break; WPattrib.blinking = FALSE; /* No blink */ WPattrib.bold = FALSE; /* No bold */ WPattrib.invisible = FALSE; /* Visible */ WPattrib.underlined = FALSE; /* No underline */ WPattrib.reversed = FALSE; /* No reverse video */ WPattrib.unerasable = TRUE; /* Write-Protected */ WPattrib.graphic = FALSE ; /* Not graphic character */ WPattrib.dim = TRUE ; /* dim */ } break; case 'H': if ( ISWY60( tt_type_mode ) ) { /* Line lock mode on */ debug(F110,"Wyse Escape","Line lock mode on",0); if ( debses ) break; linelock = TRUE ; } break; case 'I': if ( ISWY60( tt_type_mode ) ) { /* Line lock mode off */ debug(F110,"Wyse Escape","Line lock mode off",0); if ( debses ) break; linelock = FALSE ; } break; case 'J': if ( ISWY60( tt_type_mode ) ) { /* Set margin bell at cursor position */ debug(F110,"Wyse Escape","Set margin bell cursor position",0); if ( debses ) break; marginbellcol = wherex[VTERM] ; marginbell = TRUE ; } else if ( ISWY30( tt_type_mode ) ) { /* Underline */ debug(F110,"Wyse Escape","Write Protect Attribute: Underline",0); if ( debses ) break; WPattrib.blinking = FALSE; /* No blink */ WPattrib.bold = FALSE; /* No bold */ WPattrib.invisible = FALSE; /* Visible */ WPattrib.underlined = TRUE; /* underline */ WPattrib.reversed = TRUE; /* reverse video */ WPattrib.unerasable = TRUE; /* Write-Protected */ WPattrib.graphic = FALSE ; /* Not graphic character */ WPattrib.dim = FALSE ; /* No dim */ } break; case 'K': if ( ISWY30( tt_type_mode ) ) { /* Underline and Dim */ debug(F110,"Wyse Escape","Write Protect Attribute: Underline and Dim",0); if ( debses ) break; WPattrib.blinking = FALSE; /* No blink */ WPattrib.bold = FALSE; /* No bold */ WPattrib.invisible = FALSE; /* Visible */ WPattrib.underlined = TRUE; /* underline */ WPattrib.reversed = FALSE; /* No reverse video */ WPattrib.unerasable = TRUE; /* Write-Protected */ WPattrib.graphic = FALSE ; /* Not graphic character */ WPattrib.dim = TRUE; /* dim */ } break; case 'L': if ( ISWY30( tt_type_mode ) ) { /* Underline and Double-wide */ debug(F110,"Wyse Escape","Write Protect Attribute: Double-wide and Underline",0); if ( debses ) break; WPattrib.blinking = FALSE; /* No blink */ WPattrib.bold = FALSE; /* No bold */ WPattrib.invisible = FALSE; /* Visible */ WPattrib.underlined = TRUE; /* underline */ WPattrib.reversed = FALSE; /* No reverse video */ WPattrib.unerasable = TRUE; /* Write-Protected */ WPattrib.graphic = FALSE ; /* Not graphic character */ WPattrib.dim = FALSE ; /* No dim */ } break; case '8': /* Screen display off */ debug(F110,"Wyse Escape","Screen display off",0); if ( debses ) break; screenon = FALSE ; break; case '9': /* Screen display on (default) */ debug(F110,"Wyse Escape","Screen display on",0); if ( debses ) break; screenon = TRUE ; break; case ':': /* 80-column mode */ debug(F110,"Wyse Escape","80-column mode",0); if ( debses ) break; RequestScreenMutex(SEM_INDEFINITE_WAIT); killcursor(VTERM); Set80Cols(VTERM); #ifdef TCPSOCKET #ifdef CK_NAWS if (ttmdm < 0 && TELOPT_ME(TELOPT_NAWS)) { tn_snaws(); #ifdef RLOGCODE rlog_naws(); #endif /* RLOGCODE */ #ifdef SSHBUILTIN ssh_snaws(); #endif /* SSHBUILTIN */ } #endif /* CK_NAWS */ #endif /* TCPSOCKET */ setborder(); newcursor(VTERM); ipadl25(); ReleaseScreenMutex(); break; case ';': /* 132-column mode (default) */ debug(F110,"Wyse Escape","132-column mode",0); if ( debses ) break; RequestScreenMutex(SEM_INDEFINITE_WAIT); killcursor(VTERM); Set132Cols(VTERM); #ifdef TCPSOCKET #ifdef CK_NAWS if (ttmdm < 0 && TELOPT_ME(TELOPT_NAWS)) { tn_snaws(); #ifdef RLOGCODE rlog_naws(); #endif /* RLOGCODE */ #ifdef SSHBUILTIN ssh_snaws(); #endif /* SSHBUILTIN */ } #endif /* CK_NAWS */ #endif /* TCPSOCKET */ setborder(); newcursor(VTERM); ipadl25(); ReleaseScreenMutex(); break; case '<': /* Smooth scroll @ 1 row per second */ debug(F110,"Wyse Escape","Smooth scroll @ 1 row/second",0); if ( debses ) break; SmoothScroll() ; break; case '=': /* Smooth scroll @ 2 rows per second */ debug(F110,"Wyse Escape","Smooth scroll @ 2 row/second",0); if ( debses ) break; SmoothScroll() ; break; case '>': /* Smooth scroll @ 4 rows per second */ debug(F110,"Wyse Escape","Smooth scroll @ 4 row/second",0); if ( debses ) break; SmoothScroll() ; break; case '?': /* Smooth scroll @ 8 rows per second */ debug(F110,"Wyse Escape","Smooth scroll @ 8 row/second",0); if ( debses ) break; SmoothScroll() ; break; case '@': /* Jump scroll (default) */ debug(F110,"Wyse Escape","Jump scroll",0); if ( debses ) break; JumpScroll() ; break; case 'a': /* WY60 - Extended status line on */ /* We use the status line for the label line */ debug(F110,"Wyse Escape","Extended Status Line On",0); break; case 'b': /* WY60 - Standard status line on */ debug(F110,"Wyse Escape","Standard Status Line On",0); break; case 'c': /* WY60 - Status line display off */ debug(F110,"Wyse Escape","Status Line Off",0); break; } break; } case 'a': { /* Moves the cursor to a specified row and column for an */ /* 80- or a 132-column screen. This has a format of: */ /* ESC a rr R ccc C where: */ /* rr = the ASCII encoded decimal value of the row */ /* R = ASCII R */ /* ccc = the ASCII encoded decimal value of the column */ /* C = ASCII C */ /* For example: ESC a 1 R 1 C positions the cursor at */ /* true home. */ int n, c=0, r=0 ; debug(F110,"Wyse Escape","Move cursor to row and column",0); n = wyinc(); while ( isdigit(n) ) { r = r * 10 + n - '0' ; n = wyinc() ; } if ( n != 'R' ) { escstate = ES_NORMAL ; wyseascii( n ) ; return ; } n = wyinc(); while ( isdigit(n) ) { c = c * 10 + n - '0' ; n = wyinc() ; } if ( n != 'C' ) { escstate = ES_NORMAL ; wyseascii( n ) ; return ; } if ( debses ) break; lgotoxy( VTERM, c, r ) ; break; } case 'b': { /* Transmits the cursor address to the host computer for */ /* the active text segment. The format is: */ /* rr R ccc C where: */ /* rr = the ASCII encoded decimal value of the row */ /* R = ASCII R */ /* ccc = the ASCII encoded decimal value of the column */ /* C = ASCII C */ char buf[12] ; debug(F110,"Wyse Escape","Transmit cursor address to the host",0); if ( debses ) break; sprintf(buf,"%dR%dC",wherey[VTERM],wherex[VTERM]); break; } case 'c': if ( ISWY30(tt_type_mode) ) { /* Activate Upper Data Segment */ debug(F110,"Wyse Escape","Activate Upper Data Segment",0); if ( debses ) break; } else if ( ISWY60(tt_type_mode) ) { int n = wyinc() ; switch ( n ) { case '0': { /* Set MODEM port operating parameters */ /* baud stop parity word */ int baud, stop, parity, word ; debug(F110,"Wyse Escape","Set Modem Port parameters",0); baud = wyinc(); stop = wyinc(); parity = wyinc(); word = wyinc(); break; } case '1': { /* Set AUX port operating parameters */ /* baud stop parity word */ int baud, stop, parity, word ; debug(F110,"Wyse Escape","Set AUX port parameters",0); baud = wyinc(); stop = wyinc(); parity = wyinc(); word = wyinc(); break; } case '2': { /* Set MODEM port receive handshaking */ /* hndshk */ int hndshk = wyinc(); debug(F110,"Wyse Escape","Set Modem port RX handshaking",0); break; } case '3': { /* Set AUX port receive handshaking */ /* hndshk */ int hndshk = wyinc(); debug(F110,"Wyse Escape","Set AUX port RX handshaking",0); break; } case '4': { /* Set MODEM port transmit handshaking */ /* hndshk */ int hndshk = wyinc(); debug(F110,"Wyse Escape","Set Modem port TX handshaking",0); break; } case '5': { /* Set AUX port transmit handshaking */ /* hndshk */ int hndshk = wyinc(); debug(F110,"Wyse Escape","Set AUX port TX handshaking",0); break; } case '6': { /* Set maximum data transmission speed */ /* maxspd */ int maxspd = wyinc(); debug(F110,"Wyse Escape","Set Max Data TX speed",0); break; } case '7': { /* Set maximum function key transmission speed */ /* max */ int max = wyinc() ; debug(F110,"Wyse Escape","Set Max Function Key TX speed",0); break; } case '8': { /* Load time of day */ /* hh mm */ int hh, mm ; debug(F110,"Wyse Escape","Load Time of Day",0); hh = wyinc(); mm = wyinc(); loadtod( hh, mm ) ; break; } case ';': { /* Program answerback message */ /* answer CTRL-Y */ int n ; debug(F110,"Wyse Escape","Program Answerback message",0); while ( (n=wyinc()) != 25 ) ; if ( debses ) break; break; } case '<': /* Send answerback message */ debug(F110,"Wyse Escape","Send Answerback message",0); if ( debses ) break; if (tt_answer) sendchars(answerback,strlen(answerback)) ; break; case '\\': { /* 325 or 160 - Select Bell Tone */ /* 0 off, 1 Low pitch, 2,3 High pitch */ int tone = wyinc() ; debug(F110,"Wyse Escape","Select Bell Tone",0); if ( debses ) break; break; } case '=': /* Conceal answerback message */ debug(F110,"Wyse Escape","Conceal Answerback message",0); break; case '?': { /* Clear font back */ /* bank */ int bank = wyinc(); struct _vtG * pG; debug(F110,"Wyse Escape","Clear font bank",0); if ( debses ) break; pG = &G[bank]; pG->designation = TX_UNDEF; pG->c1 = FALSE ; pG->national = FALSE; pG->rtoi = NULL ; pG->itol = NULL ; pG->itor = NULL ; pG->ltoi = NULL ; break; } case '@': { /* Load font bank */ /* bank set */ int bank, set ; unsigned char cs = TX_UNDEF ; struct _vtG * pG; debug(F110,"Wyse Escape","Load font bank",0); bank = wyinc(); set = wyinc() ; /* bank is 0 (G0) to 3 (G3) */ /* Set is: @ - Native mode A - Multinational (CP437) B - Standard ASCII C - Graphics 1 D - PC Equivalent E - Graphics 2 F - Graphics 3 G - Standard ANSI ` - 44-line native a - 44-line multinational b - 44-line PC c - 44-line Standard ASCII d - 44-line Standard ANSI */ if ( debses ) break; pG = &G[bank]; switch ( set ) { case '@': case 'a': cs = TX_WYSE60G_N; break; case 'A': cs = TX_CP437; break; case 'B': case 'c': cs = TX_ASCII; break; case 'C': cs = TX_WYSE60G_1; break; case 'D': case 'b': cs = TX_IBMC0GRPH; break; case 'E': cs = TX_WYSE60G_2; break; case 'F': cs = TX_WYSE60G_3; break; case 'G': case 'd': cs = TX_CP1252; /* This is wrong */ break; } if ( cs <= MAXTXSETS ) { pG->designation = cs ; pG->size = cs96; pG->c1 = cs_is_std(cs) ; pG->national = CSisNRC( cs ) ; pG->rtoi = xl_u[cs] ; pG->itol = xl_tx[tcsl] ; pG->ltoi = xl_u[tcsl] ; pG->itor = xl_tx[cs] ; } else if ( cs != TX_UNDEF ) { debug(F110,"charset - ERROR","cs != TX_UNDEF",0); pG->designation = cs ; pG->c1 = FALSE ; pG->national = FALSE; pG->rtoi = NULL ; pG->itol = NULL ; pG->itor = NULL ; pG->ltoi = NULL ; } break; } case 'A': { /* Define and load character */ /* bank pp bb ... bb CTRL-Y */ int bank, pp, bb, cnt = 0 ; debug(F110,"Wyse Escape","Define and load character",0); bank = wyinc() ; pp = wyinc() ; do { bb = wyinc() ; cnt++; } while ( cnt < 32 && bb != XEM ); break; } case 'B': { /* Define primary character set */ /* bank */ int bank = wyinc() ; debug(F110,"Wyse Escape","Define primary char set",0); /* This should point GL at a bank */ if ( debses ) break; if ( bank >= '0' && bank <= '3' ) GL = &G[bank-'0']; break; } case 'C': { /* Define secondary character set */ /* bank */ int bank = wyinc() ; debug(F110,"Wyse Escape","Define secondary char set",0); /* This should point GR at a bank */ if ( debses ) break; if ( bank >= '0' && bank <= '3' ) GR = &G[bank-'0']; break; } case 'D': /* Select primary character set */ debug(F110,"Wyse Escape","Select primary char set",0); if ( debses ) break; wyse8bit = FALSE; break; case 'E': /* Select secondary character set */ debug(F110,"Wyse Escape","Select secondary char set",0); if ( debses ) break; wyse8bit = TRUE; break; case 'F': { /* Clear unprotected rectangle in 80-col page */ /* line col char */ /* Clear unprotected rectangle in 132-col page */ /* line ~ col char */ /* Is ignored if a line is locked */ int line, col, fillchar ; debug(F110,"Wyse Escape","Clear unprotected rectangle",0); line = wyinc() ; col = wyinc(); if ( col == '~' ) { col = wyinc() ; } fillchar = wyinc() ; if ( debses ) break; if ( protect ) selclrrect_escape( VTERM, wherey[VTERM], wherex[VTERM], line-31, col-31, fillchar ) ; else clrrect_escape( VTERM, wherey[VTERM], wherex[VTERM], line-31, col-31, fillchar ) ; break; } case 'G': { /* Box rectangle in 80-col page */ /* line col */ /* Box rectangle in 132-col page */ /* line ~ col */ /* Is ignored if a line is locked */ int line, col ; debug(F110,"Wyse Escape","Box rectangle",0); line = wyinc() ; col = wyinc(); if ( col == '~' ) { col = wyinc() ; } if ( debses ) break; boxrect_escape( VTERM, line-31, col-31 ) ; break; } case 'H': { /* Clear entire rectangle in 80-col page */ /* line col char */ /* Clear entire rectangle in 132-col page */ /* line ~ col char */ /* Is ignored if a line is locked */ int line, col, fillchar ; debug(F110,"Wyse Escape","Clear entire rectangle",0); line = wyinc() ; col = wyinc(); if ( col == '~' ) { col = wyinc() ; } fillchar = wyinc() ; if ( debses ) break; clrrect_escape( VTERM, wherey[VTERM], wherex[VTERM], line-31, col-31, fillchar ) ; break; } case 'I': /* Clear unprotected col to specific character */ /* char */ { int n = wyinc(); debug(F110,"Wyse Escape","Clear unprotected col to char",0); if ( debses ) break; if ( protect ) selclrcol_escape( VTERM, n ) ; else clrcol_escape( VTERM, n ) ; } break; case 'J': /* Delete cursor column */ if ( debses ) break; blankvcell.c = SP ; blankvcell.a = geterasecolor(VTERM) ; VscrnScrollRt( VTERM, 0, wherex[VTERM]-1, VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0), VscrnGetWidth(VTERM)-1, 1, blankvcell ) ; break; case 'K': /* Clear unprotected column to nulls */ debug(F110,"Wyse Escape","Clear unprotected col to NUL",0); if ( debses ) break; if (protect) selclrcol_escape( VTERM, NUL ) ; else clrcol_escape( VTERM, NUL ) ; break; case 'L': /* Clear unprotected to end of line with nulls */ debug(F110,"Wyse Escape","Clear unprotected to EOL to NUL",0); if ( debses ) break; if (protect) selclrtoeoln( VTERM, NUL ) ; else clrtoeoln( VTERM, NUL ) ; break; case 'M': /* Insert column of nulls */ debug(F110,"Wyse Escape","Insert col of NUL",0); if ( debses ) break; blankvcell.c = SP ; blankvcell.a = geterasecolor(VTERM) ; VscrnScrollRt( VTERM, 0, wherex[VTERM]-1, VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0), VscrnGetWidth(VTERM)-1, 1, blankvcell ) ; break; case 'N': { /* Box rectangle to right of cursor */ /* width height */ int w, h ; debug(F110,"Wyse Escape","Box rectangle to right of cursor",0); w = wyinc() ; h = wyinc() ; if ( debses ) break; boxrect_escape( VTERM, wherey[VTERM]+h-31, wherex[VTERM]+w-31 ) ; break; } case 'O': /* Clear unprotected to end of line with spaces */ debug(F110,"Wyse Escape","Clear unprotected to EOL to SP",0); if ( debses ) break; if ( protect ) selclrtoeoln( VTERM, SP ) ; else clrtoeoln( VTERM, SP ) ; break; case 'P': /* Clear unprotected page foreground to spaces */ debug(F110,"Wyse Escape","Clear unprotected page foreground to SP",0); if ( debses ) break; if ( protect ) selclreoscr_escape( VTERM, SP ) ; else clreoscr_escape( VTERM, SP ) ; /* ??? we really need to figure out what the last */ /* assigned attribute was so that we know what */ /* to assign to these cleared cells */ break; case 'Q': /* Clear unprotected page foreground to nulls */ debug(F110,"Wyse Escape","Clear unprotected page foreground to NUL",0); if ( debses ) break; if ( protect ) selclreoscr_escape( VTERM, NUL ) ; else clreoscr_escape( VTERM, NUL ) ; /* ??? we really need to figure out what the last */ /* assigned attribute was so that we know what */ /* to assign to these cleared cells */ break; case 'R': /* Clear unprotected line foreground to spaces */ debug(F110,"Wyse Escape","Clear unprotected line foreground to SP",0); if ( debses ) break; if ( protect ) selclrtoeoln( VTERM, SP ) ; else clrtoeoln( VTERM, SP ) ; break; case 'S': /* Clear unprotected line foreground to nulls */ debug(F110,"Wyse Escape","Clear unprotected line foreground to NUL",0); if ( debses ) break; if ( protect ) selclrtoeoln( VTERM, NUL ) ; else clrtoeoln( VTERM, NUL ) ; break; case 'T': debug(F110,"Wyse Escape","cT",0); break; case 'U': /* Clear all programmable keys */ debug(F110,"Wyse Escape","Clear all programmable keys",0); if ( debses ) break; udkreset() ; break; } } break; case 'd': if ( ISWY30(tt_type_mode ) ) { /* Moves the cursor to a specified row and column for an */ /* 80- or a 132-column screen. This has a format of: */ /* ESC a rr R ccc C where: */ /* rr = the ASCII encoded decimal value of the row */ /* R = ASCII R */ /* ccc = the ASCII encoded decimal value of the column */ /* C = ASCII C */ /* For example: ESC a 1 R 1 C positions the cursor at */ /* true home. */ int n, c=0, r=0 ; debug(F110,"Wyse Escape","Move cursor to row and column",0); n = wyinc(); while ( isdigit(n) ) { r = r * 10 + n - '0' ; n = wyinc() ; } if ( n != 'R' ) { escstate = ES_NORMAL ; wyseascii( n ) ; return ; } n = wyinc(); while ( isdigit(n) ) { c = c * 10 + n - '0' ; n = wyinc() ; } if ( n != 'C' ) { escstate = ES_NORMAL ; wyseascii( n ) ; return ; } if ( debses ) break; lgotoxy( VTERM, c, r ) ; } else if ( ISWY60(tt_type_mode) ) { int n = wyinc(); switch ( n ) { case SP: /* Secondary receive mode off */ debug(F110,"Wyse Escape","Secondary RX mode off",0); if ( debses ) break; break; case '!': /* Secondary receive mode on */ debug(F110,"Wyse Escape","Secondary RX mode on",0); if ( debses ) break; break; case '#': /* Transparent print on */ debug(F110,"Wyse Escape","Transparent Print on",0); if ( debses ) break; xprint = TRUE ; printeron(); break; case '$': /* Bidirectional mode off */ debug(F110,"Wyse Escape","Bidirectional mode off",0); if ( debses ) break; cprint = FALSE; printeroff(); break; case '%': /* Bidirectional mode on */ debug(F110,"Wyse Escape","Bidirectional mode on",0); if ( debses ) break; cprint = TRUE; printeron(); break; case '&': /* Begin print/send at top of screen */ debug(F110,"Wyse Escape","Begin print/send at top of screen",0); if ( debses ) break; break; case '\'': /* Begin print/send at top of page */ debug(F110,"Wyse Escape","Begin print/send at top of page",0); if ( debses ) break; break; case '*': /* Autopage mode off */ debug(F110,"Wyse Escape","Autopage mode off",0); if ( debses ) break; wy_autopage = FALSE ; break; case '+': /* Autopage mode on */ debug(F110,"Wyse Escape","Autopage mode on",0); if ( debses ) break; wy_autopage = TRUE ; break; case '.': /* End-of-line wrap mode off */ debug(F110,"Wyse Escape","EOL wrap mode off",0); if ( debses ) break; tt_wrap = FALSE ; break; case '/': /* End-of-line wrap mode on */ debug(F110,"Wyse Escape","EOL wrap mode on",0); if ( debses ) break; tt_wrap = TRUE ; break; case '|': /* Map the reverse attribute (default) - WY160 */ debug(F110,"Wyse Escape","Map the reverse attribute",0); if ( debses ) break; break; case '{': /* Map the blank attribute - WY160 */ debug(F110,"Wyse Escape","Map the blank attribute",0); if ( debses ) break; break; } } break; case 'e': if ( ISWY30(tt_type_mode) || ISWY60(tt_type_mode) ) { int mode = wyinc() ; switch ( mode ) { case SP: /* Answerback mode off */ debug(F110,"Wyse Escape","Answerback mode off",0); if ( debses ) break; tt_answer = FALSE ; break; case '!': /* Answerback mode on */ debug(F110,"Wyse Escape","Answerback mode on",0); if ( debses ) break; tt_answer = TRUE ; break; case '"': /* Page edit mode off */ debug(F110,"Wyse Escape","Page edit mode off",0); if ( debses ) break; break; case '#': /* Page edit mode on */ debug(F110,"Wyse Escape","Page edit mode on",0); if ( debses ) break; break; case '$': /* Keyclick on */ debug(F110,"Wyse Escape","keyclick on",0); if ( debses ) break; setkeyclick(TRUE); break; case '%': /* Keyclick off */ debug(F110,"Wyse Escape","keyclick off",0); if ( debses ) break; setkeyclick(FALSE); break; case '&': /* CAPSLOCK on */ debug(F110,"Wyse Escape","Capslock on",0); if ( debses ) break; break; case '\'': /* CAPSLOCK off */ debug(F110,"Wyse Escape","Capslock off",0); if ( debses ) break; break; case '(': /* Display 24 data lines */ debug(F110,"Wyse Escape","24 data lines",0); if ( debses ) break; settermstatus(TRUE); break; case ')': /* Display 25 data lines */ debug(F110,"Wyse Escape","25 data lines",0); if ( debses ) break; settermstatus(FALSE); break; case '*': /* Display 42 data lines */ debug(F110,"Wyse Escape","42 data lines",0); if ( debses ) break; settermstatus(TRUE); break; case '+': /* Display 43 data lines */ debug(F110,"Wyse Escape","43 data lines",0); if ( debses ) break; settermstatus(FALSE); break; case ',': /* Key repeat off */ debug(F110,"Wyse Escape","Key repeat off",0); if ( debses ) break; break; case '-': /* Key repeat on */ debug(F110,"Wyse Escape","Key repeat on",0); if ( debses ) break; break; case '.': /* Width change clear mode off */ debug(F110,"Wyse Escape","Width change clear mode off",0); if ( debses ) break; wy_widthclr = FALSE ; break; case '/': /* Width change clear mode on */ debug(F110,"Wyse Escape","Width change clear mode on",0); if ( debses ) break; wy_widthclr = TRUE ; break; case '{': /* Dim intensity on */ debug(F110,"Wyse Escape","Dim intensity on",0); if ( debses ) break; attrib.dim = TRUE ; break; case '|': /* Dim intensity off */ debug(F110,"Wyse Escape","Dim intensity off",0); if ( debses ) break; attrib.dim = FALSE ; break; case '0': /* Character attribute mode off */ debug(F110,"Wyse Escape","Character attribute mode off",0); if ( debses ) break; if ( attrmode & ATTR_CHAR_MODE ) attrmode ^= ATTR_CHAR_MODE ; break; case '1': /* Character attribute mode on */ debug(F110,"Wyse Escape","Character attribute mode on",0); if ( debses ) break; if ( attrmode & ATTR_CHAR_MODE ) break; attrmode ^= ATTR_CHAR_MODE ; break; case '2': /* Page attribute mode on */ debug(F110,"Wyse Escape","Page attribute mode on",0); if ( debses ) break; attrmode = ATTR_PAGE_MODE ; break; case '3': /* Line attribute mode on */ debug(F110,"Wyse Escape","Line attribute mode on",0); if ( debses ) break; attrmode = ATTR_LINE_MODE; break; case '4': /* Received CR mode off */ debug(F110,"Wyse Escape","Received CR mode off",0); if ( debses ) break; tnlm = FALSE ; break; case '5': /* Received CR mode on */ debug(F110,"Wyse Escape","Received CR mode on",0); if ( debses ) break; tnlm = TRUE ; break; case '6': /* ACK mode off */ debug(F110,"Wyse Escape","ACK mode off",0); if ( debses ) break; break; case '7': /* ACK mode on */ debug(F110,"Wyse Escape","ACK mode on",0); if ( debses ) break; break; case '8': /* Select MODEM port for data communications */ debug(F110,"Wyse Escape","Select Modem port for data comm",0); if ( debses ) break; break; case '9': /* Select AUX port for data communications */ debug(F110,"Wyse Escape","Select AUX port for data comm",0); if ( debses ) break; break; case ':': /* Don't initialize tabs */ debug(F110,"Wyse Escape","Don't initialize tabs",0); if ( debses ) break; break; case ';': /* Initialize tabs */ debug(F110,"Wyse Escape","Initialize tabs",0); if ( debses ) break; break; case '?': /* Select 10x13 character cell - WY30 */ debug(F110,"Wyse Escape","10x3 character cell",0); if ( debses ) break; break; case '@': /* 325 or 160 - NumLock off */ debug(F110,"Wyse Escape","Numlock off",0); if ( debses ) break; break; case 'A': /* 325 or 160 - NumLock on */ debug(F110,"Wyse Escape","Numlock on",0); if ( debses ) break; break; case 'B': /* 325 or 160 - Scroll Lock off */ debug(F110,"Wyse Escape","Scroll Lock off",0); if ( debses ) break; break; case 'C': /* 325 or 160 - Scroll Lock on */ debug(F110,"Wyse Escape","Scroll Lock on",0); if ( debses ) break; break; case 'F': /* Economy 80-col mode off */ debug(F110,"Wyse Escape","Economy 80-col mode off",0); if ( debses ) break; break; case 'G': /* Economy 80-col mode on */ debug(F110,"Wyse Escape","Economy 80-col mode on",0); if ( debses ) break; break; case 'H': /* 325 or 160 - ASCII Key codes */ debug(F110,"Wyse Escape","ASCII Key codes",0); if ( debses ) break; break; case 'I': /* 325 or 160 - PC Scan codes */ debug(F110,"Wyse Escape","PC Scan codes",0); if ( debses ) break; break; case 'J': /* Don't save function key labels */ debug(F110,"Wyse Escape","Don't save function labels",0); if ( debses ) break; break; case 'K': /* Save function key labels */ debug(F110,"Wyse Escape","Save function labels",0); if ( debses ) break; break; case 'L': /* Margin bell off */ debug(F110,"Wyse Escape","Margin bell off",0); if ( debses ) break; marginbell = FALSE ; break; case 'M': /* Margin bell on */ debug(F110,"Wyse Escape","Margin bell on",0); if ( debses ) break; marginbell = TRUE ; break; case 'N': /* Automatic font loading off */ debug(F110,"Wyse Escape","Auto font loading off",0); if ( debses ) break; break; case 'O': /* Automatic font loading on */ debug(F110,"Wyse Escape","Auto font loading on",0); if ( debses ) break; break; case 'P': /* Screen saver off */ debug(F110,"Wyse Escape","Screen saver off",0); if ( debses ) break; break; case 'Q': /* Screen saver on */ debug(F110,"Wyse Escape","Screen saver on",0); if ( debses ) break; break; case 'R': /* Turn on nulls suppress */ debug(F110,"Wyse Escape","NUL suppress on",0); if ( debses ) break; wy_nullsuppress = TRUE ; break; case 'S': /* Turn off nulls suppress */ debug(F110,"Wyse Escape","NUL suppress off",0); if ( debses ) break; wy_nullsuppress = FALSE ; break; case 'T': /* Define CAPS LOCK key as CAPS LOCK */ debug(F110,"Wyse Escape","CapsLock is CapsLock",0); if ( debses ) break; break; case 'U': /* Define CAPS LOCK key as REV */ debug(F110,"Wyse Escape","CapsLock is REV",0); if ( debses ) break; break; case 'V': /* Define CAPS LOCK key as SHIFT */ debug(F110,"Wyse Escape","CapsLock is SHIFT",0); if ( debses ) break; break; case 'x': /* Turn off multiple page mode (default) WY30 */ debug(F110,"Wyse Escape","Multiple page mode off",0); if ( debses ) break; break; case 'y': /* Turn on multiple page mode WY30 */ debug(F110,"Wyse Escape","Multiple page mode on",0); if ( debses ) break; break; case 'z': /* Select 10x15 character cell WY30 */ debug(F110,"Wyse Escape","10x15 char cell",0); if ( debses ) break; break; } } break; case 'f': { /* Program and display computer message on label line */ /* Also known as the Status Line */ int width = VscrnGetWidth(VTERM); int i = 0; debug(F110,"Wyse Escape","Program and display computer message on label line",0); if ( debses ) { while ( i < width && wyinc() != CR ) { i++; } } else { while ( i < width && (wy_labelmsg[i]=wyinc()) != CR ) { i++; } wy_labelmsg[i] = NUL ; } while ( i < width ) wy_labelmsg[i++] = SP ; wy_labelmsg[i]=NUL ; if ( debses ) break; setdecssdt(SSDT_HOST_WRITABLE); if ( decssdt == SSDT_HOST_WRITABLE ) { VscrnSetWidth(VSTATUS,VscrnGetWidth(VTERM)); VscrnWrtCharStrAtt( VSTATUS, wy_labelmsg, strlen(wy_labelmsg), 1, 1, &colorstatus ) ; } break; } case 'g': /* Turn on shifted and unshifted label line display */ /* (enhanced mode) WY30 */ debug(F110,"Wyse Escape","Label Line Display on",0); if ( debses ) break; setdecssdt(SSDT_HOST_WRITABLE); break; case 'h': /* Turn off shifted and unshifted label line display */ /* (enhanced mode) WY30 */ debug(F110,"Wyse Escape","Label Line Display off",0); if ( debses ) break; setdecssdt(SSDT_INDICATOR); break; case 'i': /* Moves the cursor to the next tab stop on the right. */ debug(F110,"Wyse Escape","Horizontal Tab",0); if ( debses ) break; wyse_tab(); break; case 'j': /* Moves the cursor up one row and begins scrolling at */ /* top row. */ debug(F110,"Wyse Escape","Cursor Up",0); if ( debses ) break; cursorup(0) ; break; case 'k': /* Turns the local edit submode on; duplex off */ /* Not the same as ECHO mode */ debug(F110,"Wyse Escape","Local Edit mode on; Duplex off",0); break; case 'l': /* Turns the duplex edit submode on; local off */ /* Not the same as ECHO mode */ debug(F110,"Wyse Escape","Local Edit mode off; Duplex on",0); break; case 'm': debug(F110,"Wyse Escape","m",0); break; case 'n': /* Turn on screen display (WY30) Enhanced Mode */ debug(F110,"Wyse Escape","Screen Display on",0); if ( debses ) break; if ( wy_enhanced ) screenon = TRUE ; break; case 'o': /* Turn off screen display (WY30) Enhanced Mode */ debug(F110,"Wyse Escape","Screen Display off",0); if ( debses ) break; if ( wy_enhanced ) screenon = FALSE ; break; case 'p': /* Sends all characters unformatted to the auxiliary port. */ /* Attributes codes are sent as spaces. Row-end sequences */ /* are not sent. The action is the same as ESC L. */ debug(F110,"Wyse Escape","Sends all chars unformatted to AUX",0); break; case 'q': /* Turns the insert submode on; replace off */ debug(F110,"Wyse Escape","Insert submode on; replace off",0); if ( debses ) break; insertmode = TRUE ; break; case 'r': /* Turns the insert submode off; replace on */ debug(F110,"Wyse Escape","Insert submode off; replace on",0); if ( debses ) break; insertmode = FALSE ; break; case 's': { /* Sends a message (entire block) */ int x,y,ch, w=VscrnGetWidth(VTERM), h=VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0), xs=-1, ys=-1, xe=w-1, ye=h-1, fs=0 ; debug(F110,"Wyse Escape","Send a message (entire block)",0); if ( debses ) break; /* First figure out if we have markers, STX then ETX */ for ( y=0;yc ; if ( ch == STX && xs < 0 && ys < 0 ) { xs = x+1 ; ys = y ; } else if ( ch == ETX && xs >= 0 && ys >= 0 ) { xe = x-1 ; ye = y ; break; } } if ( xs < 0 || ys < 0 ) { xs = 0 ; ys = 0 ; } /* Now send the data */ for ( y=ys;y<=ye; y++ ) { for ( x=(y==ys)?xs:0 ; x <= (y==ye?xe:w-1) ; x++ ) { if ( !VscrnGetVtCharAttr(VTERM, x, y).unerasable ) { if ( fs ) { sendchars("\x1b(",2); fs = 0; } } else if ( !fs ) { sendchars("\x1b)",2); fs = 1 ; } ch = VscrnGetCell( VTERM, x, y )->c; if ( ch || !wy_nullsuppress ) { if ( tt_senddata ) { unsigned char * bytes; int nbytes; if ( isunicode() ) nbytes = utorxlat(ch,&bytes); else nbytes = utorxlat(ch,&bytes); while ( nbytes-- > 0 ) sendchar(*bytes++) ; } else sendchar(SP); } } if ( y < ye ) { switch ( wy_blockend ) { case EOB_CRLF_ETX: sendchar(CR); sendchar(LF); break; case EOB_US_CR: sendchar(US); break; } } } switch ( wy_blockend ) { case EOB_CRLF_ETX: sendchar(ETX); break; case EOB_US_CR: sendchar(CR); break; } break; } case 't': /* Erases all (unprotected) characters from the current */ /* cursor location to the end of the row and replaces */ /* them with nulls. */ debug(F110,"Wyse Escape","Erase all unprotected chars from cursor to EOL with NUL",0); if ( debses ) break; if (protect) selclrtoeoln( VTERM, NUL ) ; else clrtoeoln( VTERM, NUL ) ; break; case 'u': /* Turns the monitor submode off. See ESC X. */ debug(F110,"Wyse Escape","Monitor mode off",0); if ( !wy_monitor ) break; setdebses(FALSE); wy_monitor = FALSE ; break; case 'v': /* Turn on autopage mode */ debug(F110,"Wyse Escape","Autopage mode on",0); if ( debses ) break; wy_autopage = TRUE ; break; case 'w': if ( ISWY30(tt_type_mode) || ISWY60(tt_type_mode) ) { int n = wyinc() ; switch ( n ) { case '0': /* Display page 0 */ debug(F110,"Wyse Escape","Display page 0",0); break; case '1': /* Display page 1 */ debug(F110,"Wyse Escape","Display page 1",0); break; case '2': /* Display page 2 (economy mode only) */ debug(F110,"Wyse Escape","Display page 2",0); break; case 'B': /* Display previous page */ debug(F110,"Wyse Escape","Display previous page",0); break; case 'C': /* Display next page */ debug(F110,"Wyse Escape","Display next page",0); break; case 'E': /* Roll window up in page */ debug(F110,"Wyse Escape","Roll window up in page",0); break; case 'F': /* Roll window down in page */ debug(F110,"Wyse Escape","Roll window down in page",0); break; case 'G': /* Divide memory into pages (1xlines) */ /* Length of page equal to the number of */ /* data lines (default) */ debug(F110,"Wyse Escape","Divide memory into pages (1x)",0); break; case 'H': /* Divide memory into pages (2xlines) */ /* Length of page equal to double the */ /* number of data lines */ debug(F110,"Wyse Escape","Divide memory into pages (2x)",0); break; case 'I': /* Divide memory into pages (4xlines) */ /* Length of page equal to Four times */ /* the number of data lines */ debug(F110,"Wyse Escape","Divide memory into pages (4x)",0); break; case 'J': /* Divide memory into pages */ /* One page contains the number of data lines */ /* The other contains the rest of the memory */ debug(F110,"Wyse Escape","Divide memory into pages (split)",0); break; case '@':{ /* page line col */ /* Address cursor in specific 80-col page */ debug(F110,"Wyse Escape","Address cursor page line col",0); z = wyinc(); y = wyinc() ; x = wyinc() ; if ( debses ) break; if ( /* VscrnGetWidth(VTERM) == 80 && */ x > 31 && y > 31 ) lgotoxy(VTERM, x-31, y-31 ) ; break; } case '`': /* Read 80-col page number and cursor address */ debug(F110,"Wyse Escape","Report cursor page line col",0); if ( debses ) break; if ( 1 /* VscrnGetWidth(VTERM) == 80 */ ) { char buf[4] ; buf[0] = '0' ; buf[1] = (char)(wherey[VTERM]+31) ; buf[2] = (char)(wherex[VTERM]+31) ; buf[3] = NUL ; sendchars(buf,3) ; } break; } } else { /* Wyse 50 */ /* Turn off autopage mode */ debug(F110,"Wyse Escape","Autopage off",0); if ( debses ) break; wy_autopage = FALSE ; } break; case 'x': /* Changes the screen display format. The sequences are: */ /* ESC x 0 for a full screen, 24 rows by 80 or 132 cols. */ /* ESC x 1 HSR for a horizontal split screen. (two page max) */ /* ESC x 3 HSR for a horizontal split screen (wy60) */ /* where */ /* HSR = row code for the row number 2 to 24 on which */ /* the lower text segment starts. */ /* these calls clear the pages. */ { int n = wyinc() ; switch ( n ) { case '0': /* Redefine screen as one window and clear pages */ debug(F110,"Wyse Escape","Redefine screen as 1 window and clear pages",0); if ( debses ) break; writeprotect = FALSE ; protect = FALSE ; attrib.unerasable = FALSE ; clrscreen(VTERM, SP) ; lgotoxy(VTERM,1,1); /* and home the cursor */ break; case '1': /* line */ /* Split screen and clear pages (two max) */ debug(F110,"Wyse Escape","Split screen and clear pages",0); if ( debses ) break; clrscreen( VTERM, SP ) ; lgotoxy(VTERM,1,1); /* and home the cursor */ /* if we support this, send ACK to host */ break; case '3': /* line */ /* Split screen and clear pages - WY60 */ debug(F110,"Wyse Escape","Split screen and clear pages",0); if ( debses ) break; break; case '@': /* Redefine screen as one window - no clear - WY60 */ debug(F110,"Wyse Escape","Redefine screen as one window - no clear",0); if ( debses ) break; break; case 'A': /* line */ /* Split screen (two max) - WY60 */ debug(F110,"Wyse Escape","Split screen",0); if ( debses ) break; break; case 'C': /* line */ /* Split screen - WY60 */ debug(F110,"Wyse Escape","Split Screen",0); if ( debses ) break; break; case 'P': /* Lower Horizontal Split - Wy60 */ debug(F110,"Wyse Escape","Lower horizontal split",0); if ( debses ) break; break; case 'R': /* Raise Horizontal Split - WY60 */ debug(F110,"Wyse Escape","Raise horizontal split",0); if ( debses ) break; break; } } break; case 'y': /* Erases all characters from the current cursor location */ /* to the end of the active segment and replaces them with */ /* nulls. (unprotected) */ debug(F110,"Wyse Escape","Erase all chars from cursor to end of segment with NUL",0); if ( debses ) break; if ( protect ) selclreoscr_escape( VTERM, NUL ) ; else clreoscr_escape( VTERM, NUL ) ; break; case 'z': { /* Enters a message into a selected function key label field */ /* or programs a user-defined sequence for a function key */ /* (maximum of eight label fields, shiftable to 16 for an */ /* 80-column screen; maximum of 16 label fields, shiftable */ /* to 32 for a 132-column screen. The message format is: */ /* ESC z n aaaa CR where: */ /* n = field code */ /* aaaa = a character string of up to eight characters for */ /* an 80-column screen or up to seven characters for */ /* an 132-column screen. */ /* ESC z n CR clears a particular function key label */ /* ESC z DEL turns off the shifted function key labeling */ /* line. */ /* The function key program format is: */ /* ESC z value SEQ DEL where: */ /* value = the default value code */ /* SEQ = the program sequence up to eight bytes */ /* WY60 adds: */ /* ESC z ( text CR Program/display unshifted label line */ /* ESC z ) text CR Program shifted label line */ /* ESC z ( CR Clear unshifted label line */ /* ESC z ) CR Clear shifted label line */ /* ESC z P CR Display shifted label line */ char keydef[256] = "" ; int key = wyinc() ; int i = 0 ; if ( key == DEL ) { /* Turn off shifted function key labeling */ debug(F110,"Wyse Escape","Turn off shifted function key labeling",0); break ; } if ( !((key >= '@' && key <= 'O') || (key >= '`' && key <= 'o') || (key >= '0' && key <= '7') || (key >= 'P' && key <= '_'))) { /* we don't support anything other than */ /* key programming yet. */ debug(F110,"Wyse Escape","Program key definition or label",0); if ( debses ) break; while ( (keydef[i]=wyinc()) != DEL && (keydef[i] != CR)) i++; keydef[i] = NUL ; break; } else if ( ISWY60(tt_type_mode) && key == '(' ) { /* ESC z ( text CR Program/display unshifted label line */ /* ESC z ( CR Clear unshifted label line */ int i = 0; debug(F110,"Wyse Escape","Program/display/clear unshifted label line",0); if ( debses ) { while ( i < MAXTERMCOL && wyinc() != CR ) { i++; } } else { while ( i < MAXTERMCOL && (wy_labelline[i]=wyinc()) != CR ) { i++; } wy_labelline[i] = NUL ; } } else if ( ISWY60(tt_type_mode) && key == ')' ) { /* ESC z ) text CR Program shifted label line */ /* ESC z ) CR Clear shifted label line */ int i = 0; debug(F110,"Wyse Escape","Program/display/clear shifted label line",0); if ( debses ) { while ( i < MAXTERMCOL && wyinc() != CR ) { i++; } } else { while ( i < MAXTERMCOL && (wy_shiftlabelline[i]=wyinc()) != CR ) { i++; } wy_shiftlabelline[i] = NUL ; } } else if ( ISWY60(tt_type_mode) && key == 'P' && wyinc() == CR ) { /* ESC z P CR Display shifted label line */ debug(F110,"Wyse Escape","Display Shifted label line",0); if ( debses ) break; } else { int label = ( (key >= '0' && key <= '7') || (key >= 'P' && key <= '_') ); while ( i < 255 && (((keydef[i]=wyinc()) != DEL) || label) && ((keydef[i] != CR) || !label) ) i++; keydef[i] = NUL ; if ( debses ) { debug(F110,"Wyse Escape","Program key or label",0); break; } if ( keydef[0] == '~' ) { /* we only allow redefinition of function keys */ debug(F110,"Wyse Escape","Program key or label tilde",0); } else if ( label ) { /* Function key labels */ ckstrncpy( fkeylabel[key-'0'], keydef, 32 ); debug(F111,"Wyse [Label]",fkeylabel[key-'0'],key-'0'); } else { int keyi=0; if ( key >= '@' && key <= 'O' ) { keyi = key-'@'; } else if ( key >= '`' && key <= 'o' ) { keyi = key-'`'+(K_WYSF01-K_WYF01); } #ifndef NOKVERBS else switch (key) { case '"': /* Backspace */ keyi = K_WYBS-K_WYF01 ; break; case '}': /* Clear Line */ keyi = K_WYCLRLN-K_WYF01; break; case 'z': /* Shift Clear Line - Clear Screen */ keyi = K_WYSCLRLN-K_WYF01; break; /* Clear Page */ /* Shift Clear Page */ case '5': /* Del Char */ keyi = K_WYDELCHAR-K_WYF01; break; case '6': /* Del Line */ keyi = K_WYDELLN-K_WYF01; break; case 's': /* Enter */ keyi = K_WYENTER-K_WYF01; break; case SP: /* Escape */ keyi = K_WYESC-K_WYF01; break; case '*': /* Home */ keyi = K_WYHOME-K_WYF01; break; case '/': /* Shift Home */ keyi = K_WYSHOME-K_WYF01; break; case '8': /* Shift Replace (Insert) */ keyi = K_WYINSERT-K_WYF01; break; case 'q': /* Insert Char */ keyi = K_WYINSCHAR-K_WYF01; break; case 'p': /* Insert Line */ keyi = K_WYINSLN-K_WYF01; break; case 'r': /* Page Next */ keyi = K_WYPGNEXT-K_WYF01; break; case 'w': /* Page Prev */ keyi = K_WYPGPREV-K_WYF01; break; case '7': /* Replace */ keyi = K_WYREPLACE-K_WYF01; break; case '$': /* Return */ keyi = K_WYRETURN-K_WYF01; break; case '!': /* Tab */ keyi = K_WYTAB-K_WYF01; break; case '&': /* Shift Tab */ keyi = K_WYSTAB-K_WYF01; break; case 'R': /* Print Screen */ keyi = K_WYPRTSCN-K_WYF01; break; case '%': /* Shift Esc */ keyi = K_WYSESC-K_WYF01; break; case '\'': /* Shift Backspace */ keyi = K_WYSBS-K_WYF01; break; case '4': /* Shift Enter */ keyi = K_WYSENTER-K_WYF01; break; case ')': /* Shift Return */ keyi = K_WYSRETURN-K_WYF01; break; case '+': /* Up arrow */ keyi = K_WYUPARR-K_WYF01; break; case ',': /* Dn arrow */ keyi = K_WYDNARR-K_WYF01; break; case '-': /* Left arrow */ keyi = K_WYLFARR-K_WYF01; break; case '.': /* Right arrow */ keyi = K_WYRTARR-K_WYF01; break; case '0': /* Shift Up arrow */ keyi = K_WYSUPARR-K_WYF01; break; case '1': /* Shift Dn arrow */ keyi = K_WYSDNARR-K_WYF01; break; case '2': /* Shift Left arrow */ keyi = K_WYSLFARR-K_WYF01; break; case '3': /* Shift Right arrow */ keyi = K_WYSRTARR-K_WYF01; break; case 'u': /* Send */ keyi = K_WYSEND-K_WYF01; break; case 't': /* Shift Send */ keyi = K_WYSSEND-K_WYF01; break; case 'Q': /* F17 */ keyi = K_WYF17-K_WYF01; break; case 'W': /* Shift F17 */ keyi = K_WYSF17-K_WYF01; break; case 'S': /* F18 */ keyi = K_WYF18-K_WYF01; break; case 'Y': /* Shift F18 */ keyi = K_WYSF18-K_WYF01; break; case 'T': /* F19 */ keyi = K_WYF19-K_WYF01; break; case 'Z': /* Shift F19 */ keyi = K_WYSF19-K_WYF01; break; case 'P': /* F20 */ keyi = K_WYF20-K_WYF01; break; case 'V': /* Shift F20 */ keyi = K_WYSF20-K_WYF01; break; case '#': /* Del */ case '(': /* Shift Del */ case 'X': /* Shift Print Screen */ case ':': /* PgUp */ case ';': /* Shift PgUp */ case '\\': /* End */ case ']': /* Shift End */ default: debug(F111,"Wyse (ESC z)","key",key); break; } #endif /* NOKVERBS */ #ifndef NOSETKEY if ( keyi >= 0 ) { if ( udkfkeys[keyi] ){ free( udkfkeys[keyi] ) ; udkfkeys[keyi]=NULL; } if ( strlen(keydef) ) { char buf[80]; udkfkeys[keyi] = strdup( keydef ) ; sprintf(buf,"Wyse [Define Key]=%d",keyi); hexdump(buf,keydef,strlen(keydef)); } else { udkfkeys[keyi] = wysedefkey( keyi ); } } #endif /* NOSETKEY */ } } break; } case '{': /* Moves the cursor to the home position of the text */ /* segment. */ debug(F110,"Wyse Escape","Home cursor in active segment",0); if ( debses ) break; lgotoxy(VTERM,1,1) ; break; case '|': { int n = wyinc() ; switch ( n ) { case '0': /* Redefine screen as one window and clear pages */ debug(F110,"Wyse Escape","Redefine screen as 1 window and clear pages",0); if ( debses ) break; if ( wy_enhanced ) { writeprotect = FALSE ; protect = FALSE ; attrib.unerasable = FALSE ; clrscreen(VTERM, SP) ; lgotoxy(VTERM,1,1); /* and home the cursor */ } break; case '1': { /* Split screen horizontally and clear screen */ int line = wyinc(); debug(F110,"Wyse Escape","Split screen horizontally and clear screen",0); if ( debses ) break; if ( wy_enhanced ) { clrscreen( VTERM, SP ) ; lgotoxy(VTERM,1,1); /* and home the cursor */ /* if we support this, send ACK to host */ } break; } } break; } case '}': /* Activates text segment 1 (lower window) */ debug(F110,"Wyse Escape","Activate text segment 1",0); break; case '~': if ( ISWY60(tt_type_mode) || ISWY60(tt_type) ) { int n = wyinc() ; switch ( n ) { case SP: /* Enhanced mode off */ debug(F110,"Wyse Escape","Enhanced Mode Off",0); if ( debses ) break; wy_enhanced = FALSE ; break; case '!': /* Enhanced mode on */ debug(F110,"Wyse Escape","Enhanced Mode On",0); if ( debses ) break; wy_enhanced = TRUE ; break; case '.': /* Wyseword mode off */ debug(F110,"Wyse Escape","Wyseword Mode Off",0); if ( debses ) break; break; case '/': /* Wyseword mode on */ debug(F110,"Wyse Escape","Wyseword Mode On",0); if ( debses ) break; break; case '2': /* Application key mode off */ debug(F110,"Wyse Escape","Application Key Mode Off",0); if ( debses ) break; wy_keymode = FALSE ; break; case '3': /* Application key mode on */ debug(F110,"Wyse Escape","Application Key Mode On",0); if ( debses ) break; wy_keymode = TRUE ; break; case '"': /* WY50, WY50+, WY100 mode */ debug(F110,"Wyse Escape","Terminal Type WY30,50,50+,100",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ if ( ISWY30(tt_type) ) tt_type_mode = TT_WY30 ; else tt_type_mode = TT_WY50 ; ipadl25(); break; case '#': /* TVI 910+ mode */ debug(F110,"Wyse Escape","Terminal Type TVI910+",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ tt_type_mode = TT_TVI910 ; ipadl25(); break; case '$': /* TVI 925 mode */ debug(F110,"Wyse Escape","Terminal Type TVI925",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ tt_type_mode = TT_TVI925 ; ipadl25(); break; case '%': /* ADDS VP A2 mode */ debug(F110,"Wyse Escape","Terminal Type ADDS VP A2",0); if ( debses ) break; break; case '&': /* HZ 1500 mode */ debug(F110,"Wyse Escape","Terminal Type HZ1500",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ tt_type_mode = TT_HZL1500 ; ipadl25(); break; case '\'': /* TVI 912/920 mode */ debug(F110,"Wyse Escape","Terminal Type TVI912/920",0); if ( debses ) break; break; case '(': /* TVI 950 mode */ debug(F110,"Wyse Escape","Terminal Type TVI950",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ tt_type_mode = TT_TVI950 ; ipadl25(); break; case ')': /* DG200 mode */ debug(F110,"Wyse Escape","Terminal Type DG200",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ tt_type_mode = TT_DG200 ; ipadl25(); break; case '*': /* IBM 3101-1X mode */ debug(F110,"Wyse Escape","Terminal Type IBM 3101",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ tt_type_mode = TT_IBM31; ipadl25(); break; case '+': /* ADM 31 mode */ debug(F110,"Wyse Escape","Terminal Type ADM 31",0); if ( debses ) break; break; case '`': /* TVI 955 mode */ debug(F110,"Wyse Escape","Terminal Type TVI 955",0); if ( debses ) break; break; case '-': /* WY75 mode */ debug(F110,"Wyse Escape","Terminal Type WY75",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ tt_type_mode = TT_VT102 ; ipadl25(); break; case '4': /* WY60 mode */ debug(F110,"Wyse Escape","Terminal Type WY60",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ tt_type_mode = TT_WY60 ; ipadl25(); break; case '5': /* PC Term mode */ debug(F110,"Wyse Escape","Terminal Type Wyse PC Term",0); if ( debses ) break; tt_type_mode = TT_WY60; #ifdef PCTERM setpcterm(TRUE); #endif /* PCTERM */ ipadl25(); break; case '6': /* VT52 mode */ debug(F110,"Wyse Escape","Terminal Type VT52",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ tt_type_mode = TT_VT52 ; ipadl25(); break; case '7': /* IBM 3101-2X mode */ debug(F110,"Wyse Escape","Terminal Type IBM 3101-2X",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ tt_type_mode = TT_IBM31; ipadl25(); break; case '8': /* ADDS VP-60 mode */ debug(F110,"Wyse Escape","Terminal Type ADDS VP-60",0); if ( debses ) break; break; case '9': /* IBM 3161 mode */ debug(F110,"Wyse Escape","Terminal Type IBM 3161",0); if ( debses ) break; break; case ':': /* DG 210 mode */ debug(F110,"Wyse Escape","Terminal Type DG210",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ tt_type_mode = TT_DG210 ; ipadl25(); break; case ';': /* VT100 mode */ debug(F110,"Wyse Escape","Terminal Type VT100",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ tt_type_mode = TT_VT102 ; ipadl25(); break; case 'A': /* Esprit III mode */ debug(F110,"Wyse Escape","Terminal Type Esprit III",0); if ( debses ) break; break; case 'B': /* WY370/VT320 (7-bit) */ debug(F110,"Wyse Escape","Terminal Type WY370 (7-bit)",0); if ( debses ) break; tt_type_mode = TT_WY370 ; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ setcmask(7); ipadl25(); break; case 'C': /* WY370/VT320 (8-bit) */ debug(F110,"Wyse Escape","Terminal Type WY370 (8-bit)",0); if ( debses ) break; #ifdef PCTERM setpcterm(FALSE); #endif /* PCTERM */ tt_type_mode = TT_WY370 ; setcmask(8); ipadl25(); break; case '>': /* Tek 4010/4014 mode */ debug(F110,"Wyse Escape","Terminal Type Tek 4010/4014",0); if ( debses ) break; ipadl25(); break; } } break; case DEL: break; } } escstate = ES_NORMAL ; /* Done parsing escstate sequence */ } } else /* Handle as a normal character */ { if ( ch < SP ) wysectrl(ch) ; else if ( !debses && !xprint ) { if ( wysegraphics && ch < 128 ) ch = xlwygrph( ch ) ; /* Display the character */ if ( !tt_hidattr && (attrmode == ATTR_PAGE_MODE || attrmode == ATTR_LINE_MODE) ) { vtattrib vta = VscrnGetVtCharAttr( VTERM, wherex[VTERM]-1, wherey[VTERM]-1 ) ; if ( vta.wyseattr ) { int x=wherex[VTERM]-1 ; int y=wherey[VTERM]-1 ; /* we are about to overwrite an attribute */ /* this results in the previous attribute being used for the entire */ /* this and subsequent cells */ vta.wyseattr = FALSE ; VscrnSetVtCharAttr( VTERM, x, y, vta ) ; /* now find previous attribute */ while ( !vta.wyseattr ) { if ( vta.wyseattr ) /* bug in MSVC 5.0 */ break; x--; if ( x < 0 ) { y--; if ( y >= 0 ) x = VscrnGetWidth(VTERM) ; else { x = y = 0 ; break; /* nowhere left to go */ } } vta = VscrnGetVtCharAttr( VTERM, x, y ) ; } if ( attrmode == ATTR_PAGE_MODE ) ApplyPageAttribute( VTERM, x+1, y+1, vta ) ; else ApplyLineAttribute( VTERM, x+1, y+1, vta ) ; } } if ( ch != DEL ) wrtch(ch); } } VscrnIsDirty(VTERM) ; } #endif /* NOTERM */ .