/****************************************************
 * 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);
    }
