|
#define Uses_TKeys
#include <tvision/tv.h>
struct TKeyCodeLookupEntry
{
ushort normalKeyCode;
uchar shiftState;
};
static const TKeyCodeLookupEntry ctrlKeyLookup[] =
{
{ 0, 0 },
{ 'A' , kbCtrlShift },
{ 'B' , kbCtrlShift },
{ 'C' , kbCtrlShift },
{ 'D' , kbCtrlShift },
{ 'E' , kbCtrlShift },
{ 'F' , kbCtrlShift },
{ 'G' , kbCtrlShift },
{ 'H' , kbCtrlShift },
{ 'I' , kbCtrlShift },
{ 'J' , kbCtrlShift },
{ 'K' , kbCtrlShift },
{ 'L' , kbCtrlShift },
{ 'M' , kbCtrlShift },
{ 'N' , kbCtrlShift },
{ 'O' , kbCtrlShift },
{ 'P' , kbCtrlShift },
{ 'Q' , kbCtrlShift },
{ 'R' , kbCtrlShift },
{ 'S' , kbCtrlShift },
{ 'T' , kbCtrlShift },
{ 'U' , kbCtrlShift },
{ 'V' , kbCtrlShift },
{ 'W' , kbCtrlShift },
{ 'X' , kbCtrlShift },
{ 'Y' , kbCtrlShift },
{ 'Z' , kbCtrlShift },
};
static const TKeyCodeLookupEntry extKeyLookup[] =
{
{ 0, 0 },
{ kbEsc, kbAltShift },
{ ' ' , kbAltShift },
{ 0, 0 },
{ kbIns, kbCtrlShift },
{ kbIns, kbShift, },
{ kbDel, kbCtrlShift },
{ kbDel, kbShift },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ kbBack, kbAltShift },
{ kbTab, kbShift },
{ 'Q' , kbAltShift },
{ 'W' , kbAltShift },
{ 'E' , kbAltShift },
{ 'R' , kbAltShift },
{ 'T' , kbAltShift },
{ 'Y' , kbAltShift },
{ 'U' , kbAltShift },
{ 'I' , kbAltShift },
{ 'O' , kbAltShift },
{ 'P' , kbAltShift },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ 'A' , kbAltShift },
{ 'S' , kbAltShift },
{ 'D' , kbAltShift },
{ 'F' , kbAltShift },
{ 'G' , kbAltShift },
{ 'H' , kbAltShift },
{ 'J' , kbAltShift },
{ 'K' , kbAltShift },
{ 'L' , kbAltShift },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ 'Z' , kbAltShift },
{ 'X' , kbAltShift },
{ 'C' , kbAltShift },
{ 'V' , kbAltShift },
{ 'B' , kbAltShift },
{ 'N' , kbAltShift },
{ 'M' , kbAltShift },
{ 0, 0 },
{ 0, 0 },
{ '/' , kbCtrlShift },
{ 0, 0 },
{ '*' , kbCtrlShift },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ kbF1, 0 },
{ kbF2, 0 },
{ kbF3, 0 },
{ kbF4, 0 },
{ kbF5, 0 },
{ kbF6, 0 },
{ kbF7, 0 },
{ kbF8, 0 },
{ kbF9, 0 },
{ kbF10, 0 },
{ 0, 0 },
{ 0, 0 },
{ kbHome, 0 },
{ kbUp, 0 },
{ kbPgUp, 0 },
{ '-' , kbCtrlShift },
{ kbLeft, 0 },
{ 0, 0 },
{ kbRight, 0 },
{ '+' , kbCtrlShift },
{ kbEnd, 0 },
{ kbDown, 0 },
{ kbPgDn, 0 },
{ kbIns, 0 },
{ kbDel, 0 },
{ kbF1, kbShift },
{ kbF2, kbShift },
{ kbF3, kbShift },
{ kbF4, kbShift },
{ kbF5, kbShift },
{ kbF6, kbShift },
{ kbF7, kbShift },
{ kbF8, kbShift },
{ kbF9, kbShift },
{ kbF10, kbShift },
{ kbF1, kbCtrlShift },
{ kbF2, kbCtrlShift },
{ kbF3, kbCtrlShift },
{ kbF4, kbCtrlShift },
{ kbF5, kbCtrlShift },
{ kbF6, kbCtrlShift },
{ kbF7, kbCtrlShift },
{ kbF8, kbCtrlShift },
{ kbF9, kbCtrlShift },
{ kbF10, kbCtrlShift },
{ kbF1, kbAltShift },
{ kbF2, kbAltShift },
{ kbF3, kbAltShift },
{ kbF4, kbAltShift },
{ kbF5, kbAltShift },
{ kbF6, kbAltShift },
{ kbF7, kbAltShift },
{ kbF8, kbAltShift },
{ kbF9, kbAltShift },
{ kbF10, kbAltShift },
{ kbCtrlPrtSc, kbCtrlShift },
{ kbLeft, kbCtrlShift },
{ kbRight, kbCtrlShift },
{ kbEnd, kbCtrlShift },
{ kbPgDn, kbCtrlShift },
{ kbHome, kbCtrlShift },
{ '1' , kbAltShift },
{ '2' , kbAltShift },
{ '3' , kbAltShift },
{ '4' , kbAltShift },
{ '5' , kbAltShift },
{ '6' , kbAltShift },
{ '7' , kbAltShift },
{ '8' , kbAltShift },
{ '9' , kbAltShift },
{ '0' , kbAltShift },
{ '-' , kbAltShift },
{ '=' , kbAltShift },
{ kbPgUp, kbCtrlShift },
#if defined( __FLAT__ )
{ kbF11, 0 },
{ kbF12, 0 },
{ kbF11, kbShift },
{ kbF12, kbShift },
{ kbF11, kbCtrlShift },
{ kbF12, kbCtrlShift },
{ kbF11, kbAltShift },
{ kbF12, kbAltShift },
{ kbUp, kbCtrlShift },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ kbDown, kbCtrlShift },
{ 0, 0 },
{ 0, 0 },
{ kbTab, kbCtrlShift },
{ 0, 0 },
{ 0, 0 },
{ kbHome, kbAltShift },
{ kbUp, kbAltShift },
{ kbPgUp, kbAltShift },
{ 0, 0 },
{ kbLeft, kbAltShift },
{ 0, 0 },
{ kbRight, kbAltShift },
{ 0, 0 },
{ kbEnd, kbAltShift },
{ kbDown, kbAltShift },
{ kbPgDn, kbAltShift },
{ kbIns, kbAltShift },
{ kbDel, kbAltShift },
{ 0, 0 },
{ kbTab, kbAltShift },
{ kbEnter, kbAltShift },
#endif
};
enum { extKeyLookupSize = sizeof (extKeyLookup)/ sizeof (extKeyLookup[0]) };
static const TKeyCodeLookupEntry
kbCtrlBackEntry = { kbBack, kbCtrlShift },
kbCtrlEnterEntry = { kbEnter, kbCtrlShift };
static int isRawCtrlKey(uchar scanCode, uchar charCode)
{
static const char scanKeys[35 + 1] =
"QWERTYUIOP\0\0\0\0ASDFGHJKL\0\0\0\0\0ZXCVBNM" ;
return 16 <= scanCode && scanCode < 16 + 35
&& scanKeys[scanCode - 16] == charCode - 1 + 'A' ;
};
static int isPrintableCharacter(uchar charCode) noexcept
{
return ' ' <= charCode && charCode != 0x7F && charCode != 0xFF;
};
static int isKeypadCharacter(uchar scanCode) noexcept
{
return scanCode == 0x35 || scanCode == 0x37
|| scanCode == 0x4A || scanCode == 0x4E;
}
TKey::TKey(ushort keyCode, ushort shiftState) noexcept
{
ushort code = keyCode;
ushort mods =
(shiftState & kbShift ? kbShift : 0) |
(shiftState & kbCtrlShift ? kbCtrlShift : 0) |
(shiftState & kbLeftAlt ? kbAltShift : 0);
uchar scanCode = keyCode >> 8;
uchar charCode = keyCode & 0xFF;
const TKeyCodeLookupEntry *entry = 0;
if (keyCode <= kbCtrlZ || isRawCtrlKey(scanCode, charCode))
entry = &ctrlKeyLookup[charCode];
else if (charCode == 0)
{
if (scanCode < extKeyLookupSize)
entry = &extKeyLookup[scanCode];
}
else if (isPrintableCharacter(charCode))
{
if ( 'a' <= charCode && charCode <= 'z' )
code = charCode - 'a' + 'A' ;
else if (!isKeypadCharacter(scanCode))
code &= 0xFF;
}
else switch (keyCode)
{
case kbCtrlBack: entry = &kbCtrlBackEntry; break ;
case kbCtrlEnter: entry = &kbCtrlEnterEntry; break ;
}
if (entry)
{
mods |= entry->shiftState;
if (entry->normalKeyCode != 0)
code = entry->normalKeyCode;
}
this ->code = code;
this ->mods = code != kbNoKey ? mods : 0;
}
|