diff options
Diffstat (limited to 'tvision/classes/winnt/winntkey.cc')
-rw-r--r-- | tvision/classes/winnt/winntkey.cc | 326 |
1 files changed, 326 insertions, 0 deletions
diff --git a/tvision/classes/winnt/winntkey.cc b/tvision/classes/winnt/winntkey.cc new file mode 100644 index 0000000..75893b7 --- /dev/null +++ b/tvision/classes/winnt/winntkey.cc @@ -0,0 +1,326 @@ +/**[txh]******************************************************************** + + Copyright (c) 2002 by Salvador E. Tropea (SET) + It said: + This code is GPL, see copying file for more details. + Keyboard handler for Win32 Copyright by Anatoli Soltan (2000) + Based on the handler for Linux Copyright by Salvador E. Tropea (SET) (1998,1999) + + Description: + WinNT Keyboard routines. + The original implementation was done by Anatoli, I removed some code, added +some routines and adapted it to the new architecture. + + ToDo: + * Must check GetShiftState, I think the return value is wrong. + +***************************************************************************/ +#include <tv/configtv.h> + +#define Uses_TEvent +#define Uses_TGKey +#define Uses_FullSingleKeySymbols +#define Uses_TScreen +#include <tv.h> + +// I delay the check to generate as much dependencies as possible +#ifdef TVOS_Win32 +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +#include <tv/winnt/screen.h> +#include <tv/winnt/key.h> + +INPUT_RECORD TGKeyWinNT::inpRec; +unsigned TGKeyWinNT::shiftState; +ushort TGKeyWinNT::vk2kk[]= +{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x002a, 0x002b, 0x0000, 0x0000, 0x0000, 0x002c, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x001f, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0034, 0x0047, 0x004c, 0x004a, 0x0045, 0x0048, 0x0046, 0x0049, + 0x004b, 0x0000, 0x0000, 0x0000, 0x0000, 0x004d, 0x004e, 0x0000, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001a, 0x0063, 0x0064, 0x0065, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0033, 0x0036, 0x0000, 0x0035, 0x0000, 0x0032, + 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, + 0x0041, 0x0042, 0x0043, 0x0044, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x002d, 0x0038, 0x0059, 0x005e, 0x005a, 0x005b, + 0x0061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0056, 0x001c, 0x0057, 0x002e, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +unsigned TGKeyWinNT::GetShiftState() +{ + return shiftState; +} + +void TGKeyWinNT::Clear(void) +{ + FlushConsoleInputBuffer(TScreenWinNT::hIn); +} + +int TGKeyWinNT::KbHit(void) +{ + DWORD cEvents; + + while (PeekConsoleInput(TScreenWinNT::hIn,&inpRec,1,&cEvents) && cEvents==1) + { + if (inpRec.EventType!=KEY_EVENT) + { + // The following two lines are commented because if someone waits for + // a key press by calling kbhit in a loop and a mouse event is in the + // queue, the loop will never end. + //if (inpRec.EventType == MOUSE_EVENT) + // return 0; + ReadConsoleInput(TScreenWinNT::hIn,&inpRec,1,&cEvents); + continue; + } + if (!inpRec.Event.KeyEvent.bKeyDown) // skeek keyup events + ReadConsoleInput(TScreenWinNT::hIn,&inpRec,1,&cEvents); + else + return 1; + } + return 0; +} + +void TGKeyWinNT::FillTEvent(TEvent &e) +{ + DWORD cEvents; + ReadConsoleInput(TScreenWinNT::hIn,&inpRec,1,&cEvents); + + DWORD dwCtlState=inpRec.Event.KeyEvent.dwControlKeyState; + shiftState=0; + if (dwCtlState & SHIFT_PRESSED) + shiftState|=kbShiftCode; + if (dwCtlState & (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)) + shiftState|=kbCtrlCode; + if (dwCtlState & LEFT_ALT_PRESSED) + shiftState|=kbAltLCode; + if (dwCtlState & RIGHT_ALT_PRESSED) + shiftState|=kbAltRCode; + //if (dwCtlState & SCROLLLOCK_ON) + // shiftState |= kbScrollState; + //if (dwCtlState & NUMLOCK_ON) + // shiftState |= kbNumState; + //if (dwCtlState & CAPSLOCK_ON) + // shiftState |= kbCapsState; + + e.keyDown.charScan.scanCode=inpRec.Event.KeyEvent.wVirtualScanCode; + uchar Symbol=inpRec.Event.KeyEvent.uChar.AsciiChar; + e.keyDown.charScan.charCode=((shiftState & kbAltLCode) && (Symbol<128)) ? + 0 : Symbol; + e.keyDown.shiftState=shiftState; + // To debug the codes + //fprintf(stderr,"inpRec.Event.KeyEvent.wVirtualKeyCode=%d\n", + // inpRec.Event.KeyEvent.wVirtualKeyCode); + e.keyDown.keyCode=(inpRec.Event.KeyEvent.wVirtualKeyCode<256) ? + vk2kk[inpRec.Event.KeyEvent.wVirtualKeyCode] : + (ushort)0; + if (e.keyDown.keyCode==0) + return; + e.what=evKeyDown; + e.keyDown.keyCode|=shiftState; +} + +void TGKeyWinNT::Init() +{ + TGKey::kbhit=KbHit; + TGKey::getShiftState=GetShiftState; + TGKey::fillTEvent=FillTEvent; + TGKey::clear=Clear; +} +#else + +#include <tv/winnt/screen.h> +#include <tv/winnt/key.h> + +#endif // TVOS_Win32 + +/* +This code was used by Anatoli to check what key codes generates Win32 API. + +<------- start of codes.cpp +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#include <stdio.h> + +void main() +{ + INPUT_RECORD ir; + HANDLE hInp; + DWORD cEvents; + + hInp=GetStdHandle(STD_INPUT_HANDLE); + + while (1) + { + ReadConsoleInput(hInp, &ir, 1, &cEvents); + if (ir.EventType == KEY_EVENT) + { + printf("KeyDown = %d, VK = %d, SC = %x Char = %d\n", + ir.Event.KeyEvent.bKeyDown, + ir.Event.KeyEvent.wVirtualKeyCode, + ir.Event.KeyEvent.wVirtualScanCode, + ir.Event.KeyEvent.uChar.AsciiChar); + } + } +} +<------- end of codes.cpp + +Perl script used by Anatoli to generate the translation table + +@table = qw( +kbUnknown=0x0000 +kbA=0x0001=65 +kbB=0x0002=66 +kbC=0x0003=67 +kbD=0x0004=68 +kbE=0x0005=69 +kbF=0x0006=70 +kbG=0x0007=71 +kbH=0x0008=72 +kbI=0x0009=73 +kbJ=0x000a=74 +kbK=0x000b=75 +kbL=0x000c=76 +kbM=0x000d=77 +kbN=0x000e=78 +kbO=0x000f=79 +kbP=0x0010=80 +kbQ=0x0011=81 +kbR=0x0012=82 +kbS=0x0013=83 +kbT=0x0014=84 +kbU=0x0015=85 +kbV=0x0016=86 +kbW=0x0017=87 +kbX=0x0018=88 +kbY=0x0019=89 +kbZ=0x001a=90 + +kbOpenBrace=0x001b +kbBackSlash=0x001c=220 +kbCloseBrace=0x001d +kbPause=0x001e +kbEsc=0x001f=27 + +kb0=0x0020=48 +kb1=0x0021=49 +kb2=0x0022=50 +kb3=0x0023=51 +kb4=0x0024=52 +kb5=0x0025=53 +kb6=0x0026=54 +kb7=0x0027=55 +kb8=0x0028=56 +kb9=0x0029=57 + +kbBackSpace=0x002a=8 +kbTab=0x002b=9 +kbEnter=0x002c=13 + +kbColon=0x002d=186 +kbQuote=0x002e=222 +kbGrave=0x002f +kbComma=0x0030 + +kbStop=0x0031 +kbSlash=0x0032=111 +kbAsterisk=0x0033=106 +kbSpace=0x0034=32 + +kbMinus=0x0035=109 +kbPlus=0x0036=107 +kbPrnScr=0x0037 +kbEqual=0x0038=187 + +kbF1=0x0039=112 +kbF2=0x003a=113 +kbF3=0x003b=114 +kbF4=0x003c=115 +kbF5=0x003d=116 +kbF6=0x003e=117 +kbF7=0x003f=118 +kbF8=0x0040=119 +kbF9=0x0041=120 +kbF10=0x0042=121 +kbF11=0x0043=122 +kbF12=0x0044=123 + +kbHome=0x0045=36 +kbUp=0x0046=38 +kbPgUp=0x0047=33 +kbLeft=0x0048=37 +kbRight=0x0049=39 +kbEnd=0x004a=35 +kbDown=0x004b=40 +kbPgDn=0x004c=34 + +kbInsert=0x004d=45 +kbDelete=0x004e=46 +kbCaret=0x004f +kbAdmid=0x0050 + +kbDobleQuote=0x0051 +kbNumeral=0x0052 +kbDolar=0x0053 +kbPercent=0x0054 + +kbAmper=0x0055 +kbOpenPar=0x0056=219 +kbClosePar=0x0057=221 +kbDoubleDot=0x0058 + +kbLessThan=0x0059=188 +kbGreaterThan=0x005a=190 +kbQuestion=0x005b=191 +kbA_Roba=0x005c +kbOr=0x005d +kbUnderLine=0x005e=189 +kbOpenCurly=0x005f +kbCloseCurly=0x0060 +kbTilde=0x0061=192 +kbMacro=0x0062 +kbWinLeft=0x0063=91 +kbWinRight=0x0064=92 +kbWinSel=0x0065=93 +kbMouse=0x0066 +); + +for $e (@table) { + ($kname, $kcode, $vcode) = split(/=/, $e); + $map[$vcode] = $kcode if $vcode ne ''; +} + +for ($i = 0; $i < 256; $i++) { + $map[$i] = '0x0000' if !defined($map[$i]); +} + +for ($i = 0; $i < 256; ) { + for ($j = 0; $j < 8; $j++, $i++) { + print $map[$i], (($i == 255) ? '' : ', '); + } + print "\n"; +} +*/ + |