You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2771 lines
82 KiB
2771 lines
82 KiB
/* File: D:\WACKER\emu\emuhdl.c (Created: 10-Dec-1993)
|
|
*
|
|
* Copyright 1994-2001 by Hilgraeve Inc. -- Monroe, MI
|
|
* All rights reserved
|
|
*
|
|
* $Revision: 22 $
|
|
* $Date: 7/08/02 6:33p $
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#pragma hdrstop
|
|
// #define DEBUGSTR
|
|
|
|
#include <time.h>
|
|
#include <tapi.h>
|
|
|
|
#include <tdll\stdtyp.h>
|
|
#include <tdll\mc.h>
|
|
#include <tdll\assert.h>
|
|
#include <tdll\sf.h>
|
|
#include <tdll\sess_ids.h>
|
|
#include <tdll\session.h>
|
|
#include <tdll\capture.h>
|
|
#include <tdll\cloop.h>
|
|
#include <tdll\term.h>
|
|
#include <tdll\print.h>
|
|
#include <tdll\update.h>
|
|
#include <tdll\load_res.h>
|
|
#include <tdll\globals.h>
|
|
#include <tdll\statusbr.h>
|
|
#include <tdll\cnct.h>
|
|
#include <tdll\cnct.hh>
|
|
#include <tdll\htchar.h>
|
|
#include <tdll\com.h>
|
|
#include <tdll\errorbox.h> // TimedMessageBox()
|
|
#include <cncttapi\cncttapi.hh> // cncttapiSetLineConfig()
|
|
#include <term\res.h>
|
|
|
|
#include "emu.h"
|
|
#include "emu.hh"
|
|
#include "emuid.h"
|
|
#include "viewdata.hh"
|
|
#include "minitel.hh"
|
|
#include "emudec.hh"
|
|
#include "keytbls.h"
|
|
|
|
// Function prototypes...
|
|
//
|
|
STATIC_FUNC int emuLoadSettings(const HHEMU hhEmu,
|
|
const unsigned int uiId,
|
|
unsigned long ulDataSize,
|
|
void *pvData);
|
|
STATIC_FUNC void emuCheckSettings(struct stEmuBaseSFSettings *pstBaseSettings);
|
|
|
|
// Keytable declarations
|
|
//
|
|
const KEYTBLSTORAGE AnsiKeyTable[MAX_ANSI_KEYS] =
|
|
{
|
|
{VK_UP | VIRTUAL_KEY, {"\x1B[A\xff"}},
|
|
{VK_DOWN | VIRTUAL_KEY, {"\x1B[B\xff"}},
|
|
{VK_RIGHT | VIRTUAL_KEY, {"\x1B[C\xff"}},
|
|
{VK_LEFT | VIRTUAL_KEY, {"\x1B[D\xff"}},
|
|
|
|
// Added 27 Aug 98 rde
|
|
{VK_HOME | VIRTUAL_KEY, {"\x1B[H\xff"}},
|
|
{VK_END | VIRTUAL_KEY, {"\x1B[K\xff"}},
|
|
|
|
//VK_UP | VIRTUAL_KEY | CTRL_KEY, "\x1BOx\xff",
|
|
//VK_DOWN | VIRTUAL_KEY | CTRL_KEY, "\x1BOr\xff",
|
|
//VK_RIGHT | VIRTUAL_KEY | CTRL_KEY, "\x1BOv\xff",
|
|
//VK_LEFT | VIRTUAL_KEY | CTRL_KEY, "\x1BOt\xff",
|
|
|
|
//VK_HOME | VIRTUAL_KEY, "\x1B[H\xff",
|
|
//VK_END | VIRTUAL_KEY, "\x1B[K\xff",
|
|
|
|
//VK_HOME | VIRTUAL_KEY | CTRL_KEY, "\x1BOw\xff",
|
|
//VK_END | VIRTUAL_KEY | CTRL_KEY, "\x1BOq\xff",
|
|
|
|
//VK_PRIOR | VIRTUAL_KEY, "\x1B[M\xff",
|
|
//VK_NEXT | VIRTUAL_KEY, "\x1B[H\x1B[2J\xff",
|
|
|
|
//VK_PRIOR | VIRTUAL_KEY | CTRL_KEY, "\x1BOy\xff",
|
|
//VK_NEXT | VIRTUAL_KEY | CTRL_KEY, "\x1BOs\xff",
|
|
|
|
//VK_RETURN | VIRTUAL_KEY, "\x0D\xff",
|
|
//VK_RETURN | VIRTUAL_KEY | CTRL_KEY, "\x1BOM\xff",
|
|
|
|
//VK_INSERT | VIRTUAL_KEY | CTRL_KEY, "\x1BOp\xff",
|
|
|
|
/* -------------- Function keys ------------- */
|
|
|
|
{VK_F1 | VIRTUAL_KEY, {"\x1BOP\xff"}},
|
|
{VK_F2 | VIRTUAL_KEY, {"\x1BOQ\xff"}},
|
|
{VK_F3 | VIRTUAL_KEY, {"\x1BOR\xff"}},
|
|
{VK_F4 | VIRTUAL_KEY, {"\x1BOS\xff"}},
|
|
|
|
/* -------------- Gray keys, (extended edit pad) ------------- */
|
|
|
|
{VK_UP | VIRTUAL_KEY | EXTENDED_KEY, {"\x1B[A\xff"}},
|
|
{VK_DOWN | VIRTUAL_KEY | EXTENDED_KEY, {"\x1B[B\xff"}},
|
|
{VK_RIGHT | VIRTUAL_KEY | EXTENDED_KEY, {"\x1B[C\xff"}},
|
|
{VK_LEFT | VIRTUAL_KEY | EXTENDED_KEY, {"\x1B[D\xff"}},
|
|
|
|
// Added 27 Aug 98 rde
|
|
{VK_HOME | VIRTUAL_KEY | EXTENDED_KEY, {"\x1B[H\xff"}},
|
|
{VK_END | VIRTUAL_KEY | EXTENDED_KEY, {"\x1B[K\xff"}},
|
|
|
|
//VK_HOME | VIRTUAL_KEY | EXTENDED_KEY, "\x1B[H\xff",
|
|
//VK_END | VIRTUAL_KEY | EXTENDED_KEY, "\x1B[K\xff",
|
|
|
|
//VK_PRIOR | VIRTUAL_KEY | EXTENDED_KEY, "\x1B[M\xff",
|
|
//VK_NEXT | VIRTUAL_KEY | EXTENDED_KEY, "\x1B[H\x1B[2J\xff",
|
|
|
|
{VK_TAB | VIRTUAL_KEY | SHIFT_KEY,{"\x1B\x5B\x5A\xff"}}, /* KT_SHIFT + KN_TAB */
|
|
|
|
|
|
};
|
|
|
|
/* Also for ANSI emulator */
|
|
const KEYTBLSTORAGE IBMPCKeyTable[MAX_IBMPC_KEYS] =
|
|
{
|
|
{VK_BACK, {"\x08\xff"}}, /* KN_BS */
|
|
{VK_DELETE | VIRTUAL_KEY, {"\x00\x53\xff"}}, /* KN_DEL */
|
|
{VK_DOWN | VIRTUAL_KEY, {"\x00\x50\xff"}}, /* KN_DOWN */
|
|
{VK_END | VIRTUAL_KEY, {"\x00\x4F\xff"}}, /* KN_END */
|
|
{VK_RETURN, {"\x0D\xff"}}, /* KN_ENTER */
|
|
{VK_ESCAPE, {"\x1B\xff"}}, /* KN_ESC */
|
|
{VK_F1 | VIRTUAL_KEY, {"\x00\x3B\xff"}}, /* KN_F1 */
|
|
{VK_F2 | VIRTUAL_KEY, {"\x00\x3C\xff"}}, /* KN_F2 */
|
|
{VK_F3 | VIRTUAL_KEY, {"\x00\x3D\xff"}}, /* KN_F3 */
|
|
{VK_F4 | VIRTUAL_KEY, {"\x00\x3E\xff"}}, /* KN_F4 */
|
|
{VK_F5 | VIRTUAL_KEY, {"\x00\x3F\xff"}}, /* KN_F5 */
|
|
{VK_F6 | VIRTUAL_KEY, {"\x00\x40\xff"}}, /* KN_F6 */
|
|
{VK_F7 | VIRTUAL_KEY, {"\x00\x41\xff"}}, /* KN_F7 */
|
|
{VK_F8 | VIRTUAL_KEY, {"\x00\x42\xff"}}, /* KN_F8 */
|
|
{VK_F9 | VIRTUAL_KEY, {"\x00\x43\xff"}}, /* KN_F9 */
|
|
{VK_F10 | VIRTUAL_KEY, {"\x00\x44\xff"}}, /* KN_F10 */
|
|
{VK_F11 | VIRTUAL_KEY, {"\x00\x85\xff"}}, /* KN_F11 */
|
|
{VK_F12 | VIRTUAL_KEY, {"\x00\x86\xff"}}, /* KN_F12 */
|
|
{VK_HOME | VIRTUAL_KEY, {"\x00\x47\xff"}}, /* KN_HOME */
|
|
{VK_INSERT | VIRTUAL_KEY, {"\x00\x52\xff"}}, /* KN_INS */
|
|
{VK_LEFT | VIRTUAL_KEY, {"\x00\x4B\xff"}}, /* KN_LEFT */
|
|
{VK_NEXT | VIRTUAL_KEY, {"\x00\x51\xff"}}, /* KN_PGDN */
|
|
{VK_PRIOR | VIRTUAL_KEY, {"\x00\x49\xff"}}, /* KN_PGUP */
|
|
{VK_RIGHT | VIRTUAL_KEY, {"\x00\x4D\xff"}}, /* KN_RIGHT */
|
|
{VK_TAB, {"\x09\xff"}}, /* KN_TAB */
|
|
{VK_UP | VIRTUAL_KEY, {"\x00\x48\xff"}}, /* KN_UP */
|
|
|
|
{VK_BACK | VIRTUAL_KEY | CTRL_KEY, {"\x7F\xff"}}, /* KT_CTRL + KN_BS */
|
|
{VK_DELETE | VIRTUAL_KEY | CTRL_KEY, {"\x00\x93\xff"}}, /* KT_CTRL + KN_DEL */
|
|
{VK_DOWN | VIRTUAL_KEY | CTRL_KEY, {"\x00\x91\xff"}}, /* KT_CTRL + KN_DOWN */
|
|
{VK_END | VIRTUAL_KEY | CTRL_KEY, {"\x00\x75\xff"}}, /* KT_CTRL + KN_END */
|
|
{VK_RETURN | VIRTUAL_KEY | CTRL_KEY, {"\x0A\xff"}}, /* KT_CTRL + KN_ENTER */
|
|
|
|
{VK_F1 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x5E\xff"}}, /* KT_CTRL + KN_F1 */
|
|
{VK_F10 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x67\xff"}}, /* KT_CTRL + KN_F10 */
|
|
{VK_F11 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x89\xff"}}, /* KT_CTRL + KN_F11 */
|
|
{VK_F12 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x8A\xff"}}, /* KT_CTRL + KN_F12 */
|
|
{VK_F2 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x5F\xff"}}, /* KT_CTRL + KN_F2 */
|
|
{VK_F3 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x60\xff"}}, /* KT_CTRL + KN_F3 */
|
|
{VK_F4 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x61\xff"}}, /* KT_CTRL + KN_F4 */
|
|
{VK_F5 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x62\xff"}}, /* KT_CTRL + KN_F5 */
|
|
{VK_F6 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x63\xff"}}, /* KT_CTRL + KN_F6 */
|
|
{VK_F7 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x64\xff"}}, /* KT_CTRL + KN_F7 */
|
|
{VK_F8 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x65\xff"}}, /* KT_CTRL + KN_F8 */
|
|
{VK_F9 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x66\xff"}}, /* KT_CTRL + KN_F9 */
|
|
{VK_HOME | VIRTUAL_KEY | CTRL_KEY, {"\x00\x77\xff"}}, /* KT_CTRL + KN_HOME */
|
|
{VK_INSERT | VIRTUAL_KEY | CTRL_KEY, {"\x00\x92\xff"}}, /* KT_CTRL + KN_INS */
|
|
{VK_LEFT | VIRTUAL_KEY | CTRL_KEY, {"\x00\x73\xff"}}, /* KT_CTRL + KN_LEFT */
|
|
{VK_F1 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x8F\xff"}}, /* KT_CTRL + KN_MID */
|
|
{VK_PRIOR | VIRTUAL_KEY | CTRL_KEY, {"\x00\x76\xff"}}, /* KT_CTRL + KN_PGDN */
|
|
{VK_NEXT | VIRTUAL_KEY | CTRL_KEY, {"\x00\x84\xff"}}, /* KT_CTRL + KN_PGUP */
|
|
{VK_PRINT | VIRTUAL_KEY | CTRL_KEY, {"\x00\x72\xff"}}, /* KT_CTRL + KN_PRTSC */
|
|
{VK_RIGHT | VIRTUAL_KEY | CTRL_KEY, {"\x00\x74\xff"}}, /* KT_CTRL + KN_RIGHT */
|
|
{VK_TAB | VIRTUAL_KEY | CTRL_KEY, {"\x00\x94\xff"}}, /* KT_CTRL + KN_TAB */
|
|
{VK_UP | VIRTUAL_KEY | CTRL_KEY, {"\x00\x8D\xff"}}, /* KT_CTRL + KN_UP */
|
|
|
|
{VK_F1 | VIRTUAL_KEY | SHIFT_KEY,{"\x00\x54\xff"}}, /* KT_SHIFT + KN_F1 */
|
|
{VK_F10 | VIRTUAL_KEY | SHIFT_KEY,{"\x00\x5D\xff"}}, /* KT_SHIFT + KN_F10 */
|
|
{VK_F11 | VIRTUAL_KEY | SHIFT_KEY,{"\x00\x87\xff"}}, /* KT_SHIFT + KN_F11 */
|
|
{VK_F12 | VIRTUAL_KEY | SHIFT_KEY,{"\x00\x88\xff"}}, /* KT_SHIFT + KN_F12 */
|
|
{VK_F2 | VIRTUAL_KEY | SHIFT_KEY,{"\x00\x55\xff"}}, /* KT_SHIFT + KN_F2 */
|
|
{VK_F3 | VIRTUAL_KEY | SHIFT_KEY,{"\x00\x56\xff"}}, /* KT_SHIFT + KN_F3 */
|
|
{VK_F4 | VIRTUAL_KEY | SHIFT_KEY,{"\x00\x57\xff"}}, /* KT_SHIFT + KN_F4 */
|
|
{VK_F5 | VIRTUAL_KEY | SHIFT_KEY,{"\x00\x58\xff"}}, /* KT_SHIFT + KN_F5 */
|
|
{VK_F6 | VIRTUAL_KEY | SHIFT_KEY,{"\x00\x59\xff"}}, /* KT_SHIFT + KN_F6 */
|
|
{VK_F7 | VIRTUAL_KEY | SHIFT_KEY,{"\x00\x5A\xff"}}, /* KT_SHIFT + KN_F7 */
|
|
{VK_F8 | VIRTUAL_KEY | SHIFT_KEY,{"\x00\x5B\xff"}}, /* KT_SHIFT + KN_F8 */
|
|
{VK_F9 | VIRTUAL_KEY | SHIFT_KEY,{"\x00\x5C\xff"}}, /* KT_SHIFT + KN_F9 */
|
|
{VK_TAB | VIRTUAL_KEY | SHIFT_KEY,{"\x00\x0F\xff"}}, /* KT_SHIFT + KN_TAB */
|
|
|
|
{0x5C | ALT_KEY | VIRTUAL_KEY, {"\x00\x28\xff"}}, /* KT_ALT + '\'' */
|
|
{0x2C | ALT_KEY | VIRTUAL_KEY, {"\x00\x33\xff"}}, /* KT_ALT + ',' */
|
|
{0x2D | ALT_KEY | VIRTUAL_KEY, {"\x00\x82\xff"}}, /* KT_ALT + '-' */
|
|
{0x2E | ALT_KEY | VIRTUAL_KEY, {"\x00\x34\xff"}}, /* KT_ALT + '.' */
|
|
{0x2F | ALT_KEY | VIRTUAL_KEY, {"\x00\x35\xff"}}, /* KT_ALT + '/' */
|
|
{0x30 | ALT_KEY | VIRTUAL_KEY, {"\x00\x81\xff"}}, /* KT_ALT + '0' */
|
|
{0x31 | ALT_KEY | VIRTUAL_KEY, {"\x00\x78\xff"}}, /* KT_ALT + '1' */
|
|
{0x32 | ALT_KEY | VIRTUAL_KEY, {"\x00\x79\xff"}}, /* KT_ALT + '2' */
|
|
{0x33 | ALT_KEY | VIRTUAL_KEY, {"\x00\x7A\xff"}}, /* KT_ALT + '3' */
|
|
{0x34 | ALT_KEY | VIRTUAL_KEY, {"\x00\x7B\xff"}}, /* KT_ALT + '4' */
|
|
{0x35 | ALT_KEY | VIRTUAL_KEY, {"\x00\x7C\xff"}}, /* KT_ALT + '5' */
|
|
{0x36 | ALT_KEY | VIRTUAL_KEY, {"\x00\x7D\xff"}}, /* KT_ALT + '6' */
|
|
{0x37 | ALT_KEY | VIRTUAL_KEY, {"\x00\x7E\xff"}}, /* KT_ALT + '7' */
|
|
{0x38 | ALT_KEY | VIRTUAL_KEY, {"\x00\x7F\xff"}}, /* KT_ALT + '8' */
|
|
{0x39 | ALT_KEY | VIRTUAL_KEY, {"\x00\x80\xff"}}, /* KT_ALT + '9' */
|
|
{0x3B | ALT_KEY | VIRTUAL_KEY, {"\x00\x27\xff"}}, /* KT_ALT + ';' */
|
|
{0x3D | ALT_KEY | VIRTUAL_KEY, {"\x00\x83\xff"}}, /* KT_ALT + '=' */
|
|
{0x41 | ALT_KEY | VIRTUAL_KEY, {"\x00\x1E\xff"}}, /* KT_ALT + 'A' */
|
|
{0x42 | ALT_KEY | VIRTUAL_KEY, {"\x00\x30\xff"}}, /* KT_ALT + 'B' */
|
|
{0x43 | ALT_KEY | VIRTUAL_KEY, {"\x00\x2E\xff"}}, /* KT_ALT + 'C' */
|
|
{0x44 | ALT_KEY | VIRTUAL_KEY, {"\x00\x20\xff"}}, /* KT_ALT + 'D' */
|
|
{0x45 | ALT_KEY | VIRTUAL_KEY, {"\x00\x12\xff"}}, /* KT_ALT + 'E' */
|
|
{0x46 | ALT_KEY | VIRTUAL_KEY, {"\x00\x21\xff"}}, /* KT_ALT + 'F' */
|
|
{0x47 | ALT_KEY | VIRTUAL_KEY, {"\x00\x22\xff"}}, /* KT_ALT + 'G' */
|
|
{0x48 | ALT_KEY | VIRTUAL_KEY, {"\x00\x23\xff"}}, /* KT_ALT + 'H' */
|
|
{0x49 | ALT_KEY | VIRTUAL_KEY, {"\x00\x17\xff"}}, /* KT_ALT + 'I' */
|
|
{0x4A | ALT_KEY | VIRTUAL_KEY, {"\x00\x24\xff"}}, /* KT_ALT + 'J' */
|
|
{0x4B | ALT_KEY | VIRTUAL_KEY, {"\x00\x25\xff"}}, /* KT_ALT + 'K' */
|
|
{0x4C | ALT_KEY | VIRTUAL_KEY, {"\x00\x26\xff"}}, /* KT_ALT + 'L' */
|
|
{0x4D | ALT_KEY | VIRTUAL_KEY, {"\x00\x32\xff"}}, /* KT_ALT + 'M' */
|
|
{0x4E | ALT_KEY | VIRTUAL_KEY, {"\x00\x31\xff"}}, /* KT_ALT + 'N' */
|
|
{0x4F | ALT_KEY | VIRTUAL_KEY, {"\x00\x18\xff"}}, /* KT_ALT + 'O' */
|
|
{0x50 | ALT_KEY | VIRTUAL_KEY, {"\x00\x19\xff"}}, /* KT_ALT + 'P' */
|
|
{0x51 | ALT_KEY | VIRTUAL_KEY, {"\x00\x10\xff"}}, /* KT_ALT + 'Q' */
|
|
{0x52 | ALT_KEY | VIRTUAL_KEY, {"\x00\x13\xff"}}, /* KT_ALT + 'R' */
|
|
{0x53 | ALT_KEY | VIRTUAL_KEY, {"\x00\x1F\xff"}}, /* KT_ALT + 'S' */
|
|
{0x54 | ALT_KEY | VIRTUAL_KEY, {"\x00\x14\xff"}}, /* KT_ALT + 'T' */
|
|
{0x55 | ALT_KEY | VIRTUAL_KEY, {"\x00\x16\xff"}}, /* KT_ALT + 'U' */
|
|
{0x56 | ALT_KEY | VIRTUAL_KEY, {"\x00\x2F\xff"}}, /* KT_ALT + 'V' */
|
|
{0x57 | ALT_KEY | VIRTUAL_KEY, {"\x00\x11\xff"}}, /* KT_ALT + 'W' */
|
|
{0x58 | ALT_KEY | VIRTUAL_KEY, {"\x00\x2D\xff"}}, /* KT_ALT + 'X' */
|
|
{0x59 | ALT_KEY | VIRTUAL_KEY, {"\x00\x15\xff"}}, /* KT_ALT + 'Y' */
|
|
{0x5A | ALT_KEY | VIRTUAL_KEY, {"\x00\x2C\xff"}}, /* KT_ALT + 'Z' */
|
|
{0x5B | ALT_KEY | VIRTUAL_KEY, {"\x00\x1A\xff"}}, /* KT_ALT + '[' */
|
|
{0x5D | ALT_KEY | VIRTUAL_KEY, {"\x00\x1B\xff"}}, /* KT_ALT + ']' */
|
|
{0x60 | ALT_KEY | VIRTUAL_KEY, {"\x00\x29\xff"}}, /* KT_ALT + '`' */
|
|
|
|
{VK_BACK | VIRTUAL_KEY | ALT_KEY, {"\x00\x0E\xff"}}, /* KT_ALT + KN_BS */
|
|
{VK_RETURN | VIRTUAL_KEY | ALT_KEY, {"\x00\x1C\xff"}}, /* KT_ALT + KN_ENTER */
|
|
{VK_ESCAPE | VIRTUAL_KEY | ALT_KEY, {"\x00\x01\xff"}}, /* KT_ALT + KN_ESC */
|
|
{VK_F1 | VIRTUAL_KEY | ALT_KEY, {"\x00\x68\xff"}}, /* KT_ALT + KN_F1 */
|
|
{VK_F10 | VIRTUAL_KEY | ALT_KEY, {"\x00\x71\xff"}}, /* KT_ALT + KN_F10 */
|
|
{VK_F11 | VIRTUAL_KEY | ALT_KEY, {"\x00\x8B\xff"}}, /* KT_ALT + KN_F11 */
|
|
{VK_F12 | VIRTUAL_KEY | ALT_KEY, {"\x00\x8C\xff"}}, /* KT_ALT + KN_F12 */
|
|
{VK_F2 | VIRTUAL_KEY | ALT_KEY, {"\x00\x69\xff"}}, /* KT_ALT + KN_F2 */
|
|
{VK_F3 | VIRTUAL_KEY | ALT_KEY, {"\x00\x6A\xff"}}, /* KT_ALT + KN_F3 */
|
|
{VK_F4 | VIRTUAL_KEY | ALT_KEY, {"\x00\x6B\xff"}}, /* KT_ALT + KN_F4 */
|
|
{VK_F5 | VIRTUAL_KEY | ALT_KEY, {"\x00\x6C\xff"}}, /* KT_ALT + KN_F5 */
|
|
{VK_F6 | VIRTUAL_KEY | ALT_KEY, {"\x00\x6D\xff"}}, /* KT_ALT + KN_F6 */
|
|
{VK_F7 | VIRTUAL_KEY | ALT_KEY, {"\x00\x6E\xff"}}, /* KT_ALT + KN_F7 */
|
|
{VK_F8 | VIRTUAL_KEY | ALT_KEY, {"\x00\x6F\xff"}}, /* KT_ALT + KN_F8 */
|
|
{VK_F9 | VIRTUAL_KEY | ALT_KEY, {"\x00\x70\xff"}}, /* KT_ALT + KN_F9 */
|
|
{VK_TAB | VIRTUAL_KEY | ALT_KEY, {"\x00\xA5\xff"}}, /* KT_ALT + KN_TAB */
|
|
|
|
{VK_RETURN | EXTENDED_KEY, {"\x00\xE0\x0D\xff"}}, /* KT_KP + KN_ENTER */
|
|
|
|
{0x2F | EXTENDED_KEY, {"\x00\xE0\x2F\xff"}}, /* KT_KP + '/' */
|
|
|
|
{VK_MULTIPLY | VIRTUAL_KEY, {"\x2A\xff"}}, /* KT_KP + '*' */
|
|
{VK_ADD | VIRTUAL_KEY, {"\x2B\xff"}}, /* KT_KP + '+' */
|
|
{VK_SUBTRACT | VIRTUAL_KEY, {"\x2D\xff"}}, /* KT_KP + '-' */
|
|
{VK_DECIMAL | VIRTUAL_KEY, {"\x2E\xff"}}, /* KT_KP + '.' */
|
|
{VK_NUMPAD0 | VIRTUAL_KEY, {"\x30\xff"}}, /* KT_KP + '0' */
|
|
{VK_NUMPAD1 | VIRTUAL_KEY, {"\x31\xff"}}, /* KT_KP + '1' */
|
|
{VK_NUMPAD2 | VIRTUAL_KEY, {"\x32\xff"}}, /* KT_KP + '2' */
|
|
{VK_NUMPAD3 | VIRTUAL_KEY, {"\x33\xff"}}, /* KT_KP + '3' */
|
|
{VK_NUMPAD4 | VIRTUAL_KEY, {"\x34\xff"}}, /* KT_KP + '4' */
|
|
{VK_NUMPAD5 | VIRTUAL_KEY, {"\x35\xff"}}, /* KT_KP + '5' */
|
|
{VK_NUMPAD6 | VIRTUAL_KEY, {"\x36\xff"}}, /* KT_KP + '6' */
|
|
{VK_NUMPAD7 | VIRTUAL_KEY, {"\x37\xff"}}, /* KT_KP + '7' */
|
|
{VK_NUMPAD8 | VIRTUAL_KEY, {"\x38\xff"}}, /* KT_KP + '8' */
|
|
{VK_NUMPAD9 | VIRTUAL_KEY, {"\x39\xff"}}, /* KT_KP + '9' */
|
|
|
|
{VK_MULTIPLY | VIRTUAL_KEY | CTRL_KEY, {"\x00\x96\xff"}}, /* KT_CTRL + KT_KP + '*' */
|
|
{VK_ADD | VIRTUAL_KEY | CTRL_KEY, {"\x00\x90\xff"}}, /* KT_CTRL + KT_KP + '+' */
|
|
{VK_SUBTRACT | VIRTUAL_KEY | CTRL_KEY, {"\x00\x8E\xff"}}, /* KT_CTRL + KT_KP + '-' */
|
|
{VK_DIVIDE | VIRTUAL_KEY | EXTENDED_KEY | CTRL_KEY, {"\x00\x95\xff"}}, /* KT_CTRL + KT_KP + '/' */
|
|
{0x0a | EXTENDED_KEY | CTRL_KEY, {"\x0A\xff"}}, /* KT_CTRL+KT_KP+KN_ENTER */
|
|
|
|
{VK_MULTIPLY | VIRTUAL_KEY | ALT_KEY, {"\x00\x37\xff"}}, /* KT_ALT + KT_KP + '*' */
|
|
{VK_ADD | VIRTUAL_KEY | ALT_KEY, {"\x00\x4E\xff"}}, /* KT_ALT + KT_KP + '+' */
|
|
{VK_SUBTRACT | VIRTUAL_KEY | ALT_KEY, {"\x00\x4A\xff"}}, /* KT_ALT + KT_KP + '-' */
|
|
{VK_DIVIDE | VIRTUAL_KEY | ALT_KEY, {"\x00\xA4\xff"}}, /* KT_ALT + KT_KP + '/' */
|
|
|
|
{0x0d | VIRTUAL_KEY | EXTENDED_KEY | ALT_KEY, {"\x00\xA6\xff"}}, /* KT_ALT + KT_KP +KN_ENTER */
|
|
|
|
{VK_DELETE | VIRTUAL_KEY | EXTENDED_KEY, {"\x00\xE0\x53\xff"}}, /* KT_EP +KN_DEL */
|
|
{VK_DOWN | VIRTUAL_KEY | EXTENDED_KEY, {"\x00\xE0\x50\xff"}}, /* KT_EP +KN_DOWN */
|
|
{VK_END | VIRTUAL_KEY | EXTENDED_KEY, {"\x00\xE0\x4F\xff"}}, /* KT_EP +KN_END */
|
|
{VK_HOME | VIRTUAL_KEY | EXTENDED_KEY, {"\x00\xE0\x47\xff"}}, /* KT_EP +KN_HOME */
|
|
{VK_INSERT | VIRTUAL_KEY | EXTENDED_KEY, {"\x00\xE0\x52\xff"}}, /* KT_EP +KN_INS */
|
|
{VK_LEFT | VIRTUAL_KEY | EXTENDED_KEY, {"\x00\xE0\x4B\xff"}}, /* KT_EP +KN_LEFT */
|
|
{VK_NEXT | VIRTUAL_KEY | EXTENDED_KEY, {"\x00\xE0\x51\xff"}}, /* KT_EP +KN_PGDN */
|
|
{VK_PRIOR | VIRTUAL_KEY | EXTENDED_KEY, {"\x00\xE0\x49\xff"}}, /* KT_EP +KN_PGUP */
|
|
{VK_RIGHT | VIRTUAL_KEY | EXTENDED_KEY, {"\x00\xE0\x4D\xff"}}, /* KT_EP +KN_RIGHT */
|
|
{VK_UP | VIRTUAL_KEY | EXTENDED_KEY, {"\x00\xE0\x48\xff"}}, /* KT_EP +KN_UP */
|
|
|
|
{VK_DELETE | VIRTUAL_KEY | EXTENDED_KEY | CTRL_KEY, {"\x00\xE0\x93\xff"}}, /* KT_CTRL + KT_EP +KN_DEL */
|
|
{VK_DOWN | VIRTUAL_KEY | EXTENDED_KEY | CTRL_KEY, {"\x00\xE0\x91\xff"}}, /* KT_CTRL + KT_EP +KN_DOWN */
|
|
{VK_END | VIRTUAL_KEY | EXTENDED_KEY | CTRL_KEY, {"\x00\xE0\x75\xff"}}, /* KT_CTRL + KT_EP +KN_END */
|
|
{VK_HOME | VIRTUAL_KEY | EXTENDED_KEY | CTRL_KEY, {"\x00\xE0\x77\xff"}}, /* KT_CTRL + KT_EP +KN_HOME */
|
|
{VK_INSERT | VIRTUAL_KEY | EXTENDED_KEY | CTRL_KEY, {"\x00\xE0\x92\xff"}}, /* KT_CTRL + KT_EP +KN_INS */
|
|
{VK_LEFT | VIRTUAL_KEY | EXTENDED_KEY | CTRL_KEY, {"\x00\xE0\x73\xff"}}, /* KT_CTRL + KT_EP +KN_LEFT */
|
|
{VK_NEXT | VIRTUAL_KEY | EXTENDED_KEY | CTRL_KEY, {"\x00\xE0\x76\xff"}}, /* KT_CTRL + KT_EP +KN_PGDN */
|
|
{VK_PRIOR | VIRTUAL_KEY | EXTENDED_KEY | CTRL_KEY, {"\x00\xE0\x84\xff"}}, /* KT_CTRL + KT_EP +KN_PGUP */
|
|
{VK_RIGHT | VIRTUAL_KEY | EXTENDED_KEY | CTRL_KEY, {"\x00\xE0\x74\xff"}}, /* KT_CTRL + KT_EP +KN_RIGHT */
|
|
{VK_UP | VIRTUAL_KEY | EXTENDED_KEY | CTRL_KEY, {"\x00\xE0\x8D\xff"}}, /* KT_CTRL + KT_EP +KN_UP */
|
|
|
|
{VK_DELETE | VIRTUAL_KEY | EXTENDED_KEY | ALT_KEY, {"\x00\xA3\xff"}}, /* KT_ALT + KT_EP +KN_DEL */
|
|
{VK_DOWN | VIRTUAL_KEY | EXTENDED_KEY | ALT_KEY, {"\x00\xA0\xff"}}, /* KT_ALT + KT_EP +KN_DOWN */
|
|
{VK_END | VIRTUAL_KEY | EXTENDED_KEY | ALT_KEY, {"\x00\x9F\xff"}}, /* KT_ALT + KT_EP +KN_END */
|
|
{VK_HOME | VIRTUAL_KEY | EXTENDED_KEY | ALT_KEY, {"\x00\x97\xff"}}, /* KT_ALT + KT_EP +KN_HOME */
|
|
{VK_INSERT | VIRTUAL_KEY | EXTENDED_KEY | ALT_KEY, {"\x00\xA2\xff"}}, /* KT_ALT + KT_EP +KN_INS */
|
|
{VK_LEFT | VIRTUAL_KEY | EXTENDED_KEY | ALT_KEY, {"\x00\x9B\xff"}}, /* KT_ALT + KT_EP +KN_LEFT */
|
|
{VK_NEXT | VIRTUAL_KEY | EXTENDED_KEY | ALT_KEY, {"\x00\xA1\xff"}}, /* KT_ALT + KT_EP +KN_PGDN */
|
|
{VK_PRIOR | VIRTUAL_KEY | EXTENDED_KEY | ALT_KEY, {"\x00\x99\xff"}}, /* KT_ALT + KT_EP +KN_PGUP */
|
|
{VK_RIGHT | VIRTUAL_KEY | EXTENDED_KEY | ALT_KEY, {"\x00\x9D\xff"}}, /* KT_ALT + KT_EP +KN_RIGHT */
|
|
{VK_UP | VIRTUAL_KEY | EXTENDED_KEY | ALT_KEY, {"\x00\x98\xff"}}, /* KT_ALT + KT_EP +KN_UP */
|
|
|
|
{0x32 | VIRTUAL_KEY | CTRL_KEY, {"\x00\x03\xff"}}, /* KT_CTRL + '@' (NUL) */
|
|
};
|
|
|
|
|
|
/* for VT52 emulator */
|
|
const KEYTBLSTORAGE VT52KeyTable[MAX_VT52_KEYS] =
|
|
{
|
|
{VK_UP | EXTENDED_KEY | VIRTUAL_KEY,{"\x1B\x41\xff"}}, /* KN_UP */
|
|
{VK_DOWN | EXTENDED_KEY | VIRTUAL_KEY,{"\x1B\x42\xff"}}, /* KN_DOWN */
|
|
{VK_RIGHT| EXTENDED_KEY | VIRTUAL_KEY,{"\x1B\x43\xff"}}, /* KN_RIGHT */
|
|
{VK_LEFT | EXTENDED_KEY | VIRTUAL_KEY,{"\x1B\x44\xff"}}, /* KN_LEFT */
|
|
|
|
{VK_UP | VIRTUAL_KEY, {"\x1B\x41\xff"}}, /* KN_UP */
|
|
{VK_DOWN | VIRTUAL_KEY, {"\x1B\x42\xff"}}, /* KN_DOWN */
|
|
{VK_RIGHT| VIRTUAL_KEY, {"\x1B\x43\xff"}}, /* KN_RIGHT */
|
|
{VK_LEFT | VIRTUAL_KEY, {"\x1B\x44\xff"}}, /* KN_LEFT */
|
|
|
|
{VK_F1 | VIRTUAL_KEY, {"\x1BP\xff"}}, /* KN_F1 */
|
|
{VK_F2 | VIRTUAL_KEY, {"\x1BQ\xff"}}, /* KN_F2 */
|
|
{VK_F3 | VIRTUAL_KEY, {"\x1BR\xff"}}, /* KN_F3 */
|
|
{VK_F4 | VIRTUAL_KEY, {"\x1BS\xff"}}, /* KN_F4 */
|
|
|
|
{VK_F1 | EXTENDED_KEY | VIRTUAL_KEY, {"\x1BP\xff"}}, /* KN_F1 */
|
|
{VK_F2 | EXTENDED_KEY | VIRTUAL_KEY, {"\x1BQ\xff"}}, /* KN_F2 */
|
|
{VK_F3 | EXTENDED_KEY | VIRTUAL_KEY, {"\x1BR\xff"}}, /* KN_F3 */
|
|
{VK_F4 | EXTENDED_KEY | VIRTUAL_KEY, {"\x1BS\xff"}}, /* KN_F4 */
|
|
|
|
{VK_DELETE | VIRTUAL_KEY, {"\x7F\xff"}}, /* KN_DEL */
|
|
{VK_DELETE | VIRTUAL_KEY | EXTENDED_KEY,{"\x7F\xff"}}, /* KN_DEL */
|
|
|
|
{VK_ADD | VIRTUAL_KEY, {",\xff"}},
|
|
};
|
|
|
|
const KEYTBLSTORAGE VT52_Keypad_KeyTable[MAX_VT52_KEYPAD_KEYS] =
|
|
{
|
|
{VK_NUMPAD0 | VIRTUAL_KEY, {"\x1B?p\xff"}}, /* KT_KP + '0' (alternate mode) */
|
|
{VK_NUMPAD1 | VIRTUAL_KEY, {"\x1B?q\xff"}}, /* KT_KP + '1' (alternate mode) */
|
|
{VK_NUMPAD2 | VIRTUAL_KEY, {"\x1B?r\xff"}}, /* KT_KP + '2' (alternate mode) */
|
|
{VK_NUMPAD3 | VIRTUAL_KEY, {"\x1B?s\xff"}}, /* KT_KP + '3' (alternate mode) */
|
|
{VK_NUMPAD4 | VIRTUAL_KEY, {"\x1B?t\xff"}}, /* KT_KP + '4' (alternate mode) */
|
|
{VK_NUMPAD5 | VIRTUAL_KEY, {"\x1B?u\xff"}}, /* KT_KP + '5' (alternate mode) */
|
|
{VK_NUMPAD6 | VIRTUAL_KEY, {"\x1B?v\xff"}}, /* KT_KP + '6' (alternate mode) */
|
|
{VK_NUMPAD7 | VIRTUAL_KEY, {"\x1B?w\xff"}}, /* KT_KP + '7' (alternate mode) */
|
|
{VK_NUMPAD8 | VIRTUAL_KEY, {"\x1B?x\xff"}}, /* KT_KP + '8' (alternate mode) */
|
|
{VK_NUMPAD9 | VIRTUAL_KEY, {"\x1B?y\xff"}}, /* KT_KP + '9' (alternate mode) */
|
|
{VK_DECIMAL | VIRTUAL_KEY, {"\x1B?n\xff"}}, /* KT_KP + '.' (alternate mode) */
|
|
|
|
{VK_ADD | VIRTUAL_KEY, {"\x1B?l\xff"}}, /* KT_KP + '+' (alternate mode) */
|
|
{VK_RETURN | EXTENDED_KEY, {"\x1B?M\xff"}}, /* KT_KP + enter (alternate mode) */
|
|
{VK_SUBTRACT | VIRTUAL_KEY, {"\x1B?m\xff"}}, /* KT_KP + '-' (alternate mode) */
|
|
};
|
|
|
|
const KEYTBLSTORAGE VT_PF_KeyTable[MAX_VT_PF_KEYS] =
|
|
{
|
|
{VK_NUMLOCK | VIRTUAL_KEY | EXTENDED_KEY, {"\x1BP\xff"}}, /* KT_KP + NUMLOCK */
|
|
{0x2F | EXTENDED_KEY, {"\x1BQ\xff"}}, /* KT_KP + '/' */
|
|
{VK_MULTIPLY | VIRTUAL_KEY, {"\x1BR\xff"}}, /* KT_KP + '*' */
|
|
{VK_SUBTRACT | VIRTUAL_KEY, {"\x1BS\xff"}}, /* KT_KP + '-' */
|
|
};
|
|
|
|
/* for VT100 emulator */
|
|
|
|
const KEYTBLSTORAGE VT100KeyTable[MAX_VT100_KEYS] =
|
|
{
|
|
{VK_UP | VIRTUAL_KEY, {"\x1B[A\xff"}}, /* KN_UP */
|
|
{VK_DOWN | VIRTUAL_KEY, {"\x1B[B\xff"}}, /* KN_DOWN */
|
|
{VK_RIGHT| VIRTUAL_KEY, {"\x1B[C\xff"}}, /* KN_RIGHT */
|
|
{VK_LEFT | VIRTUAL_KEY, {"\x1B[D\xff"}}, /* KN_LEFT */
|
|
|
|
{VK_UP | EXTENDED_KEY | VIRTUAL_KEY, {"\x1B[A\xff"}}, /* KN_UP */
|
|
{VK_DOWN | EXTENDED_KEY | VIRTUAL_KEY,{"\x1B[B\xff"}}, /* KN_DOWN */
|
|
{VK_RIGHT| EXTENDED_KEY | VIRTUAL_KEY,{"\x1B[C\xff"}}, /* KN_RIGHT */
|
|
{VK_LEFT | EXTENDED_KEY | VIRTUAL_KEY,{"\x1B[D\xff"}}, /* KN_LEFT */
|
|
|
|
{VK_F1 | VIRTUAL_KEY, {"\x1BOP\xff"}}, /* KN_F1 */
|
|
{VK_F2 | VIRTUAL_KEY, {"\x1BOQ\xff"}}, /* KN_F2 */
|
|
{VK_F3 | VIRTUAL_KEY, {"\x1BOR\xff"}}, /* KN_F3 */
|
|
{VK_F4 | VIRTUAL_KEY, {"\x1BOS\xff"}}, /* KN_F4 */
|
|
|
|
{VK_F1 | EXTENDED_KEY | VIRTUAL_KEY, {"\x1BOP\xff"}}, /* KN_F1 */
|
|
{VK_F2 | EXTENDED_KEY | VIRTUAL_KEY, {"\x1BOQ\xff"}}, /* KN_F2 */
|
|
{VK_F3 | EXTENDED_KEY | VIRTUAL_KEY, {"\x1BOR\xff"}}, /* KN_F3 */
|
|
{VK_F4 | EXTENDED_KEY | VIRTUAL_KEY, {"\x1BOS\xff"}}, /* KN_F4 */
|
|
|
|
{VK_DELETE | VIRTUAL_KEY, {"\x7F\xff"}}, /* KN_DEL */
|
|
{VK_DELETE | VIRTUAL_KEY | EXTENDED_KEY,{"\x7F\xff"}}, /* KN_DEL */
|
|
|
|
{VK_ADD | VIRTUAL_KEY, {",\xff"}},
|
|
|
|
{VK_SPACE | VIRTUAL_KEY | CTRL_KEY, {"\x00\xff"}}, /* CTRL + SPACE */
|
|
{0x32 | VIRTUAL_KEY | SHIFT_KEY | CTRL_KEY, {"\x00\xff"}}, /* CTRL + @ */
|
|
{0x32 | VIRTUAL_KEY | CTRL_KEY, {"\x00\xff"}}, /* CTRL + 2 */
|
|
{0x36 | VIRTUAL_KEY | CTRL_KEY, {"\x1e\xff"}}, /* CTRL + 6 */
|
|
{0xbd | VIRTUAL_KEY | CTRL_KEY, {"\x1f\xff"}}, /* CTRL + - */
|
|
};
|
|
|
|
const KEYTBLSTORAGE VT100_Cursor_KeyTable[MAX_VT100_CURSOR_KEYS] =
|
|
{
|
|
{VK_UP | EXTENDED_KEY | VIRTUAL_KEY, {"\x1BOA\xff"}}, /* KN_UP */
|
|
{VK_DOWN | EXTENDED_KEY | VIRTUAL_KEY,{"\x1BOB\xff"}}, /* KN_DOWN */
|
|
{VK_RIGHT| EXTENDED_KEY | VIRTUAL_KEY,{"\x1BOC\xff"}}, /* KN_RIGHT */
|
|
{VK_LEFT | EXTENDED_KEY | VIRTUAL_KEY,{"\x1BOD\xff"}}, /* KN_LEFT */
|
|
|
|
{VK_UP | VIRTUAL_KEY, {"\x1BOA\xff"}}, /* KN_UP */
|
|
{VK_DOWN | VIRTUAL_KEY, {"\x1BOB\xff"}}, /* KN_DOWN */
|
|
{VK_RIGHT| VIRTUAL_KEY, {"\x1BOC\xff"}}, /* KN_RIGHT */
|
|
{VK_LEFT | VIRTUAL_KEY, {"\x1BOD\xff"}}, /* KN_LEFT */
|
|
};
|
|
|
|
const KEYTBLSTORAGE VT100_Keypad_KeyTable[MAX_VT100_KEYPAD_KEYS] =
|
|
{
|
|
{VK_NUMPAD0 | VIRTUAL_KEY, {"\x1BOp\xff"}}, /* KT_KP + '0' (alternate mode) */
|
|
{VK_NUMPAD1 | VIRTUAL_KEY, {"\x1BOq\xff"}}, /* KT_KP + '1' (alternate mode) */
|
|
{VK_NUMPAD2 | VIRTUAL_KEY, {"\x1BOr\xff"}}, /* KT_KP + '2' (alternate mode) */
|
|
{VK_NUMPAD3 | VIRTUAL_KEY, {"\x1BOs\xff"}}, /* KT_KP + '3' (alternate mode) */
|
|
{VK_NUMPAD4 | VIRTUAL_KEY, {"\x1BOt\xff"}}, /* KT_KP + '4' (alternate mode) */
|
|
{VK_NUMPAD5 | VIRTUAL_KEY, {"\x1BOu\xff"}}, /* KT_KP + '5' (alternate mode) */
|
|
{VK_NUMPAD6 | VIRTUAL_KEY, {"\x1BOv\xff"}}, /* KT_KP + '6' (alternate mode) */
|
|
{VK_NUMPAD7 | VIRTUAL_KEY, {"\x1BOw\xff"}}, /* KT_KP + '7' (alternate mode) */
|
|
{VK_NUMPAD8 | VIRTUAL_KEY, {"\x1BOx\xff"}}, /* KT_KP + '8' (alternate mode) */
|
|
{VK_NUMPAD9 | VIRTUAL_KEY, {"\x1BOy\xff"}}, /* KT_KP + '9' (alternate mode) */
|
|
{VK_DECIMAL | VIRTUAL_KEY, {"\x1BOn\xff"}}, /* KT_KP + '.' (alternate mode) */
|
|
|
|
{VK_ADD | VIRTUAL_KEY, {"\x1BOl\xff"}}, /* KT_KP + '*' (alternate mode) */
|
|
{VK_RETURN | EXTENDED_KEY, {"\x1BOM\xff"}}, /* KT_KP + '+' (alternate mode) */
|
|
{VK_SUBTRACT | VIRTUAL_KEY, {"\x1BOm\xff"}}, /* KT_KP + '-' (alternate mode) */
|
|
};
|
|
|
|
#if defined(INCL_MINITEL)
|
|
const KEYTBLSTORAGE Minitel_KeyTable[MAX_MINITEL_KEYS] =
|
|
{
|
|
{0x4D | VIRTUAL_KEY | CTRL_KEY, {"\x0D\xff"}}, /* ctrl-m */
|
|
|
|
{VK_RETURN | VIRTUAL_KEY, {"\x13\x41\xff"}}, /* Envoi CNTRL-MA*/
|
|
{VK_RETURN | EXTENDED_KEY, {"\x13\x41\xff"}}, /* Send CNTRL-MA*/
|
|
{VK_TAB | VIRTUAL_KEY, {"\x13\x41\xff"}}, /* Send CNTRL-MA*/
|
|
{VK_F8 | VIRTUAL_KEY, {"\x13\x41\xff"}}, /* Send CNTRL-MA*/
|
|
|
|
{VK_HOME | VIRTUAL_KEY, {"\x13\x46"}}, /* Sommaire CNTRL-MF*/
|
|
{VK_HOME | VIRTUAL_KEY | EXTENDED_KEY, {"\x13\x46\xff"}}, /* Index CNTRL-MF*/
|
|
{VK_F1 | VIRTUAL_KEY, {"\x13\x46\xff"}}, /* Index CNTRL-MF*/
|
|
|
|
{VK_DELETE | VIRTUAL_KEY, {"\x13\x45\xff"}}, /* Annulation CNTRL-ME*/
|
|
{VK_DELETE | VIRTUAL_KEY | EXTENDED_KEY, {"\x13\x45\xff"}}, /* Cancel CNTRL-ME*/
|
|
{VK_F2 | VIRTUAL_KEY, {"\x13\x45\xff"}}, /* Cancel CNTRL-ME*/
|
|
|
|
{VK_PRIOR | VIRTUAL_KEY, {"\x13\x42\xff"}}, /* Retour CNTRL-MB*/
|
|
{VK_PRIOR | VIRTUAL_KEY | EXTENDED_KEY, {"\x13\x42\xff"}}, /* Previous CNTRL-MB*/
|
|
{VK_F3 | VIRTUAL_KEY, {"\x13\x42\xff"}}, /* Previous CNTRL-MB*/
|
|
|
|
{VK_INSERT | VIRTUAL_KEY, {"\x13\x43\xff"}}, /* Repeat CNTRL-MC*/
|
|
{VK_INSERT | VIRTUAL_KEY | EXTENDED_KEY, {"\x13\x43\xff"}}, /* Repeat CNTRL-MC*/
|
|
{VK_F4 | VIRTUAL_KEY, {"\x13\x43\xff"}}, /* Repeat CNTRL-MC*/
|
|
|
|
{VK_BACK | VIRTUAL_KEY, {"\x13\x47\xff"}}, /* Correct CNTRL-MG*/
|
|
{VK_F6 | VIRTUAL_KEY, {"\x13\x47\xff"}}, /* Correct CNTRL-MG*/
|
|
|
|
{VK_INSERT | VIRTUAL_KEY, {"\x13\x44\xff"}}, /* Guide CNTRL-MD*/
|
|
{VK_INSERT | VIRTUAL_KEY | EXTENDED_KEY, {"\x13\x44\xff"}}, /* Guide CNTRL-MD*/
|
|
{VK_F5 | VIRTUAL_KEY, {"\x13\x44\xff"}}, /* Guide CNTRL-MD*/
|
|
|
|
{VK_NEXT | VIRTUAL_KEY, {"\x13\x48\xff"}}, /* Suite CNTRL-MH*/
|
|
{VK_NEXT | VIRTUAL_KEY | EXTENDED_KEY, {"\x13\x48\xff"}}, /* Next CNTRL-MH*/
|
|
{VK_F7 | VIRTUAL_KEY, {"\x13\x48\xff"}}, /* Next CNTRL-MH*/
|
|
|
|
{VK_F9 | VIRTUAL_KEY, {"\x13\x49\xff"}}, /* Connect (page 123) */
|
|
|
|
// Page 124
|
|
|
|
{VK_UP | VIRTUAL_KEY, {"\x1B[A\xff"}},
|
|
{VK_UP | VIRTUAL_KEY | EXTENDED_KEY, {"\x1B[A\xff"}},
|
|
|
|
{VK_UP | VIRTUAL_KEY | SHIFT_KEY, {"\x1B[M\xff"}},
|
|
{VK_UP | VIRTUAL_KEY | EXTENDED_KEY | SHIFT_KEY, {"\x1B[M\xff"}},
|
|
|
|
{VK_DOWN | VIRTUAL_KEY, {"\x1B[B\xff"}},
|
|
{VK_DOWN | VIRTUAL_KEY | EXTENDED_KEY, {"\x1B[B\xff"}},
|
|
|
|
{VK_DOWN | VIRTUAL_KEY | SHIFT_KEY, {"\x1B[L\xff"}},
|
|
{VK_DOWN | VIRTUAL_KEY | SHIFT_KEY | EXTENDED_KEY, {"\x1B[L\xff"}},
|
|
|
|
{VK_RIGHT | VIRTUAL_KEY, {"\x1B[C\xff"}},
|
|
{VK_RIGHT | VIRTUAL_KEY | EXTENDED_KEY, {"\x1B[C\xff"}},
|
|
|
|
/* See minitel kbdin routine on this one - mrw */
|
|
{VK_RIGHT | VIRTUAL_KEY | SHIFT_KEY, {"\x1B[4\xff"}},
|
|
{VK_RIGHT | VIRTUAL_KEY | SHIFT_KEY | EXTENDED_KEY, {"\x1B[4\xff"}},
|
|
|
|
{VK_LEFT | VIRTUAL_KEY, {"\x1B[D\xff"}},
|
|
{VK_LEFT | VIRTUAL_KEY | EXTENDED_KEY, {"\x1B[D\xff"}},
|
|
|
|
{VK_LEFT | VIRTUAL_KEY | SHIFT_KEY, {"\x1B[P\xff"}},
|
|
{VK_LEFT | VIRTUAL_KEY | SHIFT_KEY | EXTENDED_KEY, {"\x1B[P\xff"}},
|
|
{VK_LEFT | VIRTUAL_KEY | CTRL_KEY, {"\x7F\xff"}},
|
|
{VK_LEFT | VIRTUAL_KEY | CTRL_KEY | EXTENDED_KEY, {"\x7F\xff"}},
|
|
|
|
/* numpad enter */
|
|
{VK_RETURN | VIRTUAL_KEY | EXTENDED_KEY, {"\x13\x41\xff"}},
|
|
{VK_RETURN | VIRTUAL_KEY | EXTENDED_KEY | SHIFT_KEY, {"\x1B[H\xff"}},
|
|
{VK_RETURN | VIRTUAL_KEY | EXTENDED_KEY | CTRL_KEY, {"\x1B[2J\xff"}},
|
|
|
|
// page 118
|
|
|
|
{0xA3, {"\x19\x23\xff"}}, // British pound symbol.
|
|
{0xA7, {"\x19\x27\xff"}}, // Paragraph symbol.
|
|
{0xA8, {"\x19\x48\xff"}}, // umluot
|
|
|
|
{0xB0, {"\x19\x30\xff"}}, // degree symbol
|
|
{0xB1, {"\x19\x31\xff"}}, // plus over minus symbol
|
|
{0xB4, {"\x19\x42\xff"}}, // accute accent
|
|
{0xBC, {"\x19\x3C\xff"}}, // 1/4
|
|
{0xBD, {"\x19\x3D\xff"}}, // 1/2
|
|
{0xBE, {"\x19\x3E\xff"}}, // 3/4
|
|
{0xB8, {"\x19\x4B\xff"}}, // beard
|
|
|
|
{0xC0, {"\x19\x2D\xff"}}, // up arrow symbol
|
|
{0xC3, {"\x19\x2C\xff"}}, // left arrow symbol
|
|
{0xC4, {"\x19\x2E\xff"}}, // right arrow symbol
|
|
{0xC5, {"\x19\x2F\xff"}}, // down arrow symbol
|
|
|
|
{0xDF, {"\x19\x7B\xff"}}, // Beta
|
|
|
|
{0xE0, {"\x19\x41\x61\xff"}}, // a grave accent
|
|
{0xE2, {"\x19\x43\x61\xff"}}, // a circumflex
|
|
{0xE4, {"\x19\x48\x61\xff"}}, // a umluot
|
|
{0xE7, {"\x19\x4B\x63\xff"}}, // c with a beard
|
|
{0xE8, {"\x19\x41\x65\xff"}}, // e grave accent
|
|
{0xE9, {"\x19\x42\x65\xff"}}, // e accute accent
|
|
{0xEA, {"\x19\x43\x65\xff"}}, // e circumflex
|
|
{0xEB, {"\x19\x48\x65\xff"}}, // e umluot
|
|
{0xEE, {"\x19\x43\x69\xff"}}, // i circumflex
|
|
{0xEF, {"\x19\x48\x69\xff"}}, // i umluot
|
|
|
|
{0xF4, {"\x19\x43\x6f\xff"}}, // o circumflex
|
|
{0xF5, {"\x19\x48\x6f\xff"}}, // o umluot
|
|
{0xF7, {"\x19\x38\xff"}}, // divide-by symbol
|
|
{0xF9, {"\x19\x41\x75\xff"}}, // u grave accent
|
|
{0xFB, {"\x19\x43\x75\xff"}}, // u circumflex
|
|
{0xFC, {"\x19\x48\x75\xff"}}, // u circumflex
|
|
|
|
{0x5E, {"\x19\x43\xff"}}, // circumflex accent (^)
|
|
{0x60, {"\x19\x41\xff"}}, // grave accent(`)
|
|
{0x8C, {"\x19\x6A\xff"}}, // big OE
|
|
{0x9C, {"\x19\x7A\xff"}}, // little oe
|
|
};
|
|
#endif
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuCreateHdl
|
|
*
|
|
* DESCRIPTION:
|
|
* Creates an emulator handle. The creation of an Emulator handle
|
|
* includes setting default user settings and loading the ANSI
|
|
* emulator.
|
|
*
|
|
* ARGUMENTS:
|
|
* hSession - session handle.
|
|
*
|
|
* RETURNS:
|
|
* HEMU or zero on error.
|
|
*
|
|
*/
|
|
HEMU emuCreateHdl(const HSESSION hSession)
|
|
{
|
|
HHEMU hhEmu;
|
|
|
|
hhEmu = malloc(sizeof(*hhEmu));
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(FALSE);
|
|
return 0;
|
|
}
|
|
|
|
memset(hhEmu, 0, sizeof(*hhEmu));
|
|
|
|
InitializeCriticalSection(&hhEmu->csEmu);
|
|
|
|
hhEmu->hSession = hSession;
|
|
|
|
// Create and load the Emulator Name & Id table.
|
|
//
|
|
if (!emuCreateNameTable(hhEmu))
|
|
{
|
|
assert(FALSE);
|
|
emuDestroyHdl((HEMU)hhEmu);
|
|
hhEmu = NULL;
|
|
return 0;
|
|
}
|
|
|
|
// Create the text and attribute buffers.
|
|
//
|
|
if (!emuCreateTextAttrBufs((HEMU)hhEmu, MAX_EMUROWS, MAX_EMUCOLS))
|
|
{
|
|
assert(FALSE);
|
|
emuDestroyHdl((HEMU)hhEmu);
|
|
hhEmu = NULL;
|
|
return 0;
|
|
}
|
|
|
|
// Create the Print handle used for Printer Echo.
|
|
//
|
|
hhEmu->hPrintEcho = printCreateHdl(hSession);
|
|
if(hhEmu->hPrintEcho == 0)
|
|
{
|
|
assert(FALSE);
|
|
emuDestroyHdl((HEMU)hhEmu);
|
|
hhEmu = NULL;
|
|
return 0;
|
|
}
|
|
|
|
// Create the Print handle used for Host directed printing.
|
|
//
|
|
hhEmu->hPrintHost = printCreateHdl(hSession);
|
|
if (hhEmu->hPrintHost == 0)
|
|
{
|
|
assert(FALSE);
|
|
emuDestroyHdl((HEMU)hhEmu);
|
|
hhEmu = NULL;
|
|
return 0;
|
|
}
|
|
|
|
// Initialize the user settings for the emulation handle.
|
|
//
|
|
if (emuInitializeHdl((HEMU)hhEmu) != 0)
|
|
{
|
|
assert(FALSE);
|
|
emuDestroyHdl((HEMU)hhEmu);
|
|
hhEmu = NULL;
|
|
return 0;
|
|
}
|
|
|
|
return (HEMU)hhEmu;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuDestroyHdl
|
|
*
|
|
* DESCRIPTION:
|
|
* Death and destruction of the once noble emulator handle.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - external emulator handle.
|
|
*
|
|
* RETURNS:
|
|
* 0=OK, else error
|
|
*
|
|
*/
|
|
int emuDestroyHdl(const HEMU hEmu)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(0);
|
|
return -1;
|
|
}
|
|
|
|
if (hhEmu->pstNameTable)
|
|
{
|
|
free(hhEmu->pstNameTable);
|
|
hhEmu->pstNameTable = NULL;
|
|
}
|
|
|
|
if (hhEmu->emu_deinstall)
|
|
{
|
|
(*hhEmu->emu_deinstall)(hhEmu);
|
|
}
|
|
|
|
printDestroyHdl(hhEmu->hPrintEcho);
|
|
hhEmu->hPrintEcho = NULL;
|
|
printDestroyHdl(hhEmu->hPrintHost);
|
|
hhEmu->hPrintHost = NULL;
|
|
emuDestroyTextAttrBufs(hEmu);
|
|
DeleteCriticalSection(&hhEmu->csEmu);
|
|
|
|
if(hhEmu)
|
|
free(hhEmu);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuInitializeHdl
|
|
*
|
|
* DESCRIPTION:
|
|
* This function initializes the stUserSettings structure of the internal
|
|
* emulator handle with the values stored in the session file.
|
|
*
|
|
* ARGUMENTS:
|
|
* HEMU - The External Emulator Handle.
|
|
*
|
|
* RETURNS:
|
|
* 0 if successful, otherwise -1
|
|
*
|
|
*/
|
|
int emuInitializeHdl(const HEMU hEmu)
|
|
{
|
|
int nRet, nReturn;
|
|
struct stEmuBaseSFSettings stBaseSFSettings;
|
|
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
nReturn = -1;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(FALSE);
|
|
return nReturn;
|
|
}
|
|
|
|
emuLock(hEmu);
|
|
|
|
hhEmu->emu_maxcol = EMU_DEFAULT_MAXCOL;
|
|
hhEmu->emu_maxrow = EMU_DEFAULT_MAXROW;
|
|
hhEmu->bottom_margin = EMU_DEFAULT_MAXROW;
|
|
|
|
hhEmu->mode_vt220 = FALSE;
|
|
hhEmu->mode_vt320 = FALSE;
|
|
|
|
// Added for the VT220/320 rde 16 Feb 1998
|
|
hhEmu->fUse8BitCodes = FALSE;
|
|
hhEmu->fAllowUserKeys = FALSE;
|
|
|
|
#if defined(INCL_PRINT_PASSTHROUGH)
|
|
// Added for VT100/220/320 mpt: 5-19-00
|
|
// hhEmu->fPrintRaw = FALSE;
|
|
#endif // INCL_PRINT_PASSTHROUGH
|
|
|
|
hhEmu->attrState[0].txtclr =
|
|
hhEmu->attrState[1].txtclr = VC_WHITE;
|
|
|
|
hhEmu->attrState[0].bkclr =
|
|
hhEmu->attrState[1].bkclr = VC_BLACK;
|
|
|
|
hhEmu->iCurAttrState = CS_STATE;
|
|
|
|
std_setcolors(hhEmu, GetNearestColorIndex(GetSysColor(COLOR_WINDOWTEXT)),
|
|
GetNearestColorIndex(GetSysColor(COLOR_WINDOW)));
|
|
|
|
// Initialize the user setting default values.
|
|
//
|
|
memset(&stBaseSFSettings, 0, sizeof(stBaseSFSettings));
|
|
|
|
stBaseSFSettings.nTermKeys = EMU_KEYS_TERM;
|
|
stBaseSFSettings.nCursorType = EMU_CURSOR_LINE;
|
|
stBaseSFSettings.fCursorBlink = TRUE;
|
|
stBaseSFSettings.nCharacterSet = EMU_CHARSET_ASCII;
|
|
stBaseSFSettings.fMapPFkeys = FALSE;
|
|
stBaseSFSettings.fAltKeypadMode = FALSE;
|
|
stBaseSFSettings.fKeypadAppMode = FALSE;
|
|
stBaseSFSettings.fCursorKeypadMode = FALSE;
|
|
stBaseSFSettings.fReverseDelBk = FALSE;
|
|
stBaseSFSettings.f132Columns = FALSE;
|
|
stBaseSFSettings.fWrapLines = TRUE;
|
|
stBaseSFSettings.fDestructiveBk = TRUE;
|
|
stBaseSFSettings.fLbSymbolOnEnter = FALSE;
|
|
stBaseSFSettings.fUse8BitCodes = FALSE;
|
|
stBaseSFSettings.fAllowUserKeys = FALSE;
|
|
stBaseSFSettings.nEmuId = EMU_AUTO;
|
|
#if defined(INCL_ULTC_VERSION)
|
|
stBaseSFSettings.nEmuId = EMU_VT220;
|
|
stBaseSFSettings.nCharacterSet = EMU_CHARSET_MULTINATIONAL;
|
|
#endif
|
|
stBaseSFSettings.nAutoAttempts = 0;
|
|
#ifdef INCL_USER_DEFINED_BACKSPACE_AND_TELNET_TERMINAL_ID
|
|
// Initialize new user settings. - cab:11/14/96
|
|
//
|
|
stBaseSFSettings.nBackspaceKeys = EMU_BKSPKEYS_CTRLH;
|
|
|
|
// Zero the telnet id string. I am doing this because if there
|
|
// isn't one in the session file, I want to load the default.
|
|
//
|
|
stBaseSFSettings.acTelnetId[0] = TEXT('\0');
|
|
|
|
emuQueryDefaultTelnetId(stBaseSFSettings.nEmuId,
|
|
stBaseSFSettings.acTelnetId, EMU_MAX_TELNETID);
|
|
#endif
|
|
|
|
// Load the settings if they exist.
|
|
if ((nRet = emuLoadSettings(hhEmu,
|
|
SFID_EMU_SETTINGS,
|
|
sizeof(stBaseSFSettings),
|
|
&stBaseSFSettings)) == -1)
|
|
{
|
|
nReturn = -1;
|
|
goto InitExit;
|
|
}
|
|
|
|
if (nRet > 0)
|
|
{
|
|
// The data was present.
|
|
// Check to see if there is a telnet id. If not, use the default.
|
|
//
|
|
emuCheckSettings(&stBaseSFSettings);
|
|
|
|
#ifdef INCL_USER_DEFINED_BACKSPACE_AND_TELNET_TERMINAL_ID
|
|
if ( stBaseSFSettings.acTelnetId[0] == TEXT('\0') )
|
|
{
|
|
emuQueryDefaultTelnetId(stBaseSFSettings.nEmuId,
|
|
stBaseSFSettings.acTelnetId, EMU_MAX_TELNETID);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
// Initialize the emu's user settings structure from the data stored
|
|
// in the session file.
|
|
hhEmu->stUserSettings.nEmuId = stBaseSFSettings.nEmuId;
|
|
hhEmu->stUserSettings.nTermKeys = stBaseSFSettings.nTermKeys;
|
|
hhEmu->stUserSettings.nCursorType = stBaseSFSettings.nCursorType;
|
|
hhEmu->stUserSettings.nCharacterSet = stBaseSFSettings.nCharacterSet;
|
|
hhEmu->stUserSettings.nAutoAttempts = stBaseSFSettings.nAutoAttempts;
|
|
hhEmu->stUserSettings.fCursorBlink = stBaseSFSettings.fCursorBlink;
|
|
hhEmu->stUserSettings.fMapPFkeys = stBaseSFSettings.fMapPFkeys;
|
|
hhEmu->stUserSettings.fAltKeypadMode = stBaseSFSettings.fAltKeypadMode;
|
|
hhEmu->stUserSettings.fKeypadAppMode = stBaseSFSettings.fKeypadAppMode;
|
|
hhEmu->stUserSettings.fCursorKeypadMode = stBaseSFSettings.fCursorKeypadMode;
|
|
hhEmu->stUserSettings.fReverseDelBk = stBaseSFSettings.fReverseDelBk;
|
|
hhEmu->stUserSettings.f132Columns = stBaseSFSettings.f132Columns;
|
|
#if defined(INCL_PRINT_PASSTHROUGH)
|
|
//hhEmu->stUserSettings.fPrintRaw = stBaseSFSettings.fPrintRaw;
|
|
#endif // INCL_PRINT_PASSTHROUGH
|
|
hhEmu->stUserSettings.fDestructiveBk = stBaseSFSettings.fDestructiveBk;
|
|
hhEmu->stUserSettings.fWrapLines = stBaseSFSettings.fWrapLines;
|
|
hhEmu->stUserSettings.fLbSymbolOnEnter = stBaseSFSettings.fLbSymbolOnEnter;
|
|
hhEmu->stUserSettings.fUse8BitCodes = stBaseSFSettings.fUse8BitCodes;
|
|
hhEmu->stUserSettings.fAllowUserKeys = stBaseSFSettings.fAllowUserKeys;
|
|
hhEmu->stUserSettings.nBackspaceKeys = stBaseSFSettings.nBackspaceKeys;
|
|
|
|
StrCharCopyN(hhEmu->stUserSettings.acTelnetId, stBaseSFSettings.acTelnetId, EMU_MAX_TELNETID);
|
|
|
|
#ifdef INCL_TERMINAL_SIZE_AND_COLORS
|
|
// Set up the default colors in case the user settings don't exist.
|
|
#if TRUE
|
|
hhEmu->stUserSettings.nTextColor =
|
|
GetNearestColorIndex(GetSysColor(COLOR_WINDOWTEXT));
|
|
hhEmu->stUserSettings.nBackgroundColor =
|
|
GetNearestColorIndex(GetSysColor(COLOR_WINDOW));
|
|
#else
|
|
// We've decided not to do this. rde 14 Jul 98
|
|
// Use white (non-bold) on black. rde 8 Jul 98
|
|
hhEmu->stUserSettings.nBackgroundColor = VC_BLACK;
|
|
hhEmu->stUserSettings.nTextColor = VC_WHITE;
|
|
#endif
|
|
|
|
// Load the settings if they exist.
|
|
if ((nRet = emuLoadSettings(hhEmu,
|
|
SFID_EMU_TEXTCOLOR_SETTING,
|
|
sizeof(hhEmu->stUserSettings.nTextColor),
|
|
&hhEmu->stUserSettings.nTextColor)) == -1)
|
|
{
|
|
nReturn = -1;
|
|
goto InitExit;
|
|
}
|
|
|
|
if (nRet > 0)
|
|
{
|
|
// The data was present, so use it.
|
|
std_setcolors(hhEmu,
|
|
hhEmu->stUserSettings.nTextColor,
|
|
hhEmu->stUserSettings.nBackgroundColor);
|
|
}
|
|
|
|
if ((nRet = emuLoadSettings(hhEmu,
|
|
SFID_EMU_BKGRNDCOLOR_SETTING,
|
|
sizeof(hhEmu->stUserSettings.nBackgroundColor),
|
|
&hhEmu->stUserSettings.nBackgroundColor)) == -1)
|
|
{
|
|
nReturn = -1;
|
|
goto InitExit;
|
|
}
|
|
|
|
if (nRet > 0)
|
|
{
|
|
// The data was present, so use it.
|
|
std_setcolors(hhEmu,
|
|
hhEmu->stUserSettings.nTextColor,
|
|
hhEmu->stUserSettings.nBackgroundColor);
|
|
}
|
|
|
|
// Set up the default screen size in case the user settings don't exist.
|
|
hhEmu->stUserSettings.nUserDefRows = EMU_DEFAULT_ROWS;
|
|
hhEmu->stUserSettings.nUserDefCols =
|
|
hhEmu->stUserSettings.f132Columns ? MAX_EMUCOLS : EMU_DEFAULT_COLS;
|
|
|
|
#if defined(INCL_PRINT_PASSTHROUGH)
|
|
// default host-controlled print mode with regard to windows drivers
|
|
hhEmu->stUserSettings.fPrintRaw = FALSE;
|
|
#endif // INCL_PRINT_PASSTHROUGH
|
|
|
|
// Load the settings if they exist.
|
|
if ((nRet = emuLoadSettings(hhEmu,
|
|
SFID_EMU_SCRNROWS_SETTING,
|
|
sizeof(hhEmu->stUserSettings.nUserDefRows),
|
|
&hhEmu->stUserSettings.nUserDefRows)) == -1)
|
|
{
|
|
nReturn = -1;
|
|
goto InitExit;
|
|
}
|
|
|
|
if ((nRet = emuLoadSettings(hhEmu,
|
|
SFID_EMU_SCRNCOLS_SETTING,
|
|
sizeof(hhEmu->stUserSettings.nUserDefCols),
|
|
&hhEmu->stUserSettings.nUserDefCols)) == -1)
|
|
{
|
|
nReturn = -1;
|
|
goto InitExit;
|
|
}
|
|
|
|
#if defined(INCL_PRINT_PASSTHROUGH)
|
|
if ((nRet = emuLoadSettings(hhEmu,
|
|
SFID_EMU_PRINT_RAW,
|
|
sizeof(hhEmu->stUserSettings.fPrintRaw),
|
|
&hhEmu->stUserSettings.fPrintRaw)) == -1)
|
|
{
|
|
nReturn = -1;
|
|
goto InitExit;
|
|
}
|
|
#endif // INCL_PRINT_PASSTHROUGH
|
|
|
|
if (nRet > 0)
|
|
{
|
|
// The data was present, so use it.
|
|
hhEmu->stUserSettings.f132Columns =
|
|
(hhEmu->stUserSettings.nUserDefCols == 132) ? TRUE : FALSE;
|
|
|
|
#if FALSE // TODO:rde Is this needed?
|
|
hhEmu->emu_setscrsize = std_setscrsize;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
// Load the emulator.
|
|
//
|
|
nReturn = emuLoad((HEMU)hhEmu, hhEmu->stUserSettings.nEmuId);
|
|
|
|
//JMH 01-09-97 emuSetSettings() was being called before emuLoad(), but
|
|
// emuLoad() initialized some values that got set by emuSetSettings().
|
|
// (e.g. 132-column mode).
|
|
//
|
|
// Tell the emulator about the user's settings.
|
|
//
|
|
emuSetSettings((HEMU)hhEmu, &hhEmu->stUserSettings);
|
|
|
|
// Clear the emulator image.
|
|
//
|
|
//*for (nRow = 0 ; nRow < MAX_EMUROWS ; ++nRow)
|
|
//* clear_imgrow(hhEmu, nRow);
|
|
|
|
//* This breaks the MINITEL bad - mrw
|
|
//*(hhEmu->emu_setcurpos)(hhEmu, 0, 0);
|
|
|
|
InitExit:
|
|
|
|
emuUnlock(hEmu);
|
|
|
|
NotifyClient(hhEmu->hSession, EVENT_EMU_SETTINGS, 0);
|
|
NotifyClient(hhEmu->hSession, EVENT_TERM_UPDATE, 0);
|
|
|
|
if (nReturn < 0)
|
|
nRet = 0;
|
|
|
|
return nReturn;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuSaveHdl
|
|
*
|
|
* DESCRIPTION:
|
|
* This function stores the emulator user settings in the session file.
|
|
*
|
|
*
|
|
* ARGUMENTS:
|
|
* HEMU - The External Emulator Handle.
|
|
*
|
|
* RETURNS:
|
|
* 0=OK, else error
|
|
*
|
|
*/
|
|
int emuSaveHdl(const HEMU hEmu)
|
|
{
|
|
struct stEmuBaseSFSettings stBaseSFSettings;
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(FALSE);
|
|
return -1;
|
|
}
|
|
|
|
// Initialize the base structure that gets saved in the session file.
|
|
stBaseSFSettings.nEmuId = hhEmu->stUserSettings.nEmuId;
|
|
stBaseSFSettings.nTermKeys = hhEmu->stUserSettings.nTermKeys;
|
|
stBaseSFSettings.nCursorType = hhEmu->stUserSettings.nCursorType;
|
|
stBaseSFSettings.nCharacterSet = hhEmu->stUserSettings.nCharacterSet;
|
|
stBaseSFSettings.nAutoAttempts = hhEmu->stUserSettings.nAutoAttempts;
|
|
stBaseSFSettings.fCursorBlink = hhEmu->stUserSettings.fCursorBlink;
|
|
stBaseSFSettings.fMapPFkeys = hhEmu->stUserSettings.fMapPFkeys;
|
|
stBaseSFSettings.fAltKeypadMode = hhEmu->stUserSettings.fAltKeypadMode;
|
|
stBaseSFSettings.fKeypadAppMode = hhEmu->stUserSettings.fKeypadAppMode;
|
|
stBaseSFSettings.fCursorKeypadMode = hhEmu->stUserSettings.fCursorKeypadMode;
|
|
stBaseSFSettings.fReverseDelBk = hhEmu->stUserSettings.fReverseDelBk;
|
|
stBaseSFSettings.f132Columns = hhEmu->stUserSettings.f132Columns;
|
|
stBaseSFSettings.fDestructiveBk = hhEmu->stUserSettings.fDestructiveBk;
|
|
stBaseSFSettings.fWrapLines = hhEmu->stUserSettings.fWrapLines;
|
|
stBaseSFSettings.fLbSymbolOnEnter = hhEmu->stUserSettings.fLbSymbolOnEnter;
|
|
stBaseSFSettings.fUse8BitCodes = hhEmu->stUserSettings.fUse8BitCodes;
|
|
stBaseSFSettings.fAllowUserKeys = hhEmu->stUserSettings.fAllowUserKeys;
|
|
stBaseSFSettings.nBackspaceKeys = hhEmu->stUserSettings.nBackspaceKeys;
|
|
|
|
StrCharCopyN(stBaseSFSettings.acTelnetId, hhEmu->stUserSettings.acTelnetId, EMU_MAX_TELNETID);
|
|
|
|
emuLock(hEmu);
|
|
|
|
sfPutSessionItem(sessQuerySysFileHdl(hhEmu->hSession),
|
|
SFID_EMU_SETTINGS,
|
|
sizeof(stBaseSFSettings),
|
|
&stBaseSFSettings);
|
|
|
|
#ifdef INCL_TERMINAL_SIZE_AND_COLORS
|
|
sfPutSessionItem(sessQuerySysFileHdl(hhEmu->hSession),
|
|
SFID_EMU_TEXTCOLOR_SETTING,
|
|
sizeof(hhEmu->stUserSettings.nTextColor),
|
|
&hhEmu->stUserSettings.nTextColor);
|
|
|
|
sfPutSessionItem(sessQuerySysFileHdl(hhEmu->hSession),
|
|
SFID_EMU_BKGRNDCOLOR_SETTING,
|
|
sizeof(hhEmu->stUserSettings.nBackgroundColor),
|
|
&hhEmu->stUserSettings.nBackgroundColor);
|
|
|
|
sfPutSessionItem(sessQuerySysFileHdl(hhEmu->hSession),
|
|
SFID_EMU_SCRNROWS_SETTING,
|
|
sizeof(hhEmu->stUserSettings.nUserDefRows),
|
|
&hhEmu->stUserSettings.nUserDefRows);
|
|
|
|
sfPutSessionItem(sessQuerySysFileHdl(hhEmu->hSession),
|
|
SFID_EMU_SCRNCOLS_SETTING,
|
|
sizeof(hhEmu->stUserSettings.nUserDefCols),
|
|
&hhEmu->stUserSettings.nUserDefCols);
|
|
#endif
|
|
|
|
#if defined(INCL_PRINT_PASSTHROUGH)
|
|
sfPutSessionItem(sessQuerySysFileHdl(hhEmu->hSession),
|
|
SFID_EMU_PRINT_RAW,
|
|
sizeof(hhEmu->stUserSettings.fPrintRaw),
|
|
&hhEmu->stUserSettings.fPrintRaw);
|
|
#endif // INCL_PRINT_PASSTHROUGH
|
|
|
|
emuUnlock(hEmu);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuLock
|
|
*
|
|
* DESCRIPTION:
|
|
* Grabs the emulator's critical section semaphore. Access functions
|
|
* to the emulator should also call this so we can call emulator
|
|
* functions from anywhere.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - external emulator handle.
|
|
*
|
|
* RETURNS:
|
|
* void
|
|
*
|
|
*/
|
|
void emuLock(const HEMU hEmu)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
EnterCriticalSection(&hhEmu->csEmu);
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuUnlock
|
|
*
|
|
* DESCRIPTION:
|
|
* Releases the emulator's critical section semaphore.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - external emulator handle.
|
|
*
|
|
* RETURNS:
|
|
* void
|
|
*
|
|
*/
|
|
void emuUnlock(const HEMU hEmu)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
LeaveCriticalSection(&hhEmu->csEmu);
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuGetTxtBuf
|
|
*
|
|
* DESCRIPTION:
|
|
* Obviously we don't need the handle here but when we do go reentrant,
|
|
* we only change the guts of this function. Also, I don't call
|
|
* emuLock(), emuUnlock() since only termGetUpdate() calls these functions
|
|
* and at that point the emulator is already locked down.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - external emulator handle
|
|
*
|
|
* RETURNS:
|
|
* pointer to text buf array
|
|
*
|
|
*/
|
|
ECHAR **emuGetTxtBuf(const HEMU hEmu)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hEmu == 0)
|
|
{
|
|
assert(0);
|
|
return 0;
|
|
}
|
|
|
|
return hhEmu->emu_apText;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuGetAttrBuf
|
|
*
|
|
* DESCRIPTION:
|
|
* Obviously we don't need the handle here but when we do go reentrant,
|
|
* we only change the guts of this function. Also, I don't call
|
|
* emuLock(), emuUnlock() since only termGetUpdate() calls these functions
|
|
* and at that point the emulator is already locked down.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - external emulator handle
|
|
*
|
|
* RETURNS:
|
|
* pointer to attribute buf array
|
|
*
|
|
*/
|
|
PSTATTR *emuGetAttrBuf(const HEMU hEmu)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hEmu == 0)
|
|
{
|
|
assert(0);
|
|
return 0;
|
|
}
|
|
|
|
return hhEmu->emu_apAttr;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuKbdIn
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
*
|
|
* RETURNS:
|
|
* 0=termkey, -1=not termkey, -2=error
|
|
*
|
|
*/
|
|
int emuKbdIn(const HEMU hEmu, KEY_T key, const int fTest)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
int iRet;
|
|
|
|
if (hEmu == 0)
|
|
{
|
|
assert(0);
|
|
return -2;
|
|
}
|
|
|
|
emuLock(hEmu);
|
|
iRet = (*hhEmu->emu_kbdin)(hhEmu, (int)key, fTest);
|
|
emuUnlock(hEmu);
|
|
return iRet;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuIsEmuKey
|
|
*
|
|
* DESCRIPTION:
|
|
* Checks to see if the the given key maps to any defined terminal keys.
|
|
*
|
|
* ARGUMENTS:
|
|
* HEMU hEmu - External emulator handle.
|
|
* int key - Key to test.
|
|
*
|
|
* RETURNS:
|
|
* TRUE=termkey, FALSE=not termkey
|
|
*
|
|
*/
|
|
int emuIsEmuKey(const HEMU hEmu, KEY_T key)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
int iRet;
|
|
|
|
if (hEmu == 0)
|
|
{
|
|
assert(0);
|
|
return FALSE;
|
|
}
|
|
|
|
if (cnctQueryStatus(sessQueryCnctHdl(hhEmu->hSession)) !=
|
|
CNCT_STATUS_TRUE || IsSessionSuspended(hhEmu->hSession) ||
|
|
hhEmu->stUserSettings.nTermKeys == EMU_KEYS_ACCEL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
emuLock(hEmu);
|
|
iRet = (*hhEmu->emu_kbdin)(hhEmu, (int)key, TRUE);
|
|
emuUnlock(hEmu);
|
|
return (iRet == -1) ? FALSE : TRUE;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* emuComDone
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* RETURNS:
|
|
* 0=OK, else error
|
|
*
|
|
*/
|
|
int emuComDone(const HEMU hEmu)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hEmu == 0)
|
|
{
|
|
assert(0);
|
|
return -1;
|
|
}
|
|
|
|
NotifyClient(hhEmu->hSession, EVENT_TERM_UPDATE, 0L);
|
|
return 0;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuQueryCurPos
|
|
*
|
|
* DESCRIPTION: Returns the row and column position of the current
|
|
* cursor position.
|
|
*
|
|
* ARGUMENTS: hEmu - The External emulator handle.
|
|
* *row - A pointer to an integer.
|
|
* *col - A pointer to an integer.
|
|
*
|
|
* RETURNS:
|
|
* 0=OK, else error
|
|
*
|
|
*/
|
|
int emuQueryCurPos(const HEMU hEmu, int *row, int *col)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hEmu == 0)
|
|
{
|
|
assert(0);
|
|
return -1;
|
|
}
|
|
|
|
emuLock(hEmu);
|
|
*row = hhEmu->emu_currow;
|
|
*col = hhEmu->emu_curcol;
|
|
emuUnlock(hEmu);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuQueryCursorType
|
|
*
|
|
* DESCRIPTION:
|
|
* Returns the current cursor type.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - public emulator handle.
|
|
*
|
|
* RETURNS:
|
|
* The cursor type.
|
|
*
|
|
*/
|
|
int emuQueryCursorType(const HEMU hEmu)
|
|
{
|
|
int iCurType;
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hEmu == 0)
|
|
{
|
|
assert(0);
|
|
return -1;
|
|
}
|
|
|
|
emuLock(hEmu);
|
|
iCurType = hhEmu->iCurType;
|
|
emuUnlock(hEmu);
|
|
|
|
return iCurType;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuTrackingNotify
|
|
*
|
|
* DESCRIPTION:
|
|
* Cloop calls this function when it detects a pause in the data flow.
|
|
* This allows the client side to track to the cursor position if that
|
|
* option is enabled.
|
|
*
|
|
* ARGUMENTS:
|
|
* HEMU hEmu - External emulator handle.
|
|
*
|
|
* RETURNS:
|
|
* 0
|
|
*
|
|
*/
|
|
int emuTrackingNotify(const HEMU hEmu)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(FALSE);
|
|
return 0;
|
|
}
|
|
|
|
NotifyClient(hhEmu->hSession, EVENT_TERM_TRACK, 0);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuQueryClearAttr
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* RETURNS:
|
|
* 0=OK, else error
|
|
*
|
|
*/
|
|
int emuQueryClearAttr(const HEMU hEmu, PSTATTR pstClearAttr)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(0);
|
|
return -1;
|
|
}
|
|
|
|
emuLock(hEmu);
|
|
*pstClearAttr = hhEmu->emu_clearattr_sav;
|
|
emuUnlock(hEmu);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuQueryRowsCols
|
|
*
|
|
* DESCRIPTION:
|
|
* Returns the current number of rows and columns set in the emulator.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - public emulator handle
|
|
* piRows - pointer to row variable
|
|
* piCols - pointer to col variable
|
|
*
|
|
* RETURNS:
|
|
* 0=OK, else error
|
|
*
|
|
*/
|
|
int emuQueryRowsCols(const HEMU hEmu, int *piRows, int *piCols)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hEmu == 0)
|
|
{
|
|
assert(0);
|
|
return -1;
|
|
}
|
|
|
|
emuLock(hEmu);
|
|
*piRows = hhEmu->emu_maxrow + 1;
|
|
*piCols = hhEmu->emu_maxcol + 1;
|
|
|
|
emuUnlock(hEmu);
|
|
return 0;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuQueryPrintEchoHdl
|
|
*
|
|
* DESCRIPTION: This routine returns the Print handle used for
|
|
* Printer Echo for the given emulator handle.
|
|
*
|
|
* ARGUMENTS: hEmu - The external emulator handle.
|
|
*
|
|
* RETURNS: HPRINT - The External print handle for Printer Echo.
|
|
*
|
|
*/
|
|
HPRINT emuQueryPrintEchoHdl(const HEMU hEmu)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
HPRINT hPrint;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(FALSE);
|
|
return 0;
|
|
}
|
|
|
|
emuLock(hEmu);
|
|
hPrint = hhEmu->hPrintEcho;
|
|
emuUnlock(hEmu);
|
|
|
|
return hPrint;
|
|
}
|
|
|
|
#if 0
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuQueryEmuName
|
|
*
|
|
* DESCRIPTION:
|
|
* Returns the name of the emulator.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - The External Emulator Handle.
|
|
* *acBuffer - The address of a buffer to receive the information.
|
|
* nSize - The size of the buffer.
|
|
*
|
|
* RETURNS:
|
|
* 0=OK else error
|
|
*
|
|
*/
|
|
int emuQueryName(const HEMU hEmu, TCHAR *achBuffer, int nSize)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
BYTE *pv;
|
|
BYTE *temp;
|
|
DWORD nLen;
|
|
int indx;
|
|
int nEmuCount;
|
|
int nEmuId;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
*achBuffer = 0;
|
|
assert(FALSE);
|
|
return -1 ;
|
|
}
|
|
|
|
emuLock(hEmu);
|
|
nEmuId = hhEmu->stUserSettings.nEmuId;
|
|
emuUnlock(hEmu);
|
|
|
|
if (resLoadDataBlock(glblQueryDllHinst(),
|
|
IDT_EMU_NAMES,
|
|
(LPVOID *)&pv, &nLen))
|
|
{
|
|
assert(FALSE);
|
|
return -2;
|
|
}
|
|
|
|
nEmuCount = *(RCDATA_TYPE *)pv;
|
|
pv += sizeof(RCDATA_TYPE);
|
|
|
|
for (indx = 0 ; indx < nEmuCount ; indx++)
|
|
{
|
|
nLen = (DWORD)StrCharGetByteCount((LPTSTR)pv) + (DWORD)sizeof(BYTE);
|
|
|
|
if (nLen == 0)
|
|
{
|
|
assert(FALSE);
|
|
return -3;
|
|
}
|
|
|
|
temp = pv + nLen;
|
|
|
|
if (*(RCDATA_TYPE *)temp == nEmuId)
|
|
{
|
|
if (StrCharGetByteCount(pv) < nSize)
|
|
{
|
|
StrCharCopyN(achBuffer, pv, nSize);
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
*achBuffer = 0;
|
|
return -4;
|
|
}
|
|
}
|
|
|
|
pv += (nLen + (DWORD)sizeof(RCDATA_TYPE));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuQueryEmuName
|
|
*
|
|
* DESCRIPTION:
|
|
* Returns the name of the emulator.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - The External Emulator Handle.
|
|
* *acBuffer - The address of a buffer to receive the information.
|
|
* nSize - The size of the buffer.
|
|
*
|
|
* RETURNS:
|
|
* 0=OK else error
|
|
*
|
|
*/
|
|
int emuQueryName(const HEMU hEmu, TCHAR *achBuffer, int nSize)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
TCHAR achText[256];
|
|
int nEmuId,
|
|
nResourceId,
|
|
nLen;
|
|
|
|
emuLock(hEmu);
|
|
nEmuId = hhEmu->stUserSettings.nEmuId;
|
|
emuUnlock(hEmu);
|
|
|
|
switch(nEmuId)
|
|
{
|
|
case EMU_AUTO:
|
|
nResourceId = IDS_EMUNAME_AUTO;
|
|
break;
|
|
|
|
case EMU_ANSI:
|
|
nResourceId = IDS_EMUNAME_ANSI;
|
|
break;
|
|
|
|
case EMU_ANSIW:
|
|
nResourceId = IDS_EMUNAME_ANSIW;
|
|
break;
|
|
|
|
case EMU_MINI:
|
|
nResourceId = IDS_EMUNAME_MINI;
|
|
break;
|
|
|
|
case EMU_VIEW:
|
|
nResourceId = IDS_EMUNAME_VIEW;
|
|
break;
|
|
|
|
case EMU_TTY:
|
|
nResourceId = IDS_EMUNAME_TTY;
|
|
break;
|
|
|
|
case EMU_VT100:
|
|
nResourceId = IDS_EMUNAME_VT100;
|
|
break;
|
|
|
|
case EMU_VT52:
|
|
nResourceId = IDS_EMUNAME_VT52;
|
|
break;
|
|
|
|
case EMU_VT100J:
|
|
nResourceId = IDS_EMUNAME_VT100J;
|
|
break;
|
|
|
|
#if defined(INCL_VT220)
|
|
case EMU_VT220:
|
|
nResourceId = IDS_EMUNAME_VT220;
|
|
break;
|
|
#endif
|
|
|
|
#if defined(INCL_VT320)
|
|
case EMU_VT320:
|
|
nResourceId = IDS_EMUNAME_VT320;
|
|
break;
|
|
#endif
|
|
|
|
#if defined(INCL_VT100PLUS)
|
|
case EMU_VT100PLUS:
|
|
nResourceId = IDS_EMUNAME_VT100PLUS;
|
|
break;
|
|
#endif
|
|
|
|
#if defined(INCL_VTUTF8)
|
|
case EMU_VTUTF8:
|
|
nResourceId = IDS_EMUNAME_VTUTF8;
|
|
break;
|
|
#endif
|
|
|
|
default:
|
|
assert(FALSE);
|
|
return(-1);
|
|
}
|
|
|
|
nLen = LoadString(glblQueryDllHinst(), (unsigned)nResourceId, achText,
|
|
sizeof(achText) / sizeof(TCHAR));
|
|
|
|
// Has the caller supplied a large enough buffer.
|
|
//
|
|
if (nSize <= nLen)
|
|
return(-1);
|
|
|
|
StrCharCopyN(achBuffer, achText, nSize);
|
|
|
|
return(0);
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuGetIdFromName
|
|
*
|
|
* DESCRIPTION:
|
|
* Returns the Id for the supplied emulator name.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - The External Emulator Handle.
|
|
* *acBuffer - The address of a buffer to receive the information.
|
|
* nSize - The size of the buffer.
|
|
*
|
|
* RETURNS:
|
|
* An emulator ID otherwise (-1) if the function fails.
|
|
*
|
|
*/
|
|
int emuGetIdFromName(const HEMU hEmu, TCHAR *achEmuName)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
int iRet, idx;
|
|
|
|
for(idx = 0; idx < NBR_EMULATORS; idx++)
|
|
{
|
|
iRet = StrCharCmp(achEmuName, hhEmu->pstNameTable[idx].acName);
|
|
|
|
if (iRet == 0)
|
|
{
|
|
return(hhEmu->pstNameTable[idx].nEmuId);
|
|
}
|
|
|
|
}
|
|
|
|
return(-1);
|
|
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuQueryEmulatorId
|
|
*
|
|
* DESCRIPTION:
|
|
* Returns the oridinal value for the current emulator. This can be
|
|
* used through-out the program to write conditional code for emulators.
|
|
*
|
|
* ARGUMENTS:
|
|
* HEMU hEmulator - external emulator handle.
|
|
*
|
|
* RETURNS:
|
|
* ordinal value (>0).
|
|
*
|
|
*/
|
|
int emuQueryEmulatorId(const HEMU hEmulator)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmulator;
|
|
int nEmuId;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(0);
|
|
return -1;
|
|
}
|
|
|
|
emuLock(hEmulator);
|
|
nEmuId = hhEmu->stUserSettings.nEmuId;
|
|
emuUnlock(hEmulator);
|
|
|
|
return (nEmuId);
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
* emuLoad
|
|
*
|
|
* DESCRIPTION:
|
|
* Loads all pertinent tables into memory for the specified emulator.
|
|
*
|
|
* ARGUMENTS: hEmu External Emulator Handle.
|
|
* nEmuId ID that identifies a specific emulator.
|
|
* fForceLoad -
|
|
*
|
|
*
|
|
* RETURNS: 0 if successful. -1 if nEmuId is invalid.
|
|
*
|
|
*/
|
|
int emuLoad(const HEMU hEmu, const int nEmuId)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
int col;
|
|
void (*emuInitFunction)(const HHEMU hhEmu);
|
|
|
|
if (hEmu == 0)
|
|
{
|
|
assert(0);
|
|
return -2;
|
|
}
|
|
|
|
emuLock(hEmu);
|
|
|
|
// If the requested emulator is already loaded, return.
|
|
//
|
|
if (hhEmu->nEmuLoaded == nEmuId)
|
|
{
|
|
emuUnlock(hEmu);
|
|
return 0;
|
|
}
|
|
|
|
// Validate nEmuId and set set initialization function.
|
|
|
|
switch(nEmuId)
|
|
{
|
|
#if defined(INCL_MINITEL)
|
|
case EMU_MINI:
|
|
if (hhEmu->nEmuLoaded == EMU_AUTO && hhEmu->hSession)
|
|
{
|
|
HCOM hCom = sessQueryComHdl(hhEmu->hSession);
|
|
HCLOOP hCLoop = sessQueryCLoopHdl(hhEmu->hSession);
|
|
HCNCT hCnct = sessQueryCnctHdl(hhEmu->hSession);
|
|
|
|
if (hCom && ComValidHandle(hCom))
|
|
{
|
|
int iDataBits = 8;
|
|
int iParity = NOPARITY;
|
|
int iStopBits = ONESTOPBIT;
|
|
ComGetDataBits(hCom, &iDataBits);
|
|
ComGetParity(hCom, &iParity);
|
|
ComGetStopBits(hCom, &iStopBits);
|
|
|
|
//
|
|
// Force the incoming ASCII data to 7 bit.
|
|
//
|
|
CLoopSetASCII7(hCLoop, TRUE);
|
|
|
|
if (iDataBits != 7 || iParity != EVENPARITY || iStopBits != ONESTOPBIT)
|
|
{
|
|
const HHCNCT hhCnct = (HHCNCT)hCnct;
|
|
|
|
ComSetDataBits(hCom, 7);
|
|
ComSetParity(hCom, EVENPARITY);
|
|
ComSetStopBits(hCom, ONESTOPBIT);
|
|
ComSetAutoDetect(hCom, FALSE);
|
|
if (hCnct)
|
|
{
|
|
HHDRIVER hhDriver = (HHDRIVER)hhCnct->hDriver;
|
|
|
|
if (hhDriver && cncttapiSetLineConfig(hhDriver->dwLine, hCom) == -16)
|
|
{
|
|
cnctDisconnect(hCnct, CNCT_DIALNOW | CNCT_XFERABORTCONFIRM);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
emuInitFunction = emuMinitelInit;
|
|
break;
|
|
#endif
|
|
|
|
case EMU_AUTO:
|
|
emuInitFunction = emuAutoInit;
|
|
break;
|
|
|
|
case EMU_ANSIW:
|
|
case EMU_ANSI:
|
|
emuInitFunction = emuAnsiInit;
|
|
break;
|
|
|
|
case EMU_TTY:
|
|
emuInitFunction = emuAnsiInit;
|
|
break;
|
|
|
|
case EMU_VT100J:
|
|
case EMU_VT100:
|
|
emuInitFunction = vt100_init;
|
|
break;
|
|
|
|
case EMU_VT52:
|
|
emuInitFunction = vt52_init;
|
|
break;
|
|
|
|
#if defined(INCL_VT220)
|
|
case EMU_VT220:
|
|
emuInitFunction = vt220_init;
|
|
break;
|
|
#endif
|
|
|
|
#if defined(INCL_VT320)
|
|
case EMU_VT320:
|
|
emuInitFunction = vt220_init; // The VT320 is the same as the VT220.
|
|
break;
|
|
#endif
|
|
|
|
#if defined(INCL_VT100PLUS)
|
|
case EMU_VT100PLUS:
|
|
emuInitFunction = vt100_init; // The VT100+ is the same as the VT100.
|
|
break;
|
|
#endif
|
|
|
|
#if defined(INCL_VTUTF8)
|
|
case EMU_VTUTF8:
|
|
emuInitFunction = vtutf8_init;
|
|
break;
|
|
#endif
|
|
|
|
#if defined(INCL_VIEWDATA)
|
|
case EMU_VIEW:
|
|
emuInitFunction = EmuViewdataInit;
|
|
break;
|
|
#endif
|
|
|
|
default:
|
|
emuUnlock(hEmu);
|
|
return(-1);
|
|
}
|
|
|
|
// Remove the current emulator, if one is loaded.
|
|
//
|
|
if (hhEmu->emu_deinstall)
|
|
(*hhEmu->emu_deinstall)(hhEmu);
|
|
|
|
// Save the new emulator Id.
|
|
//
|
|
hhEmu->stUserSettings.nEmuId = nEmuId;
|
|
hhEmu->nEmuLoaded = nEmuId;
|
|
|
|
// setup function pointers to standard routines.
|
|
|
|
hhEmu->EmuSetCursorType = EmuStdSetCursorType;
|
|
hhEmu->emuResetTerminal = stdResetTerminal;
|
|
hhEmu->emu_graphic = emuStdGraphic;
|
|
#if defined(EXTENDED_FEATURES)
|
|
hhEmu->emu_datain = emuStdDataIn;
|
|
#else
|
|
hhEmu->emu_datain = emuDataIn;
|
|
#endif
|
|
hhEmu->emu_kbdin = std_kbdin;
|
|
hhEmu->emu_getscrsize = std_getscrsize;
|
|
#ifdef INCL_TERMINAL_SIZE_AND_COLORS
|
|
hhEmu->emu_setscrsize = std_setscrsize;
|
|
#endif
|
|
hhEmu->emu_getscrollcnt = std_getscrollcnt;
|
|
hhEmu->emu_getcurpos = std_getcurpos;
|
|
hhEmu->emu_setcurpos = std_setcurpos;
|
|
hhEmu->emu_getattr = std_getattr;
|
|
hhEmu->emu_setattr = std_setattr;
|
|
hhEmu->emu_setcolors = std_setcolors;
|
|
hhEmu->emu_getcolors = std_getcolors;
|
|
hhEmu->emu_initcolors = std_initcolors;
|
|
hhEmu->emu_clearscreen = std_clearscreen;
|
|
hhEmu->emu_clearline = std_clearline;
|
|
hhEmu->emu_clearrgn = std_clearrgn;
|
|
hhEmu->emu_scroll = std_scroll;
|
|
hhEmu->emu_deinstall = std_deinstall;
|
|
hhEmu->emu_ntfy = std_emu_ntfy;
|
|
hhEmu->emuHomeHostCursor= std_HomeHostCursor;
|
|
|
|
hhEmu->emu_maxrow = EMU_DEFAULT_MAXROW;
|
|
hhEmu->emu_maxcol = EMU_DEFAULT_MAXCOL;
|
|
hhEmu->bottom_margin = hhEmu->emu_maxrow; // mrw:2/21/96
|
|
hhEmu->top_margin = 0; // mrw:2/21/96
|
|
|
|
hhEmu->emu_charattr = hhEmu->attrState[CS_STATE];
|
|
|
|
hhEmu->emu_clearattr =
|
|
hhEmu->emu_clearattr_sav = hhEmu->attrState[CSCLEAR_STATE];
|
|
|
|
// Initialize mode variables.
|
|
//
|
|
hhEmu->mode_KAM = RESET; /* Enable Keyboard */
|
|
hhEmu->mode_IRM = RESET; /* Replace chars rather than insert */
|
|
hhEmu->mode_VEM = RESET; /* Inserting lines scrolls down, not up */
|
|
hhEmu->mode_HEM = RESET; /* Inserting chars scrolls right, not left */
|
|
hhEmu->mode_SRM = SET; /* Send-Receive. No local character echo */
|
|
hhEmu->mode_LNM = RESET; /* LF moves vertically only */
|
|
hhEmu->mode_DECOM = RESET; /* Absolute cursor positioning */
|
|
hhEmu->mode_DECPFF = RESET; /* No form feed after screen prINT */
|
|
hhEmu->mode_DECPEX = RESET; /* PrINT only scroll rgn. on screen prINT */
|
|
hhEmu->mode_DECSCNM = RESET; /* Screen mode. RESET=normal vid, SET=reverse vid */
|
|
hhEmu->mode_DECTCEM = SET; /* Cursor enable. RESET=hidden, SET=visible */
|
|
hhEmu->mode_25enab = RESET; /* When true (SET), emulator can use 25th line */
|
|
hhEmu->mode_protect = RESET; /* When true (SET), protected mode is on */
|
|
hhEmu->mode_block = RESET; /* When true (SET), block mode is on */
|
|
hhEmu->mode_local = RESET; /* When true (SET), block mode is on */
|
|
hhEmu->print_echo = FALSE;
|
|
|
|
// Initialize state table.
|
|
//
|
|
hhEmu->emu_highchar = 0x7F;
|
|
|
|
// Set default tab stops to 8.
|
|
//
|
|
//for (col = 0; col <= EMU_DEFAULT_MAXCOL; ++col)
|
|
// Need to define tab stops for the whole screen so received tabs
|
|
// with cursor at column 72 or more will go to the next tab rather
|
|
// than the right edge of the screen. 22 Apr 99 rde
|
|
for (col = 0; col < MAX_EMUCOLS; ++col)
|
|
{
|
|
if (!(col % 8))
|
|
hhEmu->tab_stop[col] = TRUE;
|
|
}
|
|
|
|
// Call initialization function for emulator.
|
|
//
|
|
(*emuInitFunction)(hhEmu);
|
|
|
|
// Paints every cell with the new attributes...
|
|
//
|
|
std_initcolors(hhEmu);
|
|
|
|
#ifdef INCL_TERMINAL_SIZE_AND_COLORS
|
|
// Update the screen size.
|
|
//
|
|
hhEmu->emu_setscrsize(hhEmu);
|
|
#endif
|
|
|
|
// We want the terminal to read the emulator image after loading
|
|
// but we don't want a scroll operation so update each line
|
|
// individually - mrw
|
|
|
|
updateLine(sessQueryUpdateHdl(hhEmu->hSession), 0, hhEmu->emu_maxrow);
|
|
|
|
NotifyClient(hhEmu->hSession, EVENT_EMU_CLRATTR, 0);
|
|
NotifyClient(hhEmu->hSession, EVENT_EMU_SETTINGS, 0);
|
|
NotifyClient(hhEmu->hSession, EVENT_TERM_UPDATE, 0);
|
|
|
|
emuUnlock(hEmu);
|
|
|
|
PostMessage(sessQueryHwndStatusbar(hhEmu->hSession),
|
|
SBR_NTFY_REFRESH, (WPARAM)SBR_EMU_PART_NO, 0);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuQuerySettings
|
|
*
|
|
* DESCRIPTION:
|
|
* This function returns a copy of the of the User Settings structure
|
|
* found in the internal emulator handle.
|
|
*
|
|
* ARGUMENTS:
|
|
* HEMU - The External emulator handle.
|
|
* PSTEMUSET - A pointer to a structure of type STEMUSET
|
|
*
|
|
* RETURNS:
|
|
* 0=OK, else error
|
|
*
|
|
*/
|
|
int emuQuerySettings(const HEMU hEmu, PSTEMUSET pstSettings)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(0);
|
|
return -1;
|
|
}
|
|
|
|
emuLock(hEmu);
|
|
MemCopy(pstSettings, &hhEmu->stUserSettings, sizeof(STEMUSET));
|
|
emuUnlock(hEmu);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuSetSettings
|
|
*
|
|
* DESCRIPTION:
|
|
* This function stores the Emulator Settings in the internal Emualtor
|
|
* handle. This function DOES NOT save the information in the session
|
|
* file. The values to be set are validated. If any values passed
|
|
* into this routine are invalid, default values will be set.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* RETURNS:
|
|
* 0 if the values passed in are validated. A number less than 0 will
|
|
* be returned if any one of the values are invalid. Note that in the
|
|
* case of several invalid settings, the return value will point only
|
|
* to the last one that was invalid.
|
|
*
|
|
*/
|
|
int emuSetSettings(const HEMU hEmu, const PSTEMUSET pstSettings)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
int iReturn;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(0);
|
|
return -1;
|
|
}
|
|
|
|
iReturn = 0;
|
|
|
|
switch(pstSettings->nEmuId)
|
|
{
|
|
case EMU_AUTO:
|
|
case EMU_ANSI:
|
|
case EMU_ANSIW:
|
|
case EMU_MINI:
|
|
case EMU_VIEW:
|
|
case EMU_TTY:
|
|
case EMU_VT100:
|
|
case EMU_VT100J:
|
|
case EMU_VT52:
|
|
case EMU_VT220:
|
|
case EMU_VT320:
|
|
case EMU_VT100PLUS:
|
|
case EMU_VTUTF8:
|
|
break;
|
|
default:
|
|
pstSettings->nEmuId = EMU_AUTO;
|
|
iReturn = -1;
|
|
assert(FALSE);
|
|
break;
|
|
}
|
|
|
|
switch(pstSettings->nTermKeys)
|
|
{
|
|
case EMU_KEYS_ACCEL:
|
|
case EMU_KEYS_TERM:
|
|
case EMU_KEYS_SCAN:
|
|
break;
|
|
default:
|
|
pstSettings->nTermKeys = EMU_KEYS_TERM;
|
|
iReturn = -2;
|
|
assert(FALSE);
|
|
break;
|
|
}
|
|
|
|
switch(pstSettings->nCursorType)
|
|
{
|
|
case EMU_CURSOR_BLOCK:
|
|
case EMU_CURSOR_LINE:
|
|
case EMU_CURSOR_NONE:
|
|
break;
|
|
default:
|
|
pstSettings->nCursorType = EMU_CURSOR_LINE;
|
|
iReturn = -3;
|
|
assert(FALSE);
|
|
break;
|
|
}
|
|
|
|
switch(pstSettings->nCharacterSet)
|
|
{
|
|
case EMU_CHARSET_ASCII:
|
|
case EMU_CHARSET_UK:
|
|
case EMU_CHARSET_SPECIAL:
|
|
#if defined(INCL_VT220)
|
|
case EMU_CHARSET_MULTINATIONAL:
|
|
case EMU_CHARSET_FRENCH:
|
|
case EMU_CHARSET_FRENCHCANADIAN:
|
|
case EMU_CHARSET_GERMAN:
|
|
#endif
|
|
break;
|
|
default:
|
|
pstSettings->nCharacterSet = EMU_CHARSET_ASCII;
|
|
iReturn = -4;
|
|
assert(FALSE);
|
|
break;
|
|
}
|
|
|
|
// The values to be set have been validated. Set the emulator handle
|
|
// values, and the internal emualtor variables that correspond.
|
|
//
|
|
emuLock(hEmu);
|
|
|
|
#ifdef INCL_TERMINAL_SIZE_AND_COLORS
|
|
if (pstSettings->nTextColor != hhEmu->stUserSettings.nTextColor ||
|
|
pstSettings->nBackgroundColor != hhEmu->stUserSettings.nBackgroundColor)
|
|
{
|
|
// The user defined colors have changed--implement them.
|
|
std_setcolors(hhEmu,
|
|
pstSettings->nTextColor,
|
|
pstSettings->nBackgroundColor);
|
|
}
|
|
#endif
|
|
|
|
// When called from emuInitializeHdl, the source and dest pointers
|
|
// for the following call are the same, so there's no need to
|
|
// to do the copy.
|
|
//
|
|
if(&hhEmu->stUserSettings != pstSettings)
|
|
MemCopy(&hhEmu->stUserSettings, pstSettings, sizeof(STEMUSET));
|
|
|
|
hhEmu->iCurType = hhEmu->stUserSettings.nCursorType;
|
|
hhEmu->mode_AWM = hhEmu->stUserSettings.fWrapLines;
|
|
hhEmu->mode_DECKPAM = hhEmu->stUserSettings.fKeypadAppMode;
|
|
hhEmu->mode_DECCKM = hhEmu->stUserSettings.fCursorKeypadMode;
|
|
|
|
hhEmu->fUse8BitCodes = hhEmu->stUserSettings.fUse8BitCodes;
|
|
hhEmu->fAllowUserKeys = hhEmu->stUserSettings.fAllowUserKeys;
|
|
|
|
// Call emuSetDecColumns only if the emulator is a VT100, and
|
|
// there has been change in the user setting of 132 column mode.
|
|
//
|
|
emuSetDecColumns(hhEmu,
|
|
hhEmu->stUserSettings.f132Columns ?
|
|
VT_MAXCOL_132MODE :
|
|
VT_MAXCOL_80MODE,
|
|
FALSE);
|
|
|
|
#ifdef INCL_TERMINAL_SIZE_AND_COLORS
|
|
// Set the possible new row and column values if
|
|
// the emulator is not about to change.
|
|
//
|
|
hhEmu->emu_setscrsize(hhEmu);
|
|
#endif
|
|
|
|
emuUnlock(hEmu);
|
|
|
|
NotifyClient(hhEmu->hSession, EVENT_EMU_SETTINGS, 0);
|
|
//JMH 01-09-97 These two events also need to be sent, says JCM.
|
|
//
|
|
NotifyClient(hhEmu->hSession, EVENT_TERM_UPDATE, 0);
|
|
NotifyClient(hhEmu->hSession, EVENT_EMU_CLRATTR, 0);
|
|
|
|
return(iReturn);
|
|
}
|
|
|
|
#if defined(EXTENDED_FEATURES) //TODO:rde 23 mar 98
|
|
// When we're comfortable enough with changing to using a function
|
|
// pointer here, do it for all builds.
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuDataIn
|
|
*
|
|
* DESCRIPTION:
|
|
* External entry point for incoming data.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - public emulator handle
|
|
* ccode - character code
|
|
*
|
|
* RETURNS:
|
|
* TRUE if displayable
|
|
*
|
|
*/
|
|
int emuDataIn(const HEMU hEmu, const ECHAR ccode)
|
|
{
|
|
int iRetVal = TRUE;
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(FALSE);
|
|
}
|
|
else
|
|
{
|
|
emuLock(hEmu);
|
|
|
|
CaptureChar(sessQueryCaptureFileHdl(hhEmu->hSession),
|
|
CPF_MODE_RAW,
|
|
ccode); //moved from emuStdDataIn 05AUG98 mpt
|
|
emuUnlock(hEmu);
|
|
|
|
iRetVal = (*hhEmu->emu_datain)(hhEmu, ccode);
|
|
}
|
|
|
|
return iRetVal;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
* emuStdDataIn
|
|
*
|
|
* DESCRIPTION:
|
|
* Processes passed in codes through the emulation state tables.
|
|
*
|
|
* ARGUMENTS:
|
|
* hhEmu - The internal emulator handle.
|
|
* ccode - The character to process.
|
|
*
|
|
* RETURNS:
|
|
* TRUE if displayable character
|
|
*/
|
|
int emuStdDataIn(const HHEMU hhEmu, const ECHAR ccode)
|
|
{
|
|
//ECHAR echCode;
|
|
int ntrans;
|
|
struct trans_entry *tptr;
|
|
|
|
emuLock((HEMU)hhEmu);
|
|
|
|
hhEmu->emu_code = ETEXT(ccode);
|
|
|
|
// Capture raw data.
|
|
//
|
|
#if 0 //moved to emuDataIn to prevent characters being captures
|
|
//multiple times due to the re-entrant nature of this function. - mpt 5aug98
|
|
CaptureChar(sessQueryCaptureFileHdl(hhEmu->hSession),
|
|
CPF_MODE_RAW,
|
|
ccode);
|
|
#endif
|
|
// Seek next state by finding character range.
|
|
//
|
|
tptr = hhEmu->state_tbl[hhEmu->state].first_trans;
|
|
ntrans = hhEmu->state_tbl[hhEmu->state].number_trans;
|
|
|
|
for (; ntrans > 0; ntrans--, ++tptr)
|
|
if (ccode >= tptr->lochar && ccode <= tptr->hichar)
|
|
break;
|
|
|
|
if (ntrans <= 0)
|
|
{
|
|
// Added to handle the case of 2 successive ESC chars--just
|
|
// the 1st ESC should be thrown away
|
|
|
|
hhEmu->state = 0;
|
|
tptr = hhEmu->state_tbl[hhEmu->state].first_trans;
|
|
ntrans = hhEmu->state_tbl[hhEmu->state].number_trans;
|
|
|
|
for (; ntrans > 0; ntrans--, ++tptr)
|
|
{
|
|
if (ccode >= tptr->lochar && ccode <= tptr->hichar)
|
|
break;
|
|
}
|
|
|
|
// 6-14-83
|
|
// second condition (below) added to allow emulator to toss invalid
|
|
// escpae sequences (i.e.ESC [ 0v).
|
|
|
|
if (ntrans <= 0 || tptr->next_state == 0)
|
|
{
|
|
commanderror(hhEmu);
|
|
goto DataInExit;
|
|
}
|
|
|
|
else
|
|
{
|
|
CaptureChar(sessQueryCaptureFileHdl(hhEmu->hSession),
|
|
CF_CAP_CHARS, ccode);
|
|
printEchoChar(hhEmu->hPrintEcho, ccode);
|
|
}
|
|
}
|
|
|
|
hhEmu->state = tptr->next_state;
|
|
(*tptr->funct_ptr)(hhEmu);
|
|
|
|
// The code has been process through the emulator. Check for
|
|
// capturing and printing, and reset other emulator values.
|
|
//
|
|
if (hhEmu->state == 0)
|
|
{
|
|
if (IN_RANGE(ccode, ETEXT(' '), hhEmu->emu_highchar) ||
|
|
ccode == ETEXT('\r') ||
|
|
ccode == ETEXT('\n'))
|
|
{
|
|
CaptureChar(sessQueryCaptureFileHdl(hhEmu->hSession),
|
|
CF_CAP_CHARS, ccode);
|
|
printEchoChar(hhEmu->hPrintEcho, ccode);
|
|
}
|
|
hhEmu->num_param_cnt = hhEmu->selector_cnt =
|
|
hhEmu->selector[0] = hhEmu->num_param[0] = 0;
|
|
|
|
hhEmu->DEC_private = FALSE;
|
|
}
|
|
|
|
DataInExit:
|
|
|
|
emuUnlock((HEMU)hhEmu);
|
|
|
|
return(TRUE);
|
|
}
|
|
//#if FALSE
|
|
#else
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
* emuDataIn
|
|
*
|
|
* DESCRIPTION:
|
|
* Processes passed in codes through the emulation state tables.
|
|
*
|
|
* ARGUMENTS:
|
|
* hhEmu - The internal emulator handle.
|
|
* ccode - The character to process.
|
|
*
|
|
* RETURNS:
|
|
* TRUE if displayable character
|
|
*/
|
|
int emuDataIn(const HEMU hEmu, const ECHAR ccode)
|
|
{
|
|
//ECHAR echCode;
|
|
int ntrans;
|
|
struct trans_entry *tptr;
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(FALSE);
|
|
goto DataInExit;
|
|
}
|
|
|
|
emuLock(hEmu);
|
|
|
|
hhEmu->emu_code = ETEXT(ccode);
|
|
|
|
// Capture raw data.
|
|
//
|
|
CaptureChar(sessQueryCaptureFileHdl(hhEmu->hSession),
|
|
CPF_MODE_RAW,
|
|
ccode);
|
|
|
|
// Seek next state by finding character range.
|
|
//
|
|
tptr = hhEmu->state_tbl[hhEmu->state].first_trans;
|
|
ntrans = hhEmu->state_tbl[hhEmu->state].number_trans;
|
|
|
|
for (; ntrans > 0; ntrans--, ++tptr)
|
|
if (ccode >= tptr->lochar && ccode <= tptr->hichar)
|
|
break;
|
|
|
|
if (ntrans <= 0)
|
|
{
|
|
// Added to handle the case of 2 successive ESC chars--just
|
|
// the 1st ESC should be thrown away
|
|
|
|
hhEmu->state = 0;
|
|
tptr = hhEmu->state_tbl[hhEmu->state].first_trans;
|
|
ntrans = hhEmu->state_tbl[hhEmu->state].number_trans;
|
|
|
|
for (; ntrans > 0; ntrans--, ++tptr)
|
|
{
|
|
if (ccode >= tptr->lochar && ccode <= tptr->hichar)
|
|
break;
|
|
}
|
|
|
|
// 6-14-83
|
|
// second condition (below) added to allow emulator to toss invalid
|
|
// escpae sequences (i.e.ESC [ 0v).
|
|
|
|
if (ntrans <= 0 || tptr->next_state == 0)
|
|
{
|
|
commanderror(hhEmu);
|
|
goto DataInExit;
|
|
}
|
|
|
|
else
|
|
{
|
|
CaptureChar(sessQueryCaptureFileHdl(hhEmu->hSession),
|
|
CF_CAP_CHARS, ccode);
|
|
printEchoChar(hhEmu->hPrintEcho, ccode);
|
|
}
|
|
}
|
|
|
|
hhEmu->state = tptr->next_state;
|
|
(*tptr->funct_ptr)(hhEmu);
|
|
|
|
// The code has been process through the emulator. Check for
|
|
// capturing and printing, and reset other emulator values.
|
|
//
|
|
if (hhEmu->state == 0)
|
|
{
|
|
if (IN_RANGE(ccode, ETEXT(' '), hhEmu->emu_highchar) ||
|
|
ccode == ETEXT('\r') ||
|
|
ccode == ETEXT('\n'))
|
|
{
|
|
CaptureChar(sessQueryCaptureFileHdl(hhEmu->hSession),
|
|
CF_CAP_CHARS, ccode);
|
|
printEchoChar(hhEmu->hPrintEcho, ccode);
|
|
}
|
|
hhEmu->num_param_cnt = hhEmu->selector_cnt =
|
|
hhEmu->selector[0] = hhEmu->num_param[0] = 0;
|
|
|
|
hhEmu->DEC_private = FALSE;
|
|
}
|
|
|
|
DataInExit:
|
|
|
|
emuUnlock(hEmu);
|
|
|
|
return(TRUE);
|
|
}
|
|
#endif
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuNotify
|
|
*
|
|
* DESCRIPTION:
|
|
* A function that can be called to notify the emulators of an event.
|
|
* As events are identified, they can be added to this function.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - The external emulator handle.
|
|
* nEvent - The event ID.
|
|
*
|
|
* RETURNS:
|
|
* 0=OK, else error
|
|
*
|
|
*/
|
|
int emuNotify(const HEMU hEmu, const int nEvent)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(FALSE);
|
|
return -1;
|
|
}
|
|
|
|
emuLock(hEmu);
|
|
|
|
switch(nEvent)
|
|
{
|
|
case EMU_EVENT_CONNECTED:
|
|
hhEmu->fWasConnected = TRUE;
|
|
break;
|
|
|
|
case EMU_EVENT_DISCONNECTED:
|
|
if (hhEmu->stUserSettings.nEmuId == EMU_AUTO)
|
|
{
|
|
if (hhEmu->fWasConnected)
|
|
hhEmu->stUserSettings.nAutoAttempts++;
|
|
|
|
if (hhEmu->stUserSettings.nAutoAttempts ==
|
|
EMU_MAX_AUTODETECT_ATTEMPTS)
|
|
#if !defined(FAR_EAST)
|
|
emuAutoDetectLoad(hhEmu, EMU_ANSI);
|
|
#else
|
|
emuAutoDetectLoad(hhEmu, EMU_ANSIW);
|
|
#endif
|
|
}
|
|
|
|
hhEmu->fWasConnected = FALSE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
(*hhEmu->emu_ntfy)(hhEmu, nEvent);
|
|
emuUnlock(hEmu);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuHomeHostCursor
|
|
*
|
|
* DESCRIPTION:
|
|
* Homes the cursor. Needed when we first load a session. Incidently,
|
|
* homing the cursor for a minitel places the cursor at 1,0, not 0,0
|
|
* which is why this function exists.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - public emulator handle.
|
|
*
|
|
* RETURNS:
|
|
* 0=OK,else error
|
|
*
|
|
*/
|
|
int emuHomeHostCursor(const HEMU hEmu)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(0);
|
|
return -1;
|
|
}
|
|
|
|
return (*hhEmu->emuHomeHostCursor)(hhEmu);
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuEraseTerminalScreen
|
|
*
|
|
* DESCRIPTION:
|
|
* Erases emulator image, doesn't put stuff in the backscroll.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - public emulator handle.
|
|
*
|
|
* RETURNS:
|
|
* 0=OK,else error
|
|
*
|
|
*/
|
|
int emuEraseTerminalScreen(const HEMU hEmu)
|
|
{
|
|
const HHEMU hhEmu = (HHEMU)hEmu;
|
|
int i;
|
|
|
|
if (hhEmu == 0)
|
|
{
|
|
assert(0);
|
|
return -1;
|
|
}
|
|
|
|
for (i = 0 ; i <= hhEmu->emu_maxrow ; ++i)
|
|
clear_imgrow(hhEmu, i);
|
|
|
|
updateLine(sessQueryUpdateHdl(hhEmu->hSession), 0, hhEmu->emu_maxrow);
|
|
|
|
// The notify function is used to in minitel to set the state
|
|
// of the screen based on connection status (F or C in upper corner).
|
|
//
|
|
hhEmu->emu_ntfy(hhEmu, 0);
|
|
return 0;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuQueryDefaultTelnetId
|
|
*
|
|
* DESCRIPTION:
|
|
* Gets the default telnet terminal id string for the given emulator.
|
|
*
|
|
* ARGUMENTS:
|
|
* nEmuId - id of the emulator (e.g. EMU_ANSI).
|
|
* achTelnetId - pointer to the buffer for the string.
|
|
* nSize - size of the buffer (in characters).
|
|
*
|
|
* RETURNS:
|
|
* 0=OK, else error
|
|
*
|
|
* AUTHOR: C. Baumgartner, 11/15/96
|
|
*/
|
|
int emuQueryDefaultTelnetId(const int nEmuId, TCHAR *achTelnetId, int nSize)
|
|
{
|
|
int iRet = 0;
|
|
TCHAR * pszDefaultId;
|
|
|
|
// Note : Since these strings are a part of the telnet
|
|
// protocol, it is okay if they are hard-coded.
|
|
//
|
|
switch(nEmuId)
|
|
{
|
|
case EMU_AUTO:
|
|
case EMU_ANSI:
|
|
pszDefaultId = TEXT("ANSI");
|
|
break;
|
|
|
|
case EMU_TTY:
|
|
pszDefaultId = TEXT("TELETYPE-33");
|
|
break;
|
|
|
|
case EMU_VT52:
|
|
pszDefaultId = TEXT("VT52");
|
|
break;
|
|
|
|
#if defined(INCL_VT220)
|
|
case EMU_VT220:
|
|
pszDefaultId = TEXT("VT220");
|
|
break;
|
|
#endif
|
|
|
|
#if defined(INCL_VT320)
|
|
case EMU_VT320:
|
|
pszDefaultId = TEXT("VT320");
|
|
break;
|
|
#endif
|
|
|
|
#if defined(INCL_VT100PLUS)
|
|
case EMU_VT100PLUS:
|
|
pszDefaultId = TEXT("VT100+");
|
|
break;
|
|
#endif
|
|
|
|
#if defined(INCL_VTUTF8)
|
|
case EMU_VTUTF8:
|
|
pszDefaultId = TEXT("VT-UTF8");
|
|
break;
|
|
#endif
|
|
|
|
case EMU_VT100:
|
|
default:
|
|
pszDefaultId = TEXT("VT100");
|
|
break;
|
|
}
|
|
|
|
if ( StrCharGetStrLength(pszDefaultId) < nSize )
|
|
{
|
|
StrCharCopyN(achTelnetId, pszDefaultId, nSize);
|
|
iRet = 0;
|
|
}
|
|
else
|
|
{
|
|
iRet = -1;
|
|
}
|
|
|
|
return iRet;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuLoadDefaultTelnetId
|
|
*
|
|
* DESCRIPTION:
|
|
* Loads the given emulator handle with the default telnet terminal id
|
|
* string for the current emulator type.
|
|
*
|
|
* ARGUMENTS:
|
|
* hEmu - A public emulator handle
|
|
*
|
|
* RETURNS:
|
|
* 0=OK, else error
|
|
*
|
|
* AUTHOR: C. Baumgartner, 11/18/96
|
|
*/
|
|
int emuLoadDefaultTelnetId(const HEMU hEmu)
|
|
{
|
|
HHEMU hhEmu = (HHEMU)hEmu;
|
|
|
|
return emuQueryDefaultTelnetId(hhEmu->stUserSettings.nEmuId,
|
|
hhEmu->stUserSettings.acTelnetId, EMU_MAX_TELNETID);
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuLoadSettings
|
|
*
|
|
* DESCRIPTION:
|
|
* Loads the given emulator user settings.
|
|
*
|
|
* ARGUMENTS:
|
|
* hhEmu - an internal emulator handle
|
|
* uiId - the SFID of the data to load
|
|
* ulDataSize - the size of the data to load (in bytes)
|
|
* pvData - address at which to put the data
|
|
*
|
|
* RETURNS:
|
|
* The size (in bytes) of the data loaded, -1 if an error occured
|
|
*
|
|
* AUTHOR: Bob Everett - 6 Jun 1998
|
|
*/
|
|
STATIC_FUNC int emuLoadSettings(const HHEMU hhEmu,
|
|
const unsigned int uiId,
|
|
unsigned long ulDataSize,
|
|
void *pvData)
|
|
{
|
|
int iResult = 0;
|
|
int iRetVal = 0;
|
|
unsigned long ulSize = 0;
|
|
|
|
// Do the screen color settings exist?
|
|
sfGetSessionItem(sessQuerySysFileHdl(hhEmu->hSession), uiId, &ulSize, 0);
|
|
|
|
if (ulSize > 0)
|
|
{
|
|
// The settings exist. Go get them.
|
|
iResult = sfGetSessionItem(sessQuerySysFileHdl(hhEmu->hSession),
|
|
uiId, &ulDataSize, pvData);
|
|
|
|
if (iResult != 0)
|
|
iRetVal = -1;
|
|
else
|
|
iRetVal = (int)ulSize;
|
|
}
|
|
|
|
return iRetVal;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* emuCheckSettings
|
|
*
|
|
* DESCRIPTION:
|
|
* This ugly piece of code checks for a mismatch in settings between versions.
|
|
* The settings affected are fUse8BitCodes, fAllowUserKeys, nBackspaceKeys,
|
|
* and acTelnetId. The mismatch occurs when moving an HTPE3 session file to
|
|
* any newer version. This includes HT98 and HTPE4.
|
|
*
|
|
* ARGUMENTS:
|
|
* hhEmu - an internal emulator handle
|
|
*
|
|
* RETURNS:
|
|
* Nada, zip, not a thing.
|
|
*
|
|
* AUTHOR: Bob Everett - 8 Jun 1998
|
|
*/
|
|
STATIC_FUNC void emuCheckSettings(struct stEmuBaseSFSettings *pstBaseSFSettings)
|
|
{
|
|
TCHAR *psz = 0;
|
|
TCHAR sz[EMU_MAX_TELNETID];
|
|
|
|
if ((pstBaseSFSettings->nBackspaceKeys != EMU_BKSPKEYS_CTRLH) &&
|
|
(pstBaseSFSettings->nBackspaceKeys != EMU_BKSPKEYS_DEL) &&
|
|
(pstBaseSFSettings->nBackspaceKeys != EMU_BKSPKEYS_CTRLHSPACE))
|
|
{
|
|
// This is the best test for this scenario. Move the data.
|
|
psz = (TCHAR *)&pstBaseSFSettings->fAllowUserKeys;
|
|
if (StrCharGetStrLength(psz) < EMU_MAX_TELNETID)
|
|
{
|
|
StrCharCopyN(sz, psz, sizeof(sz) / sizeof(TCHAR));
|
|
StrCharCopyN(pstBaseSFSettings->acTelnetId, sz, EMU_MAX_TELNETID );
|
|
}
|
|
|
|
pstBaseSFSettings->nBackspaceKeys =
|
|
pstBaseSFSettings->fUse8BitCodes;
|
|
|
|
// Use the defaults.
|
|
pstBaseSFSettings->fUse8BitCodes = FALSE;
|
|
pstBaseSFSettings->fAllowUserKeys = FALSE;
|
|
}
|
|
|
|
// Check the data.
|
|
if ((pstBaseSFSettings->fUse8BitCodes != TRUE) &&
|
|
(pstBaseSFSettings->fUse8BitCodes != FALSE))
|
|
pstBaseSFSettings->fUse8BitCodes = FALSE;
|
|
|
|
if ((pstBaseSFSettings->fAllowUserKeys != TRUE) &&
|
|
(pstBaseSFSettings->fAllowUserKeys != FALSE))
|
|
pstBaseSFSettings->fAllowUserKeys = FALSE;
|
|
|
|
if ((pstBaseSFSettings->nBackspaceKeys != EMU_BKSPKEYS_CTRLH) &&
|
|
(pstBaseSFSettings->nBackspaceKeys != EMU_BKSPKEYS_DEL) &&
|
|
(pstBaseSFSettings->nBackspaceKeys != EMU_BKSPKEYS_CTRLHSPACE))
|
|
{
|
|
pstBaseSFSettings->nBackspaceKeys = EMU_BKSPKEYS_CTRLH;
|
|
|
|
// Assume that if nBackspaceKeys is messed up, so is acTelnetId.
|
|
pstBaseSFSettings->acTelnetId[0] = TEXT('\0');
|
|
}
|
|
}
|