|
|
/*
* Copyright (c) Microsoft Corporation * * Module Name : * console.c * * Hacks to read characters from the NT console * Taken from nt\sdktools\vi\nt.c * * * Sadagopan Rajaram -- Nov 5, 1999 * */
#include "tcclnt.h"
#include "keymap.h"
#define MAX_VK 0x7f
TCHAR RegularTable[] = {ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 08 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 10 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 18 */ ZERO, ZERO, ZERO, ESCP, ZERO, ZERO, ZERO, ZERO, /* 20 */ ZERO, K_PU, K_PD, K_EN, K_HO, K_LE, K_UP, K_RI, /* 28 */ K_DO, ZERO, ZERO, ZERO, ZERO, K_IN, K_DE, ZERO, /* 30 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 38 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 40 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 48 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 50 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 58 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 60 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 68 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 70 */ K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, /* 78 */ K_F9, K_FA, K_FB, K_FC, ZERO, ZERO, ZERO, ZERO};
TCHAR ShiftedTable[] = { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 08 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 10 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 18 */ ZERO, ZERO, ZERO, ESCP, ZERO, ZERO, ZERO, ZERO, /* 20 */ ZERO, K_PU, K_PD, K_EN, K_HO, K_LE, K_UP, K_RI, /* 28 */ K_DO, ZERO, ZERO, ZERO, ZERO, K_IN, K_DE, ZERO, /* 30 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 38 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 40 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 48 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 50 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 58 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 60 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 68 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 70 */ K_S1, K_S2, K_S3, K_S4, K_S5, K_S6, K_S7, K_S8, /* 78 */ K_S9, K_SA, K_SB, K_SC, ZERO, ZERO, ZERO, ZERO};
TCHAR ControlTable[] = { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 08 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 10 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 18 */ ZERO, ZERO, ZERO, ESCP, ZERO, ZERO, K_CG, ZERO, /* 20 */ ZERO, K_PU, K_PD, K_EN, K_HO, K_LE, K_UP, K_RI, /* 28 */ K_DO, ZERO, ZERO, ZERO, ZERO, K_IN, K_DE, ZERO, /* 30 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 38 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 40 */ ZERO, CTLA, CTLB, CTLC, CTLD, CTLE, CTLF, CTLG, /* 48 */ CTLH, CTLI, CTLJ, CTLK, CTLL, CTLM, CTLN, CTLO, /* 50 */ CTLP, CTLQ, CTLR, CTLS, CTLT, CTLU, CTLV, CTLW, /* 58 */ CTLX, CTLY, CTLZ, CTL1, CTL2, CTL3, CTL4, CTL5, /* 60 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 68 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 70 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, /* 78 */ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO};
#define ALT_PRESSED (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED)
#define CTL_PRESSED (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED)
#define CONTROL_ALT (ALT_PRESSED | CTL_PRESSED)
/*
* inTCHAR() - get a TCHARacter from the keyboard * Reads only ascii TCHARacters from the keyboard. */ void inchar(CHAR *buff) { INPUT_RECORD InputRec; DWORD NumRead; int len;
while(1) { /* loop until we get a valid console event */ ReadConsoleInput(InputHandle,&InputRec,1,&NumRead); if((InputRec.EventType == KEY_EVENT) && (InputRec.Event.KeyEvent.bKeyDown)){ KEY_EVENT_RECORD *KE = &InputRec.Event.KeyEvent; TCHAR *Table;
if(KE->dwControlKeyState & ALT_PRESSED) { if ((KE->uChar.AsciiChar == 'x')||(KE->uChar.AsciiChar == 'X')) { exit(0); } continue; // no ALT keys allowed.
} else{ if(KE->dwControlKeyState & CTL_PRESSED) { Table = ControlTable; } else { // We might have a character in Unicode
#ifdef UNICODE
if(KE->uChar.UnicodeChar) { // no control, no alt
// convert to dbcs character and return
len= wctomb(buff,KE->uChar.UnicodeChar); if(len == -1){ continue; } buff[len] = (CHAR) 0; return; #else
if(KE->uChar.AsciiChar){ buff[0] = KE->uChar.AsciiChar; buff[1] = (CHAR) 0; return; #endif
} else { if(KE->dwControlKeyState & SHIFT_PRESSED) { Table = ShiftedTable; } else { Table = RegularTable; } } } }
if((KE->wVirtualKeyCode > MAX_VK) || !Table[KE->wVirtualKeyCode]) { continue; } #ifdef UNICODE
// convert to dbcs character and return
len= wctomb(buff,Table[KE->wVirtualKeyCode]); if(len == -1){ continue; } buff[len] = (CHAR) 0; #else
buff[0] = Table[KE->wVirtualKeyCode]; buff[1] = (CHAR) 0; #endif
return; } } }
|