emulator/emulatorbsp/specific/keymap.cpp
changeset 0 cec860690d41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emulator/emulatorbsp/specific/keymap.cpp	Tue Feb 02 01:39:10 2010 +0200
@@ -0,0 +1,1905 @@
+// Copyright (c) 1996-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\keymap.cpp
+// The lookup tables giving the function to be carried out
+// and the new state of the keyboard
+// 
+//
+
+
+#include <k32keys.h>
+
+// the "array" parameter must be a true array and not a pointer
+#define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0]))
+
+#define TABLE_ENTRY_ANOTHER_CTRL_DIGIT					\
+	{  													\
+		{												\
+		EModifierKeyUp|EModifierFunc,	                \
+		0												\
+		},												\
+		{												\
+		EKeyNull,										\
+		EAnyDigitGivenRadix								\
+		},												\
+		{												\
+		EStateCtrlDigits,								\
+		EAddOnCtrlDigit,								\
+		0												\
+		}												\
+	}
+
+// This table is searched for a match if a match has not been
+// found in the current state's table
+
+LOCAL_D const SFuncTableEntry defaultTable[]=
+	{
+		{ // prevent key up events generating keycodes
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyNull,
+			EAnyKey
+			},
+			{
+			EStateUnchanged,
+			EDoNothing,
+			0
+			}
+		},
+		{ // prevent any modifer key from changing state
+			{
+			0,
+			0
+			},
+			{
+			EKeyNull,
+			EAnyModifierKey
+			},
+			{
+			EStateUnchanged,
+			EDoNothing,
+			0
+			}
+		},
+		{ // filter out any unprocessed codes???
+			{
+			0,
+			0
+			},
+			{
+			EKeyNull,
+			EAnyKey
+			},
+			{
+			EStateNormal,
+			EDoNothing,
+			0
+			}
+		}
+	};
+
+// The table indicating which keys change which modifiers;
+// the state field in this table is ignored
+LOCAL_D const SFuncTableEntry modifierTable[]=
+	{
+        {
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyCapsLock,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			EToggleModifier,
+			EModifierCapsLock
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyNumLock,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			EToggleModifier,
+			EModifierNumLock
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyScrollLock,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			EToggleModifier,
+			EModifierScrollLock
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyLeftAlt,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierAlt|EModifierLeftAlt
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyLeftAlt,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierLeftAlt
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyLeftFunc,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierFunc|EModifierLeftFunc
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyLeftFunc,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierLeftFunc
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyLeftShift,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierShift|EModifierLeftShift
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyLeftShift,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierLeftShift
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyLeftCtrl,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierCtrl|EModifierLeftCtrl
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyLeftCtrl,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierLeftCtrl
+			}
+        },
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyRightAlt,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierAlt|EModifierRightAlt
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyRightAlt,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierRightAlt
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyRightFunc,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierFunc|EModifierRightFunc
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyRightFunc,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierRightFunc
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyRightShift,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierShift|EModifierRightShift
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyRightShift,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierRightShift
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyRightCtrl,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierCtrl|EModifierRightCtrl
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyRightCtrl,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierRightCtrl
+			}
+		}
+	};
+
+// table0 to table12 are the tables corresponding to states
+// 0 to 12 respectively
+
+LOCAL_D const SFuncTableEntry table0[]=
+	{
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table1[]=
+	{
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'e',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAe
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'c',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcCcedilla
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			's',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1EsTset
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'o',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcOslash
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'd',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcThorn
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			't',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcSoftTh
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'l',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LeftChevron
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'r',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1RightChevron
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'x',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1InvExclam
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'q',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1InvQuest
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'a',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAo
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'p',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1Pound
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table2[]=
+	{
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'a',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAumlaut
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'e',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcEumlaut
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'i',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcIumlaut
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'o',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcOumlaut
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'u',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcUumlaut
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'y',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcYumlaut
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			' ',
+			EMatchKey
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1SpaceUmlaut
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table3[]=
+	{
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'a',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAgrave
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'e',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcEgrave
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'i',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcIgrave
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'o',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcOgrave
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'u',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcUgrave
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			' ',
+			EMatchKey
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1SpaceGrave
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table4[]=
+	{
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'a',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAacute
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'e',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcEacute
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'i',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcIacute
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'o',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcOacute
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'u',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcUacute
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'y',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcYacute
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			' ',
+			EMatchKey
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcSpaceAcute
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table5[]=
+	{
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'a',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAtilde
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'n',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcNtilde
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'o',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcOtilde
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			' ',
+			EMatchKey
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcSpaceTilde
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table6[]=
+	{
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'a',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAcirc
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'e',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcEcirc
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'i',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcIcirc
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'o',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcOcirc
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'u',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcUcirc
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			' ',
+			EMatchKey
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcSpaceCirc
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table7[]=
+	{
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table8[]=
+	{
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table9[]=
+	{
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table10[]=
+	{
+		{ // check for ctrl-number presses
+			{
+			EModifierCtrl|EModifierFunc|EModifierKeyUp,
+			EModifierCtrl
+			},
+			{
+			EKeyNull,
+			EAnyDecimalDigit
+			},
+			{
+			EStateDerivedFromDigitEntered,
+			EAddOnCtrlDigit,
+			0
+			}
+		},
+		{ // filter out up key strokes
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyNull,
+			EAnyKey
+			},
+			{
+			EStateUnchanged,
+			EDoNothing,
+			0
+			}
+		},
+		{ // pass thru any non-processed keys
+			{
+			0,
+			0
+			},
+			{
+			EKeyNull,
+			EAnyKey
+			},
+			{
+			EStateUnchanged,
+			EPassKeyThru,
+			0
+			}
+		}
+	};
+
+//LOCAL_D const SFuncTableEntry table11[]=
+//	{
+//	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+//	};
+
+LOCAL_D const SFuncTableEntry table12[]=
+	{  
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyLeftCtrl,
+			EMatchLeftOrRight
+			},
+			{
+			EStateNormal,
+			EPassCtrlDigitsThru,
+			0
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTable genFuncTables[]=
+	{
+		{
+		ARRAY_LENGTH(table0),
+		&table0[0]
+		},
+		{
+		ARRAY_LENGTH(table1),
+		&table1[0]
+		},
+		{
+		ARRAY_LENGTH(table2),
+		&table2[0]
+		},
+		{
+		ARRAY_LENGTH(table3),
+		&table3[0]
+		},
+		{
+		ARRAY_LENGTH(table4),
+		&table4[0]
+		},
+		{
+		ARRAY_LENGTH(table5),
+		&table5[0]
+		},
+		{
+		ARRAY_LENGTH(table6),
+		&table6[0]
+		},
+		{
+		ARRAY_LENGTH(table7),
+		&table7[0]
+		},
+		{
+		ARRAY_LENGTH(table8),
+		&table8[0]
+		},
+		{
+		ARRAY_LENGTH(table9),
+		&table9[0]
+		},
+		{
+		ARRAY_LENGTH(table10),
+		&table10[0]
+		},
+		{
+		0,
+		NULL
+		},
+		{
+		ARRAY_LENGTH(table12),
+		&table12[0]
+		}
+	};
+
+LOCAL_D const SFuncTables FuncTables=
+	{
+		{
+		ARRAY_LENGTH(defaultTable),
+		&defaultTable[0]
+		},
+		{
+		ARRAY_LENGTH(modifierTable),
+		&modifierTable[0]
+		},
+	ARRAY_LENGTH(genFuncTables),
+	&genFuncTables[0]
+	};
+
+LOCAL_D const SScanCodeBlock scanCodeBlock_unmodifiable[]=
+	{
+	{EStdKeyLeftShift, EStdKeyScrollLock}
+	};
+
+LOCAL_D const TUint16 convKeyCodes_unmodifiable[]=
+	{
+	EKeyLeftShift,
+	EKeyRightShift,
+	EKeyLeftAlt,
+	EKeyRightAlt,
+	EKeyLeftCtrl,
+	EKeyRightCtrl,
+	EKeyLeftFunc,
+	EKeyRightFunc,
+	EKeyCapsLock,
+	EKeyNumLock,
+	EKeyScrollLock
+	};
+
+// base: this table traps all of the keyboard's scanCodes except those in convKeyCodes_unmodifiable
+LOCAL_D const SScanCodeBlock scanCodeBlock_base[]=
+	{
+	{EStdKeyNull, EStdKeyDownArrow},
+	{'0', '9'},
+	{'A', 'Z'},
+	{EStdKeyF1, EStdKeyDial},
+	{EStdKeyIncVolume, EStdKeyDecVolume},
+	{EStdKeyDevice0,EStdKeyDeviceF},
+	{EStdKeyApplication0, EStdKeyApplicationF},
+	{EStdKeyYes, EStdKeyDecBrightness},
+	{EStdKeyDevice10,EStdKeyDevice1F},
+	{EStdKeyApplication10, EStdKeyApplication1F},
+	{EStdKeyDevice20,EStdKeyDevice27},
+	{EStdKeyApplication20, EStdKeyApplication27}
+	};
+
+//
+//	This table is internatioalizable
+//
+LOCAL_D const TUint16 convKeyCodes_base[]=
+	{
+	EKeyNull,
+	EKeyBackspace,
+	EKeyTab,
+	EKeyEnter,
+	EKeyEscape,
+	' ',
+	EKeyPrintScreen,
+	EKeyPause,
+	EKeyHome,
+	EKeyEnd,
+	EKeyPageUp,
+	EKeyPageDown,
+	EKeyInsert,
+	EKeyDelete,
+	EKeyLeftArrow,
+	EKeyRightArrow,
+	EKeyUpArrow,
+	EKeyDownArrow,
+	'0',
+	'1',
+	'2',
+	'3',
+	'4',
+	'5',
+	'6',
+	'7',
+	'8',
+	'9',
+	'a',
+	'b',
+	'c',
+	'd',
+	'e',
+	'f',
+	'g',
+	'h',
+	'i',
+	'j',
+	'k',
+	'l',
+	'm',
+	'n',
+	'o',
+	'p',
+	'q',
+	'r',
+	's',
+	't',
+	'u',
+	'v',
+	'w',
+	'x',
+	'y',
+	'z',
+	EKeyF1,
+	EKeyF2,
+	EKeyF3,
+	EKeyF4,
+	EKeyF5,                 // Media change emulation
+    EKeyF6,
+    EKeyF7,
+    EKeyF8,					// Case close
+	EKeyF9,					// KeyOff
+    EKeyF10,                // SwitchOff
+    EKeyF11,                // Case open
+	EKeyF12,
+	EKeyF13,
+	EKeyF14,
+	EKeyF15,
+	EKeyF16,
+	EKeyF17,
+	EKeyF18,
+	EKeyF19,
+	EKeyF20,
+	EKeyF21,
+	EKeyF22,
+	EKeyF23,
+	EKeyF24,
+	'`',
+	',',
+	'.',
+	'/',
+	'\\',
+	';',
+	'\'',
+	'#',
+	'[',
+	']',
+	'-',
+	'=',
+	'/',
+	'*',
+	'-',
+	'+',
+	EKeyEnter,
+	EKeyEnd,
+	EKeyDownArrow,
+	EKeyPageDown,
+	EKeyLeftArrow,
+	EKeyNull, // numeric keypad '5'
+	EKeyRightArrow,
+	EKeyHome,
+	EKeyUpArrow,
+	EKeyPageUp,
+	EKeyInsert,
+	EKeyDelete,
+    EKeyMenu,
+    EKeyBacklightOn,
+    EKeyBacklightOff,
+    EKeyBacklightToggle,
+    EKeyIncContrast,
+    EKeyDecContrast,
+    EKeySliderDown,
+    EKeySliderUp,
+    EKeyDictaphonePlay,
+    EKeyDictaphoneStop,
+    EKeyDictaphoneRecord,
+    EKeyHelp,
+    EKeyOff,
+    EKeyDial,
+	EKeyIncVolume,
+	EKeyDecVolume,
+	EKeyDevice0,
+	EKeyDevice1,
+	EKeyDevice2,
+	EKeyDevice3,
+	EKeyDevice4,
+	EKeyDevice5,
+	EKeyDevice6,
+	EKeyDevice7,
+	EKeyDevice8,
+	EKeyDevice9,
+	EKeyDeviceA,
+	EKeyDeviceB,
+	EKeyDeviceC,
+	EKeyDeviceD,
+	EKeyDeviceE,
+	EKeyDeviceF,
+	EKeyApplication0,
+	EKeyApplication1,
+	EKeyApplication2,
+	EKeyApplication3,
+	EKeyApplication4,
+	EKeyApplication5,
+	EKeyApplication6,
+	EKeyApplication7,
+	EKeyApplication8,
+	EKeyApplication9,
+	EKeyApplicationA,
+	EKeyApplicationB,
+	EKeyApplicationC,
+	EKeyApplicationD,
+	EKeyApplicationE,
+	EKeyApplicationF,
+	EKeyYes,
+	EKeyNo,
+	EKeyIncBrightness,
+	EKeyDecBrightness,
+	EKeyDevice10,
+	EKeyDevice11,
+	EKeyDevice12,
+	EKeyDevice13,
+	EKeyDevice14,
+	EKeyDevice15,
+	EKeyDevice16,
+	EKeyDevice17,
+	EKeyDevice18,
+	EKeyDevice19,
+	EKeyDevice1A,
+	EKeyDevice1B,
+	EKeyDevice1C,
+	EKeyDevice1D,
+	EKeyDevice1E,
+	EKeyDevice1F,
+	EKeyApplication10,
+	EKeyApplication11,
+	EKeyApplication12,
+	EKeyApplication13,
+	EKeyApplication14,
+	EKeyApplication15,
+	EKeyApplication16,
+	EKeyApplication17,
+	EKeyApplication18,
+	EKeyApplication19,
+	EKeyApplication1A,
+	EKeyApplication1B,
+	EKeyApplication1C,
+	EKeyApplication1D,
+	EKeyApplication1E,
+	EKeyApplication1F,
+	EKeyDevice20,
+	EKeyDevice21,
+	EKeyDevice22,
+	EKeyDevice23,
+	EKeyDevice24,
+	EKeyDevice25,
+	EKeyDevice26,
+	EKeyDevice27,
+	EKeyApplication20,
+	EKeyApplication21,
+	EKeyApplication22,
+	EKeyApplication23,
+	EKeyApplication24,
+	EKeyApplication25,
+	EKeyApplication26,
+	EKeyApplication27
+	};
+
+// caps-lock: this table traps those scanCodes which are affected by caps-lock
+LOCAL_D const SScanCodeBlock scanCodeBlock_capsLock[]=
+	{
+	{'A', 'Z'}
+	};
+
+LOCAL_D const TUint16 convKeyCodes_capsLock[]=
+	{
+	'A',
+	'B',
+	'C',
+	'D',
+	'E',
+	'F',
+	'G',
+	'H',
+	'I',
+	'J',
+	'K',
+	'L',
+	'M',
+	'N',
+	'O',
+	'P',
+	'Q',
+	'R',
+	'S',
+	'T',
+	'U',
+	'V',
+	'W',
+	'X',
+	'Y',
+	'Z'
+	};
+
+// shift: this table traps those scanCodes which are affected
+// by shift EXCEPT for those scanCodes affected by caps-lock
+LOCAL_D const SScanCodeBlock scanCodeBlock_shift[]=
+	{
+	{'0', '9'},
+	{EStdKeyXXX, EStdKeyEquals},
+	};
+
+//
+//	This table is internatioalizable
+//
+LOCAL_D const TUint16 convKeyCodes_shift[]=
+	{
+	')',
+	'!',
+	'"',
+	ELatin1Pound,
+	'$',
+	'%',
+	'^',
+	'&',
+	'*',
+	'(',
+	ELatin1LogicNot,
+	'<',
+	'>',
+	'?',
+	'|',
+	':',
+	'@',
+	'~',
+	'{',
+	'}',
+	'_',
+	'+'
+	};
+
+// numlock: this table traps those scanCodes which are affected by numlock
+LOCAL_D const SScanCodeBlock scanCodeBlock_numLock[]=
+	{
+	{EStdKeyNkpForwardSlash, EStdKeyNkpFullStop}
+	};
+
+LOCAL_D const TUint16 convKeyCodes_numLock[]=
+	{
+	'/',
+	'*',
+	'-',
+	'+',
+	EKeyEnter,
+	'1',
+	'2',
+	'3',
+	'4',
+	'5',
+	'6',
+	'7',
+	'8',
+	'9',
+	'0',
+	'.'
+	};
+
+// ctrl: this table traps those scanCodes which are affected by ctrl
+LOCAL_D const SScanCodeBlock scanCodeBlock_ctrl[]=
+	{
+// The space key gets handled else where, otherwise it gets
+// thrown away as a NULL key
+//	{EStdKeySpace, EStdKeySpace},
+
+	{'A', 'Z'}
+	};
+
+LOCAL_D const TUint16 convKeyCodes_ctrl[]=
+	{
+//	0,
+	1,
+	2,
+	3,
+	4,
+	5,
+	6,
+	7,
+	8,
+	9,
+	10,
+	11,
+	12,
+	13,
+	14,
+	15,
+	16,
+	17,
+	18,
+	19,
+	20,
+	21,
+	22,
+	23,
+	24,
+	25,
+	26
+	};
+
+// Rotate by 90: this table traps those scancodes which are affected by the RotateBy90 modifier
+LOCAL_D const SScanCodeBlock scanCodeBlock_rotate[]=
+	{
+	{'Q', 'Q'},
+	{'W', 'W'},
+	{'E', 'E'},
+	{'A', 'A'},
+	{'S', 'S'},
+	{'D', 'D'},
+	{'Z', 'Z'},
+	{'X', 'X'},
+	{'C', 'C'},
+	};
+
+//rotate this 3x3 block of keys 90 degrees clockwise
+LOCAL_D const TUint16 convKeyCodes_rot90[]=
+	{
+	'z',
+	'a',
+	'q',
+	'x',
+	's',
+	'w',
+	'c',
+	'd',
+	'e',
+	};
+
+//rotate this 3x3 block of keys 180 degrees clockwise
+LOCAL_D const TUint16 convKeyCodes_rot180[]=
+	{
+	'c',
+	'x',
+	'z',
+	'd',
+	's',
+	'a',
+	'e',
+	'w',
+	'q',
+	};
+
+//rotate this 3x3 block of keys 90 degrees clockwise
+LOCAL_D const TUint16 convKeyCodes_rot270[]=
+	{
+	'e',
+	'd',
+	'c',
+	'w',
+	's',
+	'x',
+	'q',
+	'a',
+	'z',
+	};
+
+LOCAL_D const SConvSubTable
+	convSubTable_unmodifiable=
+		{
+		&convKeyCodes_unmodifiable[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_unmodifiable),
+			&scanCodeBlock_unmodifiable[0]
+			}
+		},
+    convSubTable_base=
+		{
+		&convKeyCodes_base[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_base),
+			&scanCodeBlock_base[0]
+			}
+		},
+	convSubTable_capsLock=
+		{
+		&convKeyCodes_capsLock[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_capsLock),
+			&scanCodeBlock_capsLock[0]
+			}
+		},
+	convSubTable_shift=
+		{
+		&convKeyCodes_shift[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_shift),
+			&scanCodeBlock_shift[0]
+			}
+		},
+	convSubTable_numLock=
+		{
+		&convKeyCodes_numLock[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_numLock),
+			&scanCodeBlock_numLock[0]
+			}
+        },
+	convSubTable_ctrl=
+		{
+		&convKeyCodes_ctrl[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_ctrl),
+			&scanCodeBlock_ctrl[0]
+			}
+		},
+	convSubTable_rot90=
+		{
+		&convKeyCodes_rot90[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_rotate),
+			&scanCodeBlock_rotate[0]
+			}
+		},	
+	convSubTable_rot180=
+		{
+		&convKeyCodes_rot180[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_rotate),
+			&scanCodeBlock_rotate[0]
+			}
+		},
+	convSubTable_rot270=
+		{
+		&convKeyCodes_rot270[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_rotate),
+			&scanCodeBlock_rotate[0]
+			}
+		};
+
+// Some modifiers, e.g. shift, may required more than one table (other than "base")
+// to be searched; therefore arrays of tables are required
+LOCAL_D const SConvSubTable
+	* const convSubTableArray_unmodifiable[]={&convSubTable_unmodifiable},
+	* const convSubTableArray_base[]={&convSubTable_base},
+	* const convSubTableArray_capsLock[]={&convSubTable_capsLock},
+	* const convSubTableArray_shift[]={&convSubTable_capsLock, &convSubTable_shift},
+	* const convSubTableArray_capsLockShift[]={&convSubTable_shift},
+	* const convSubTableArray_numLock[]={&convSubTable_numLock},
+	* const convSubTableArray_ctrl[]={&convSubTable_ctrl},
+	* const convSubTableArray_rot90[]={&convSubTable_rot90},
+	* const convSubTableArray_rot180[]={&convSubTable_rot180},
+	* const convSubTableArray_rot270[]={&convSubTable_rot270};
+
+// The order of these nodes is VITAL, as the scanCode/modifiers are
+// searched for a match in this order
+LOCAL_D const SConvTableNode convTableNodes[]=
+	{
+		{
+			{
+			0, /* iMask */
+			0  /* iValue */
+			}, /* maskedModifiers */
+		ARRAY_LENGTH(convSubTableArray_unmodifiable), /* numSubTables */
+		&convSubTableArray_unmodifiable[0]
+		}, /* pnodes[i] */
+		{
+			{
+			EModifierCtrl,
+			EModifierCtrl
+			},
+		ARRAY_LENGTH(convSubTableArray_ctrl),
+		&convSubTableArray_ctrl[0]
+		},
+		{
+			{
+			EModifierNumLock,
+			EModifierNumLock
+			},
+		ARRAY_LENGTH(convSubTableArray_numLock),
+		&convSubTableArray_numLock[0]
+		},
+		{
+			{
+			EModifierCapsLock|EModifierShift,
+			EModifierCapsLock
+			},
+		ARRAY_LENGTH(convSubTableArray_capsLock),
+		&convSubTableArray_capsLock[0]
+		},
+		{
+			{
+			EModifierShift|EModifierCapsLock,
+			EModifierShift
+			},
+		ARRAY_LENGTH(convSubTableArray_shift),
+		&convSubTableArray_shift[0]
+		},
+		{
+			{
+			EModifierCapsLock|EModifierShift,
+			EModifierCapsLock|EModifierShift
+			},
+		ARRAY_LENGTH(convSubTableArray_capsLockShift),
+		&convSubTableArray_capsLockShift[0]
+		},
+		{
+			{
+			EModifierRotateBy90,
+			EModifierRotateBy90
+			},
+		ARRAY_LENGTH(convSubTableArray_rot90),
+		&convSubTableArray_rot90[0]
+		},
+		{
+			{
+			EModifierRotateBy180,
+			EModifierRotateBy180
+			},
+		ARRAY_LENGTH(convSubTableArray_rot180),
+		&convSubTableArray_rot180[0]
+		},
+		{
+			{
+			EModifierRotateBy270,
+			EModifierRotateBy270
+			},
+		ARRAY_LENGTH(convSubTableArray_rot270),
+		&convSubTableArray_rot270[0]
+		},
+		{
+			{
+			0,
+			0
+			},
+		ARRAY_LENGTH(convSubTableArray_base),
+		&convSubTableArray_base[0]
+		}
+	};
+
+// The top-level exported data structure of all the conversion tables
+LOCAL_D const SConvTable ConvTable=
+	{
+	ARRAY_LENGTH(convTableNodes),
+	&convTableNodes[0]
+	};
+
+// The list of scan-codes on the numeric keypad
+LOCAL_D const SScanCodeBlock keypadScanCodeBlockArray[]=
+	{
+	{EStdKeyNumLock, EStdKeyNumLock},
+	{EStdKeyNkpForwardSlash, EStdKeyNkpFullStop}
+	};
+
+LOCAL_D const SScanCodeBlockList ConvTableKeypadScanCodes=
+	{
+	ARRAY_LENGTH(keypadScanCodeBlockArray),
+	&keypadScanCodeBlockArray[0]
+	};
+
+// The list of non-autorepeating key-codes
+LOCAL_D const TUint16 nonAutorepKeyCodeArray[]=
+	{
+	EKeyEscape,
+	EKeyPrintScreen,
+	EKeyPause,
+	EKeyInsert,
+	EKeyLeftShift,
+	EKeyRightShift,
+	EKeyLeftAlt,
+	EKeyRightAlt,
+	EKeyLeftCtrl,
+	EKeyRightCtrl,
+	EKeyLeftFunc,
+	EKeyRightFunc,
+	EKeyCapsLock,
+	EKeyNumLock,
+	EKeyScrollLock,
+    EKeyMenu,
+    EKeyDictaphonePlay,
+    EKeyDictaphoneStop,
+    EKeyDictaphoneRecord
+	};
+
+LOCAL_D const SKeyCodeList ConvTableNonAutorepKeyCodes=
+	{
+	ARRAY_LENGTH(nonAutorepKeyCodeArray),
+	&nonAutorepKeyCodeArray[0]
+	};
+
+EXPORT_C void KeyDataSettings(TRadix &aRadix,TCtrlDigitsTermination &aCtrlDigitsTermination,TInt &aDefaultCtrlDigitsMaxCount,
+							  TInt &aMaximumCtrlDigitsMaxCount)
+	{
+	aRadix=EDecimal;
+	aCtrlDigitsTermination=ETerminationByCtrlUp;
+	aDefaultCtrlDigitsMaxCount=3;
+	aMaximumCtrlDigitsMaxCount=10;
+	}
+
+EXPORT_C void KeyDataFuncTable(SFuncTables &aFuncTables)
+	{
+	aFuncTables=FuncTables;
+	}
+
+EXPORT_C void KeyDataConvTable(SConvTable &aConvTable, TUint &aConvTableFirstScanCode,TUint &aConvTableLastScanCode,
+							 SScanCodeBlockList &aKeypadScanCode,SKeyCodeList &aNonAutorepKeyCodes)
+	{
+	aConvTable=ConvTable;
+	aConvTableFirstScanCode=scanCodeBlock_base[0].firstScanCode;
+	aConvTableLastScanCode=scanCodeBlock_base[ARRAY_LENGTH(scanCodeBlock_base)-1].lastScanCode;
+	aKeypadScanCode=ConvTableKeypadScanCodes;
+	aNonAutorepKeyCodes=ConvTableNonAutorepKeyCodes;
+	}