--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/emulator/emulatorbsp/specific/keyboard.cpp Tue Feb 02 01:39:10 2010 +0200
@@ -0,0 +1,817 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// wins\specific\keyboard.cpp
+//
+//
+
+#include "gui.h"
+
+class KeySet
+ {
+public:
+ struct SEntry
+ {
+ const char* iName;
+ TInt iVal;
+ };
+public:
+ inline KeySet(const SEntry aMap[], TInt aSize)
+ :iMap(aMap), iSize(aSize)
+ {}
+ TInt operator[](const TDesC8& aName) const;
+private:
+ const SEntry* iMap;
+ TInt iSize;
+ };
+
+
+const TUint8 StandardKeyMap[KStandardKeyMapSize]=
+ {
+ EStdKeyNull,
+ EStdKeyEscape,
+ '1',
+ '2',
+ '3',
+ '4',
+ '5',
+ '6',
+ '7',
+ '8',
+ '9',
+ '0',
+ EStdKeyMinus,
+ EStdKeyEquals,
+ EStdKeyBackspace,
+ EStdKeyTab,
+ 'Q',
+ 'W',
+ 'E',
+ 'R',
+ 'T',
+ 'Y',
+ 'U',
+ 'I',
+ 'O',
+ 'P',
+ EStdKeySquareBracketLeft,
+ EStdKeySquareBracketRight,
+ EStdKeyEnter,
+ EStdKeyLeftCtrl,
+ 'A',
+ 'S',
+ 'D',
+ 'F',
+ 'G',
+ 'H',
+ 'J',
+ 'K',
+ 'L',
+ EStdKeySemiColon,
+ EStdKeySingleQuote,
+ EStdKeyXXX,
+ EStdKeyLeftShift,
+ EStdKeyHash,
+ 'Z',
+ 'X',
+ 'C',
+ 'V',
+ 'B',
+ 'N',
+ 'M',
+ EStdKeyComma,
+ EStdKeyFullStop,
+ EStdKeyForwardSlash,
+ EStdKeyRightShift,
+ EStdKeyNkpAsterisk,
+ EStdKeyLeftFunc, // Alt key used as Func Key
+ EStdKeySpace,
+ EStdKeyCapsLock,
+ EStdKeyMenu,
+ EStdKeyHelp,
+ EStdKeyDial,
+ EStdKeyF4,
+ EStdKeyF5,
+ EStdKeyF6,
+ EStdKeyF7,
+ EStdKeyF8,
+ EStdKeyOff,
+ EStdKeyF10,
+ EStdKeyPause,
+ EStdKeyScrollLock,
+ EStdKeyNkp7,
+ EStdKeyNkp8,
+ EStdKeyNkp9,
+ EStdKeyNkpMinus,
+ EStdKeyNkp4,
+ EStdKeyNkp5,
+ EStdKeyNkp6,
+ EStdKeyNkpPlus,
+ EStdKeyNkp1,
+ EStdKeyNkp2,
+ EStdKeyNkp3,
+ EStdKeyNkp0,
+ EStdKeyNkpFullStop,
+ EStdKeyNull,
+ EStdKeyNull,
+ EStdKeyBackSlash,
+ EStdKeyF11,
+ EStdKeyF12
+ };
+
+const TUint8 ExtendedKeyMap[]=
+ {
+// EStdKeyNumLock,
+// EStdKeyNull,
+// EStdKeyHome,
+// EStdKeyUpArrow,
+// EStdKeyPageUp,
+// EStdKeyNull,
+// EStdKeyLeftArrow,
+// EStdKeyNull,
+// EStdKeyRightArrow,
+// EStdKeyNull,
+// EStdKeyEnd,
+// EStdKeyDownArrow,
+// EStdKeyPageDown,
+// EStdKeyInsert,
+// EStdKeyDelete
+ /*1c*/ EStdKeyNkpEnter,
+ /*1d*/ EStdKeyRightCtrl,
+ /*1e*/ EStdKeyNull,
+ /*1f*/ EStdKeyNull,
+ /*20*/ EStdKeyNull,
+ /*21*/ EStdKeyNull,
+ /*22*/ EStdKeyNull,
+ /*23*/ EStdKeyNull,
+ /*24*/ EStdKeyNull,
+ /*25*/ EStdKeyNull,
+ /*26*/ EStdKeyNull,
+ /*27*/ EStdKeyNull,
+ /*28*/ EStdKeyNull,
+ /*29*/ EStdKeyNull,
+ /*2a*/ EStdKeyNull,
+ /*2b*/ EStdKeyNull,
+ /*2c*/ EStdKeyNull,
+ /*2d*/ EStdKeyNull,
+ /*2e*/ EStdKeyNull,
+ /*2f*/ EStdKeyNull,
+ /*30*/ EStdKeyNull,
+ /*31*/ EStdKeyNull,
+ /*32*/ EStdKeyNull,
+ /*33*/ EStdKeyNull,
+ /*34*/ EStdKeyNull,
+ /*35*/ EStdKeyNkpForwardSlash,
+ /*36*/ EStdKeyNull,
+ /*37*/ EStdKeyPrintScreen, // Actually e0 2a e0 37
+ /*38*/ EStdKeyRightFunc,
+ /*39*/ EStdKeyNull,
+ /*3a*/ EStdKeyNull,
+ /*3b*/ EStdKeyNull,
+ /*3c*/ EStdKeyNull,
+ /*3d*/ EStdKeyNull,
+ /*3e*/ EStdKeyNull,
+ /*3f*/ EStdKeyNull,
+ /*40*/ EStdKeyNull,
+ /*41*/ EStdKeyNull,
+ /*42*/ EStdKeyNull,
+ /*43*/ EStdKeyNull,
+ /*44*/ EStdKeyNull,
+ /*45*/ EStdKeyNumLock,
+ /*46*/ EStdKeyNull,
+ /*47*/ EStdKeyHome,
+ /*48*/ EStdKeyUpArrow,
+ /*49*/ EStdKeyPageUp,
+ /*4a*/ EStdKeyNull,
+ /*4b*/ EStdKeyLeftArrow,
+ /*4c*/ EStdKeyNull,
+ /*4d*/ EStdKeyRightArrow,
+ /*4e*/ EStdKeyNull,
+ /*4f*/ EStdKeyEnd,
+ /*50*/ EStdKeyDownArrow,
+ /*51*/ EStdKeyPageDown,
+ /*52*/ EStdKeyInsert,
+ /*53*/ EStdKeyDelete,
+ /*54*/ EStdKeyNull,
+ /*55*/ EStdKeyNull,
+ /*56*/ EStdKeyNull,
+ /*57*/ EStdKeyNull,
+ /*58*/ EStdKeyNull,
+ /*59*/ EStdKeyNull,
+ /*5a*/ EStdKeyNull,
+ /*5b*/ EStdKeyLeftAlt, //left windows key
+ /*5c*/ EStdKeyMenu, //right windows key
+ /*5d*/ EStdKeyHelp //right mouse button key
+ };
+
+
+const KeySet::SEntry EPOCKeyNameToKeyMap[] =
+ {
+ {"EStdKeyNull",EStdKeyNull},
+ {"EStdKeyBackspace",EStdKeyBackspace},
+ {"EStdKeyTab",EStdKeyTab},
+ {"EStdKeyEnter",EStdKeyEnter},
+ {"EStdKeyEscape",EStdKeyEscape},
+ {"EStdKeySpace",EStdKeySpace},
+ {"EStdKeyPrintScreen",EStdKeyPrintScreen},
+ {"EStdKeyPause",EStdKeyPause},
+ {"EStdKeyHome",EStdKeyHome},
+ {"EStdKeyEnd",EStdKeyEnd},
+ {"EStdKeyPageUp",EStdKeyPageUp},
+ {"EStdKeyPageDown",EStdKeyPageDown},
+ {"EStdKeyInsert",EStdKeyInsert},
+ {"EStdKeyDelete",EStdKeyDelete},
+ {"EStdKeyLeftArrow",EStdKeyLeftArrow},
+ {"EStdKeyRightArrow",EStdKeyRightArrow},
+ {"EStdKeyUpArrow",EStdKeyUpArrow},
+ {"EStdKeyDownArrow",EStdKeyDownArrow},
+ {"EStdKeyLeftShift",EStdKeyLeftShift},
+ {"EStdKeyRightShift",EStdKeyRightShift},
+ {"EStdKeyLeftAlt",EStdKeyLeftAlt},
+ {"EStdKeyRightAlt",EStdKeyRightAlt},
+ {"EStdKeyLeftCtrl",EStdKeyLeftCtrl},
+ {"EStdKeyRightCtrl",EStdKeyRightCtrl},
+ {"EStdKeyLeftFunc",EStdKeyLeftFunc},
+ {"EStdKeyRightFunc",EStdKeyRightFunc},
+ {"EStdKeyCapsLock",EStdKeyCapsLock},
+ {"EStdKeyNumLock",EStdKeyNumLock},
+ {"EStdKeyScrollLock",EStdKeyScrollLock},
+ {"EStdKeyF1",EStdKeyF1},
+ {"EStdKeyF2",EStdKeyF2},
+ {"EStdKeyF3",EStdKeyF3},
+ {"EStdKeyF4",EStdKeyF4},
+ {"EStdKeyF5",EStdKeyF5},
+ {"EStdKeyF6",EStdKeyF6},
+ {"EStdKeyF7",EStdKeyF7},
+ {"EStdKeyF8",EStdKeyF8},
+ {"EStdKeyF9",EStdKeyF9},
+ {"EStdKeyF10",EStdKeyF10},
+ {"EStdKeyF11",EStdKeyF11},
+ {"EStdKeyF12",EStdKeyF12},
+ {"EStdKeyF13",EStdKeyF13},
+ {"EStdKeyF14",EStdKeyF14},
+ {"EStdKeyF15",EStdKeyF15},
+ {"EStdKeyF16",EStdKeyF16},
+ {"EStdKeyF17",EStdKeyF17},
+ {"EStdKeyF18",EStdKeyF18},
+ {"EStdKeyF19",EStdKeyF19},
+ {"EStdKeyF20",EStdKeyF20},
+ {"EStdKeyF21",EStdKeyF21},
+ {"EStdKeyF22",EStdKeyF22},
+ {"EStdKeyF23",EStdKeyF23},
+ {"EStdKeyF24",EStdKeyF24},
+ {"EStdKeyXXX",EStdKeyXXX},
+ {"EStdKeyComma",EStdKeyComma},
+ {"EStdKeyFullStop",EStdKeyFullStop},
+ {"EStdKeyForwardSlash",EStdKeyForwardSlash},
+ {"EStdKeyBackSlash",EStdKeyBackSlash},
+ {"EStdKeySemiColon",EStdKeySemiColon},
+ {"EStdKeySingleQuote",EStdKeySingleQuote},
+ {"EStdKeyHash",EStdKeyHash},
+ {"EStdKeySquareBracketLeft",EStdKeySquareBracketLeft},
+ {"EStdKeySquareBracketRight",EStdKeySquareBracketRight},
+ {"EStdKeyMinus",EStdKeyMinus},
+ {"EStdKeyEquals",EStdKeyEquals},
+ {"EStdKeyNkpForwardSlash",EStdKeyNkpForwardSlash},
+ {"EStdKeyNkpAsterisk",EStdKeyNkpAsterisk},
+ {"EStdKeyNkpMinus",EStdKeyNkpMinus},
+ {"EStdKeyNkpPlus",EStdKeyNkpPlus},
+ {"EStdKeyNkpEnter",EStdKeyNkpEnter},
+ {"EStdKeyNkp1",EStdKeyNkp1},
+ {"EStdKeyNkp2",EStdKeyNkp2},
+ {"EStdKeyNkp3",EStdKeyNkp3},
+ {"EStdKeyNkp4",EStdKeyNkp4},
+ {"EStdKeyNkp5",EStdKeyNkp5},
+ {"EStdKeyNkp6",EStdKeyNkp6},
+ {"EStdKeyNkp7",EStdKeyNkp7},
+ {"EStdKeyNkp8",EStdKeyNkp8},
+ {"EStdKeyNkp9",EStdKeyNkp9},
+ {"EStdKeyNkp0",EStdKeyNkp0},
+ {"EStdKeyNkpFullStop",EStdKeyNkpFullStop},
+ {"EStdKeyMenu",EStdKeyMenu},
+ {"EStdKeyBacklightOn",EStdKeyBacklightOn},
+ {"EStdKeyBacklightOff",EStdKeyBacklightOff},
+ {"EStdKeyBacklightToggle",EStdKeyBacklightToggle},
+ {"EStdKeyIncContrast",EStdKeyIncContrast},
+ {"EStdKeyDecContrast",EStdKeyDecContrast},
+ {"EStdKeySliderDown",EStdKeySliderDown},
+ {"EStdKeySliderUp",EStdKeySliderUp},
+ {"EStdKeyDictaphonePlay",EStdKeyDictaphonePlay},
+ {"EStdKeyDictaphoneStop",EStdKeyDictaphoneStop},
+ {"EStdKeyDictaphoneRecord",EStdKeyDictaphoneRecord},
+ {"EStdKeyHelp",EStdKeyHelp},
+ {"EStdKeyOff",EStdKeyOff},
+ {"EStdKeyDial",EStdKeyDial},
+ {"EStdKeyIncVolume",EStdKeyIncVolume},
+ {"EStdKeyDecVolume",EStdKeyDecVolume},
+ {"EStdKeyDevice0",EStdKeyDevice0},
+ {"EStdKeyDevice1",EStdKeyDevice1},
+ {"EStdKeyDevice2",EStdKeyDevice2},
+ {"EStdKeyDevice3",EStdKeyDevice3},
+ {"EStdKeyDevice4",EStdKeyDevice4},
+ {"EStdKeyDevice5",EStdKeyDevice5},
+ {"EStdKeyDevice6",EStdKeyDevice6},
+ {"EStdKeyDevice7",EStdKeyDevice7},
+ {"EStdKeyDevice8",EStdKeyDevice8},
+ {"EStdKeyDevice9",EStdKeyDevice9},
+ {"EStdKeyDeviceA",EStdKeyDeviceA},
+ {"EStdKeyDeviceB",EStdKeyDeviceB},
+ {"EStdKeyDeviceC",EStdKeyDeviceC},
+ {"EStdKeyDeviceD",EStdKeyDeviceD},
+ {"EStdKeyDeviceE",EStdKeyDeviceE},
+ {"EStdKeyDeviceF",EStdKeyDeviceF},
+ {"EStdKeyDevice10",EStdKeyDevice10},
+ {"EStdKeyDevice11",EStdKeyDevice11},
+ {"EStdKeyDevice12",EStdKeyDevice12},
+ {"EStdKeyDevice13",EStdKeyDevice13},
+ {"EStdKeyDevice14",EStdKeyDevice14},
+ {"EStdKeyDevice15",EStdKeyDevice15},
+ {"EStdKeyDevice16",EStdKeyDevice16},
+ {"EStdKeyDevice17",EStdKeyDevice17},
+ {"EStdKeyDevice18",EStdKeyDevice18},
+ {"EStdKeyDevice19",EStdKeyDevice19},
+ {"EStdKeyDevice1A",EStdKeyDevice1A},
+ {"EStdKeyDevice1B",EStdKeyDevice1B},
+ {"EStdKeyDevice1C",EStdKeyDevice1C},
+ {"EStdKeyDevice1D",EStdKeyDevice1D},
+ {"EStdKeyDevice1E",EStdKeyDevice1E},
+ {"EStdKeyDevice1F",EStdKeyDevice1F},
+ {"EStdKeyDevice20",EStdKeyDevice20},
+ {"EStdKeyDevice21",EStdKeyDevice21},
+ {"EStdKeyDevice22",EStdKeyDevice22},
+ {"EStdKeyDevice23",EStdKeyDevice23},
+ {"EStdKeyDevice24",EStdKeyDevice24},
+ {"EStdKeyDevice25",EStdKeyDevice25},
+ {"EStdKeyDevice26",EStdKeyDevice26},
+ {"EStdKeyDevice27",EStdKeyDevice27},
+ {"EStdKeyApplication0",EStdKeyApplication0},
+ {"EStdKeyApplication1",EStdKeyApplication1},
+ {"EStdKeyApplication2",EStdKeyApplication2},
+ {"EStdKeyApplication3",EStdKeyApplication3},
+ {"EStdKeyApplication4",EStdKeyApplication4},
+ {"EStdKeyApplication5",EStdKeyApplication5},
+ {"EStdKeyApplication6",EStdKeyApplication6},
+ {"EStdKeyApplication7",EStdKeyApplication7},
+ {"EStdKeyApplication8",EStdKeyApplication8},
+ {"EStdKeyApplication9",EStdKeyApplication9},
+ {"EStdKeyApplicationA",EStdKeyApplicationA},
+ {"EStdKeyApplicationB",EStdKeyApplicationB},
+ {"EStdKeyApplicationC",EStdKeyApplicationC},
+ {"EStdKeyApplicationD",EStdKeyApplicationD},
+ {"EStdKeyApplicationE",EStdKeyApplicationE},
+ {"EStdKeyApplicationF",EStdKeyApplicationF},
+ {"EStdKeyApplication10",EStdKeyApplication10},
+ {"EStdKeyApplication11",EStdKeyApplication11},
+ {"EStdKeyApplication12",EStdKeyApplication12},
+ {"EStdKeyApplication13",EStdKeyApplication13},
+ {"EStdKeyApplication14",EStdKeyApplication14},
+ {"EStdKeyApplication15",EStdKeyApplication15},
+ {"EStdKeyApplication16",EStdKeyApplication16},
+ {"EStdKeyApplication17",EStdKeyApplication17},
+ {"EStdKeyApplication18",EStdKeyApplication18},
+ {"EStdKeyApplication19",EStdKeyApplication19},
+ {"EStdKeyApplication1A",EStdKeyApplication1A},
+ {"EStdKeyApplication1B",EStdKeyApplication1B},
+ {"EStdKeyApplication1C",EStdKeyApplication1C},
+ {"EStdKeyApplication1D",EStdKeyApplication1D},
+ {"EStdKeyApplication1E",EStdKeyApplication1E},
+ {"EStdKeyApplication1F",EStdKeyApplication1F},
+ {"EStdKeyApplication20",EStdKeyApplication20},
+ {"EStdKeyApplication21",EStdKeyApplication21},
+ {"EStdKeyApplication22",EStdKeyApplication22},
+ {"EStdKeyApplication23",EStdKeyApplication23},
+ {"EStdKeyApplication24",EStdKeyApplication24},
+ {"EStdKeyApplication25",EStdKeyApplication25},
+ {"EStdKeyApplication26",EStdKeyApplication26},
+ {"EStdKeyApplication27",EStdKeyApplication27},
+ {"EStdKeyYes",EStdKeyYes},
+ {"EStdKeyNo",EStdKeyNo},
+ {"EStdKeyIncBrightness",EStdKeyIncBrightness},
+ {"EStdKeyDecBrightness",EStdKeyDecBrightness},
+ {"A", 'A'},
+ {"B", 'B'},
+ {"C", 'C'},
+ {"D", 'D'},
+ {"E", 'E'},
+ {"F", 'F'},
+ {"G", 'G'},
+ {"H", 'H'},
+ {"I", 'I'},
+ {"J", 'J'},
+ {"K", 'K'},
+ {"L", 'L'},
+ {"M", 'M'},
+ {"N", 'N'},
+ {"O", 'O'},
+ {"P", 'P'},
+ {"Q", 'Q'},
+ {"R", 'R'},
+ {"S", 'S'},
+ {"T", 'T'},
+ {"U", 'U'},
+ {"V", 'V'},
+ {"W", 'W'},
+ {"X", 'X'},
+ {"Y", 'Y'},
+ {"Z", 'Z'},
+ {"0", '0'},
+ {"1", '1'},
+ {"2", '2'},
+ {"3", '3'},
+ {"4", '4'},
+ {"5", '5'},
+ {"6", '6'},
+ {"7", '7'},
+ {"8", '8'},
+ {"9", '9'},
+ {"EKeyScreenDimension0",EKeyScreenDimension0<<16},
+ {"EKeyScreenDimension1",EKeyScreenDimension1<<16},
+ {"EKeyScreenDimension2",EKeyScreenDimension2<<16},
+ {"EKeyScreenDimension3",EKeyScreenDimension3<<16}
+ };
+
+const KeySet::SEntry RealKeyNames[] =
+ {
+ {"Escape",1},
+ {"1",2},
+ {"2",3},
+ {"3",4},
+ {"4",5},
+ {"5",6},
+ {"6",7},
+ {"7",8},
+ {"8",9},
+ {"9",10},
+ {"0",11},
+ {"Minus",12},
+ {"Equals",13},
+ {"BackSpace",14},
+ {"Tab",15},
+ {"Q",16},
+ {"W",17},
+ {"E",18},
+ {"R",19},
+ {"T",20},
+ {"Y",21},
+ {"U",22},
+ {"I",23},
+ {"O",24},
+ {"P",25},
+ {"SquareBracketLeft",26},
+ {"SquareBracketRight",27},
+ {"Enter",28},
+ {"LeftCtrl",29},
+ {"A",30},
+ {"S",31},
+ {"D",32},
+ {"F",33},
+ {"G",34},
+ {"H",35},
+ {"J",36},
+ {"K",37},
+ {"L",38},
+ {"SemiColon",39},
+ {"SingleQuote",40},
+ {"BackTick",41},
+ {"LeftShift",42},
+ {"Hash",43},
+ {"Z",44},
+ {"X",45},
+ {"C",46},
+ {"V",47},
+ {"B",48},
+ {"N",49},
+ {"M",50},
+ {"Comma",51},
+ {"FullStop",52},
+ {"ForwardSlash",53},
+ {"RightShift",54},
+ {"NkpAsterisk",55},
+ {"LeftAlt",56}, // Alt key used as Func Key
+ {"Space",57},
+ {"CapsLock",58},
+ {"F1",59},
+ {"F2",60},
+ {"F3",61},
+ {"F4",62},
+ {"F5",63},
+ {"F6",64},
+ {"F7",65},
+ {"F8",66},
+ {"F9",67},
+ {"F10",68},
+ {"Pause",69},
+ {"ScrollLock",70},
+ {"Nkp7",71},
+ {"Nkp8",72},
+ {"Nkp9",73},
+ {"NkpMinus",74},
+ {"Nkp4",75},
+ {"Nkp5",76},
+ {"Nkp6",77},
+ {"NkpPlus",78},
+ {"Nkp1",79},
+ {"Nkp2",80},
+ {"Nkp3",81},
+ {"Nkp0",82},
+ {"NkpFullStop",83},
+ {"BackSlash",86},
+ {"F11",87},
+ {"F12",88}
+ };
+
+const KeySet::SEntry RealExtendedKeyNames[] =
+ {
+ {"NkpEnter",0},
+ {"RightCtrl",1},
+ {"NkpForwardSlash", 25},
+ {"PrintScreen",27},
+ {"RightAlt", 28},
+ {"NumLock", 41},
+ {"Home",43},
+ {"UpArrow",44},
+ {"PageUp",45},
+ {"LeftArrow",47},
+ {"RightArrow",49},
+ {"End",51},
+ {"DownArrow",52},
+ {"PageDown",53},
+ {"Insert",54},
+ {"Delete",55},
+ {"LeftWindows",63},
+ {"RightWindows",64},
+ {"ContextMenu",65}
+ };
+
+const KeySet EpocKeys(EPOCKeyNameToKeyMap, sizeof(EPOCKeyNameToKeyMap)/sizeof(KeySet::SEntry));
+const KeySet StandardKeys(RealKeyNames, sizeof(RealKeyNames)/sizeof(KeySet::SEntry));
+const KeySet ExtendedKeys(RealExtendedKeyNames, sizeof(RealExtendedKeyNames)/sizeof(KeySet::SEntry));
+
+TInt KeySet::operator[](const TDesC8& aName) const
+ {
+ TInt len = aName.Length();
+ const char* p = (const char*)aName.Ptr();
+ for (const SEntry* e = iMap + iSize; --e >= iMap; )
+ {
+ if (_strnicmp(e->iName, p, len) == 0 && e->iName[len] == '\0')
+ return e->iVal;
+ }
+ return KErrNotFound;
+ }
+
+// Class Alias
+
+Alias::Alias()
+ :iMap(10)
+ {}
+
+TInt Alias::Add(const TDesC8& aAlias, const TDesC8& aName)
+//
+// add a new alias
+//
+ {
+ TInt r = KErrNoMemory;
+ SEntry e;
+ e.iAlias = HBuf8::New(aAlias);
+ if (e.iAlias)
+ {
+ e.iName = HBuf8::New(aName);
+ if (e.iName)
+ {
+ r = iMap.InsertInOrder(e, &Alias::Compare);
+ if (r == KErrNone)
+ return KErrNone;
+ delete e.iName;
+ }
+ delete e.iAlias;
+ }
+ return r;
+ }
+
+const TDesC8* Alias::operator[](const TDesC8& aAlias)
+//
+// Look up an alias
+//
+ {
+ SEntry e;
+ e.iAlias = const_cast<TDesC8*>(&aAlias);
+ TInt ix = iMap.FindInOrder(e, &Alias::Compare);
+ return ix >= 0 ? iMap[ix].iName : NULL;
+ }
+
+TInt Alias::Compare(const SEntry& aLhs, const SEntry& aRhs)
+ {
+ return CompareI(*aLhs.iAlias, *aRhs.iAlias);
+ }
+
+
+
+// keyboard mapping
+
+DWinsKeyboard::DWinsKeyboard()
+ {
+ memcpy(iStandardKeyMap, StandardKeyMap, KStandardKeyMapSize);
+ memcpy(iExtendedKeyMap, ExtendedKeyMap, KExtendedKeyMapSize);
+ memcpy(iAltStandardKeyMap, StandardKeyMap, KStandardKeyMapSize);
+ memcpy(iAltExtendedKeyMap, ExtendedKeyMap, KExtendedKeyMapSize);
+ memcpy(iCtrlStandardKeyMap, StandardKeyMap, KStandardKeyMapSize);
+ memcpy(iCtrlExtendedKeyMap, ExtendedKeyMap, KExtendedKeyMapSize);
+ }
+
+TInt DWinsKeyboard::Init(TInt aId)
+//
+// Initialise the alias and key maps from the properties
+//
+ {
+ char property[50];
+ wsprintfA(property, "Configuration[%d]DefineKeyName",aId);
+ TInt r = MultiProperty(&DWinsKeyboard::DoDefineAlias, this, property);
+ if (r != KErrNone)
+ return r;
+ wsprintfA(property, "Configuration[%d]KeyMap",aId);
+ r = MultiProperty(&DWinsKeyboard::DoMapKey, this, property);
+ return r;
+ }
+
+TInt DWinsKeyboard::DoDefineAlias(TAny* aPtr, const char* aValue)
+ {
+ return static_cast<DWinsKeyboard*>(aPtr)->DefineAlias(aValue);
+ }
+
+TInt DWinsKeyboard::DefineAlias(const char* aValue)
+//
+// The character string terminates in a ';' or a '\0'
+//
+ {
+ //get the alias name
+ const char* beg = skipws(aValue);
+ const char* end = skiptok(beg);
+ TPtrC8 alias((const TUint8*)beg, end-beg);
+
+ //get the real name
+ beg = skipws(end);
+ end = skiptok(beg);
+ TPtrC8 name((const TUint8*)beg, end-beg);
+
+ //prevent an alias being made of an alias
+ if (iAliasedKeys[name] != NULL)
+ return KErrArgument;
+
+ // ensure this is valid name
+ TInt r = GetEPOCKeyCode(name);
+ if (r == KErrNotFound)
+ return r;
+
+ //now we need to record the alias name and the real key name
+ return iAliasedKeys.Add(alias, name);
+ }
+
+
+TInt DWinsKeyboard::DoMapKey(TAny* aPtr, const char* aValue)
+ {
+ return static_cast<DWinsKeyboard*>(aPtr)->MapKey(aValue);
+ }
+
+TInt DWinsKeyboard::MapKey(const char* aValue)
+ {
+ //get the win32 name
+ const char* beg = skipws(aValue);
+ const char* end = skiptok(beg);
+
+ // check to see if a modifier key has been specified
+ TBool altModifier = !_strnicmp(beg, "LeftAlt", 7);
+ altModifier |= !_strnicmp(beg, "RightAlt", 8);
+ TBool ctrlModifier = !_strnicmp(beg, "LeftCtrl", 8);
+ ctrlModifier |= !_strnicmp(beg, "RightCtrl", 9);
+
+ // if modifier was found, skip to next token
+ if (altModifier || ctrlModifier)
+ {
+ beg = skipws(end);
+ end = skiptok(beg);
+ }
+
+ TPtrC8 name((const TUint8*)beg, end-beg);
+
+ //get the epoc key
+ beg = skipws(end);
+ end = skiptok(beg);
+ TInt key = GetEPOCKeyCode(TPtrC8((const TUint8*)beg, end-beg));
+ if (key == KErrNotFound)
+ return key;
+
+ TInt scancode = StandardKeys[name];
+
+ // if alt modifier was specified, change the alt key map
+ if (altModifier)
+ {
+ if (scancode >= 0)
+ iAltStandardKeyMap[scancode] = (TUint8)key;
+ else
+ {
+ scancode = ExtendedKeys[name];
+ if (scancode >= 0)
+ iAltExtendedKeyMap[scancode] = (TUint8)key;
+ else
+ return KErrNotFound;
+ }
+ }
+
+ // if ctrl modifier was specified, change the ctrl key map
+ else if (ctrlModifier)
+ {
+ if (scancode >= 0)
+ iCtrlStandardKeyMap[scancode] = (TUint8)key;
+ else
+ {
+ scancode = ExtendedKeys[name];
+ if (scancode >= 0)
+ iCtrlExtendedKeyMap[scancode] = (TUint8)key;
+ else
+ return KErrNotFound;
+ }
+ }
+
+ // no modifier, change the default key map
+ else
+ {
+ if (scancode >= 0)
+ iStandardKeyMap[scancode] = (TUint8)key;
+ else
+ {
+ scancode = ExtendedKeys[name];
+ if (scancode >= 0)
+ iExtendedKeyMap[scancode] = (TUint8)key;
+ else
+ return KErrNotFound;
+ }
+ }
+
+ return KErrNone;
+ }
+
+TInt DWinsKeyboard::GetEPOCKeyCode(const TDesC8& aStr)
+ {
+ // look for an alias
+ const TDesC8* arg = iAliasedKeys[aStr];
+ return EpocKeys[arg ? *arg : aStr];
+ }
+
+TInt DWinsKeyboard::ScanCodeToKey(TInt aScanCode, const TUint8* aStandardMap, const TUint8* aExtendedMap)
+//
+// Map Windows scan codes to Epoc key
+//
+ {
+ TInt stdCode = EStdKeyNull;
+ TInt extended = aScanCode&KKeyExtendedBit;
+ aScanCode &= KKeyNormalBits;
+ if (extended)
+ {
+ if (aScanCode >= KExtendedKeyBase && aScanCode <= KMaxExtendedKey)
+ stdCode = aExtendedMap[aScanCode - KExtendedKeyBase];
+ }
+ else if (aScanCode < KStandardKeyMapSize)
+ stdCode = aStandardMap[aScanCode];
+ return stdCode;
+ }
+
+TInt DWinsKeyboard::ScanCodeToStandardKey(TInt aScanCode)
+//
+// Map Windows scan codes to standard keys
+//
+ {
+ return ScanCodeToKey(aScanCode, StandardKeyMap, ExtendedKeyMap );
+ }
+
+TInt DWinsKeyboard::ScanCodeToRemappedKey(TInt aScanCode)
+//
+// Map Windows scan codes to remapped keys
+//
+ {
+ if (HIBYTE(GetKeyState(VK_MENU))) // Alt key is pressed
+ return ScanCodeToKey(aScanCode, iAltStandardKeyMap, iAltExtendedKeyMap );
+
+ if (HIBYTE(GetKeyState(VK_CONTROL))) // Ctrl key is pressed
+ return ScanCodeToKey(aScanCode, iCtrlStandardKeyMap, iCtrlExtendedKeyMap );
+
+ return ScanCodeToKey(aScanCode, iStandardKeyMap, iExtendedKeyMap );
+ }
+
+
+
+
+TInt DWinsKeyboard::GetScanCode(const TDesC8& aStr)
+ {
+ return StandardKeys[aStr];
+ }
+