/**************************************************** * vt100 emulator - window/keyboard support * * 860823 DBW - Integrated and rewrote lots of code * v2.0 860809 DBW - Major rewrite * v1.1 860720 DBW - Switches, 80 cols, colors, bug fixes * v1.0 860712 DBW - First version released * ****************************************************/ #define MODULE_WINDOW 1 #include "vt100.h" /************************************************ * function to take raw key data and convert it * into ascii chars **************************************************/ int toasc(code,local) unsigned int code; int local; { static int ctrl = FALSE; static int shift = FALSE; static int capsl = FALSE; char c; static char keys[75] = { '`','1','2','3','4','5','6','7','8','9','0','-' , '=','\\', 0, '0','q','w','e','r','t','y','u','i','o' , 'p','[',']', 0, '1','2','3','a','s','d','f','g','h' , 'j','k','l',';','\'', 0, 0, '4','5','6', 0, 'z','x','c','v', 'b','n','m',44,'.','/', 0, '.','7','8','9',' ',8, '\t',13,13,27,127,0,0,0,'-' } ; switch ( code ) { case 98: capsl = TRUE; c = 0;break; case 226: capsl = FALSE;c = 0;break; case 99: ctrl = TRUE; c = 0;break; case 227: ctrl = FALSE; c = 0;break; case 96: case 97: shift = TRUE; c = 0;break; case 224: case 225: shift = FALSE;c = 0;break; case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: case 0x58: case 0x59: c = 0; if (shift) sendstring(p_F[code - 0x50]); else sendstring(p_f[code - 0x50]); break; case 0x0f: c=0; sendstring("\033Op"); break; case 0x1d: c=0; sendstring("\033Oq"); break; case 0x1e: c=0; sendstring("\033Or"); break; case 0x1f: c=0; sendstring("\033Os"); break; case 0x2d: c=0; sendstring("\033Ot"); break; case 0x2e: c=0; sendstring("\033Ou"); break; case 0x2f: c=0; sendstring("\033Ov"); break; case 0x3d: c=0; sendstring("\033Ow"); break; case 0x3e: c=0; sendstring("\033Ox"); break; case 0x3f: c=0; sendstring("\033Oy"); break; case 0x43: c=0; sendstring("\033OM"); break; case 0x4a: c=0; sendstring("\033Ol"); break; case 0x5f: c=0; sendstring("\033Om"); break; case 0x3c: c=0; sendstring("\033On"); break; case 0x4c: c=0; sendstring("\033[A"); break; case 0x4d: c=0; sendstring("\033[B"); break; case 0x4e: c=0; sendstring("\033[C"); break; case 0x4f: c=0; sendstring("\033[D"); break; default: if (code < 75) c = keys[code]; else c = 0; } /* add modifiers to the keys */ if (c != 0) { if (shift) { if ((c <= 'z') && (c >= 'a')) c -= 32; else switch( c ) { case '[': c = '{'; break; case ']': c = '}'; break; case '\\': c = '|'; break; case '\'': c = '"'; break; case ';': c = ':'; break; case '/': c = '?'; break; case '.': c = '>'; break; case ',': c = '<'; break; case '`': c = '~'; break; case '=': c = '+'; break; case '-': c = '_'; break; case '1': c = '!'; break; case '2': c = '@'; break; case '3': c = '#'; break; case '4': c = '$'; break; case '5': c = '%'; break; case '6': c = '^'; break; case '7': c = '&'; break; case '8': c = '*'; break; case '9': c = '('; break; case '0': c = ')'; break; default: break; } } else if (capsl && (c <= 'z') && (c >= 'a')) c -= 32; } if (ctrl) { if (c >= '`' && c <= 127) c -= 96; else if (c >= '@' && c <= '_') c -= 64; } if (c != 0 && (!local)) sendchar(c); return((int)c); }