Update contrib.
1 // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
14 // wins\specific\keyboard.cpp
29 inline KeySet(const SEntry aMap[], TInt aSize)
30 :iMap(aMap), iSize(aSize)
32 TInt operator[](const TDesC8& aName) const;
39 const TUint8 StandardKeyMap[KStandardKeyMapSize]=
67 EStdKeySquareBracketLeft,
68 EStdKeySquareBracketRight,
97 EStdKeyLeftFunc, // Alt key used as Func Key
132 const TUint8 ExtendedKeyMap[]=
142 // EStdKeyRightArrow,
149 /*1c*/ EStdKeyNkpEnter,
150 /*1d*/ EStdKeyRightCtrl,
174 /*35*/ EStdKeyNkpForwardSlash,
176 /*37*/ EStdKeyPrintScreen, // Actually e0 2a e0 37
177 /*38*/ EStdKeyRightFunc,
190 /*45*/ EStdKeyNumLock,
193 /*48*/ EStdKeyUpArrow,
194 /*49*/ EStdKeyPageUp,
196 /*4b*/ EStdKeyLeftArrow,
198 /*4d*/ EStdKeyRightArrow,
201 /*50*/ EStdKeyDownArrow,
202 /*51*/ EStdKeyPageDown,
203 /*52*/ EStdKeyInsert,
204 /*53*/ EStdKeyDelete,
212 /*5b*/ EStdKeyLeftAlt, //left windows key
213 /*5c*/ EStdKeyMenu, //right windows key
214 /*5d*/ EStdKeyHelp //right mouse button key
218 const KeySet::SEntry EPOCKeyNameToKeyMap[] =
220 {"EStdKeyNull",EStdKeyNull},
221 {"EStdKeyBackspace",EStdKeyBackspace},
222 {"EStdKeyTab",EStdKeyTab},
223 {"EStdKeyEnter",EStdKeyEnter},
224 {"EStdKeyEscape",EStdKeyEscape},
225 {"EStdKeySpace",EStdKeySpace},
226 {"EStdKeyPrintScreen",EStdKeyPrintScreen},
227 {"EStdKeyPause",EStdKeyPause},
228 {"EStdKeyHome",EStdKeyHome},
229 {"EStdKeyEnd",EStdKeyEnd},
230 {"EStdKeyPageUp",EStdKeyPageUp},
231 {"EStdKeyPageDown",EStdKeyPageDown},
232 {"EStdKeyInsert",EStdKeyInsert},
233 {"EStdKeyDelete",EStdKeyDelete},
234 {"EStdKeyLeftArrow",EStdKeyLeftArrow},
235 {"EStdKeyRightArrow",EStdKeyRightArrow},
236 {"EStdKeyUpArrow",EStdKeyUpArrow},
237 {"EStdKeyDownArrow",EStdKeyDownArrow},
238 {"EStdKeyLeftShift",EStdKeyLeftShift},
239 {"EStdKeyRightShift",EStdKeyRightShift},
240 {"EStdKeyLeftAlt",EStdKeyLeftAlt},
241 {"EStdKeyRightAlt",EStdKeyRightAlt},
242 {"EStdKeyLeftCtrl",EStdKeyLeftCtrl},
243 {"EStdKeyRightCtrl",EStdKeyRightCtrl},
244 {"EStdKeyLeftFunc",EStdKeyLeftFunc},
245 {"EStdKeyRightFunc",EStdKeyRightFunc},
246 {"EStdKeyCapsLock",EStdKeyCapsLock},
247 {"EStdKeyNumLock",EStdKeyNumLock},
248 {"EStdKeyScrollLock",EStdKeyScrollLock},
249 {"EStdKeyF1",EStdKeyF1},
250 {"EStdKeyF2",EStdKeyF2},
251 {"EStdKeyF3",EStdKeyF3},
252 {"EStdKeyF4",EStdKeyF4},
253 {"EStdKeyF5",EStdKeyF5},
254 {"EStdKeyF6",EStdKeyF6},
255 {"EStdKeyF7",EStdKeyF7},
256 {"EStdKeyF8",EStdKeyF8},
257 {"EStdKeyF9",EStdKeyF9},
258 {"EStdKeyF10",EStdKeyF10},
259 {"EStdKeyF11",EStdKeyF11},
260 {"EStdKeyF12",EStdKeyF12},
261 {"EStdKeyF13",EStdKeyF13},
262 {"EStdKeyF14",EStdKeyF14},
263 {"EStdKeyF15",EStdKeyF15},
264 {"EStdKeyF16",EStdKeyF16},
265 {"EStdKeyF17",EStdKeyF17},
266 {"EStdKeyF18",EStdKeyF18},
267 {"EStdKeyF19",EStdKeyF19},
268 {"EStdKeyF20",EStdKeyF20},
269 {"EStdKeyF21",EStdKeyF21},
270 {"EStdKeyF22",EStdKeyF22},
271 {"EStdKeyF23",EStdKeyF23},
272 {"EStdKeyF24",EStdKeyF24},
273 {"EStdKeyXXX",EStdKeyXXX},
274 {"EStdKeyComma",EStdKeyComma},
275 {"EStdKeyFullStop",EStdKeyFullStop},
276 {"EStdKeyForwardSlash",EStdKeyForwardSlash},
277 {"EStdKeyBackSlash",EStdKeyBackSlash},
278 {"EStdKeySemiColon",EStdKeySemiColon},
279 {"EStdKeySingleQuote",EStdKeySingleQuote},
280 {"EStdKeyHash",EStdKeyHash},
281 {"EStdKeySquareBracketLeft",EStdKeySquareBracketLeft},
282 {"EStdKeySquareBracketRight",EStdKeySquareBracketRight},
283 {"EStdKeyMinus",EStdKeyMinus},
284 {"EStdKeyEquals",EStdKeyEquals},
285 {"EStdKeyNkpForwardSlash",EStdKeyNkpForwardSlash},
286 {"EStdKeyNkpAsterisk",EStdKeyNkpAsterisk},
287 {"EStdKeyNkpMinus",EStdKeyNkpMinus},
288 {"EStdKeyNkpPlus",EStdKeyNkpPlus},
289 {"EStdKeyNkpEnter",EStdKeyNkpEnter},
290 {"EStdKeyNkp1",EStdKeyNkp1},
291 {"EStdKeyNkp2",EStdKeyNkp2},
292 {"EStdKeyNkp3",EStdKeyNkp3},
293 {"EStdKeyNkp4",EStdKeyNkp4},
294 {"EStdKeyNkp5",EStdKeyNkp5},
295 {"EStdKeyNkp6",EStdKeyNkp6},
296 {"EStdKeyNkp7",EStdKeyNkp7},
297 {"EStdKeyNkp8",EStdKeyNkp8},
298 {"EStdKeyNkp9",EStdKeyNkp9},
299 {"EStdKeyNkp0",EStdKeyNkp0},
300 {"EStdKeyNkpFullStop",EStdKeyNkpFullStop},
301 {"EStdKeyMenu",EStdKeyMenu},
302 {"EStdKeyBacklightOn",EStdKeyBacklightOn},
303 {"EStdKeyBacklightOff",EStdKeyBacklightOff},
304 {"EStdKeyBacklightToggle",EStdKeyBacklightToggle},
305 {"EStdKeyIncContrast",EStdKeyIncContrast},
306 {"EStdKeyDecContrast",EStdKeyDecContrast},
307 {"EStdKeySliderDown",EStdKeySliderDown},
308 {"EStdKeySliderUp",EStdKeySliderUp},
309 {"EStdKeyDictaphonePlay",EStdKeyDictaphonePlay},
310 {"EStdKeyDictaphoneStop",EStdKeyDictaphoneStop},
311 {"EStdKeyDictaphoneRecord",EStdKeyDictaphoneRecord},
312 {"EStdKeyHelp",EStdKeyHelp},
313 {"EStdKeyOff",EStdKeyOff},
314 {"EStdKeyDial",EStdKeyDial},
315 {"EStdKeyIncVolume",EStdKeyIncVolume},
316 {"EStdKeyDecVolume",EStdKeyDecVolume},
317 {"EStdKeyDevice0",EStdKeyDevice0},
318 {"EStdKeyDevice1",EStdKeyDevice1},
319 {"EStdKeyDevice2",EStdKeyDevice2},
320 {"EStdKeyDevice3",EStdKeyDevice3},
321 {"EStdKeyDevice4",EStdKeyDevice4},
322 {"EStdKeyDevice5",EStdKeyDevice5},
323 {"EStdKeyDevice6",EStdKeyDevice6},
324 {"EStdKeyDevice7",EStdKeyDevice7},
325 {"EStdKeyDevice8",EStdKeyDevice8},
326 {"EStdKeyDevice9",EStdKeyDevice9},
327 {"EStdKeyDeviceA",EStdKeyDeviceA},
328 {"EStdKeyDeviceB",EStdKeyDeviceB},
329 {"EStdKeyDeviceC",EStdKeyDeviceC},
330 {"EStdKeyDeviceD",EStdKeyDeviceD},
331 {"EStdKeyDeviceE",EStdKeyDeviceE},
332 {"EStdKeyDeviceF",EStdKeyDeviceF},
333 {"EStdKeyDevice10",EStdKeyDevice10},
334 {"EStdKeyDevice11",EStdKeyDevice11},
335 {"EStdKeyDevice12",EStdKeyDevice12},
336 {"EStdKeyDevice13",EStdKeyDevice13},
337 {"EStdKeyDevice14",EStdKeyDevice14},
338 {"EStdKeyDevice15",EStdKeyDevice15},
339 {"EStdKeyDevice16",EStdKeyDevice16},
340 {"EStdKeyDevice17",EStdKeyDevice17},
341 {"EStdKeyDevice18",EStdKeyDevice18},
342 {"EStdKeyDevice19",EStdKeyDevice19},
343 {"EStdKeyDevice1A",EStdKeyDevice1A},
344 {"EStdKeyDevice1B",EStdKeyDevice1B},
345 {"EStdKeyDevice1C",EStdKeyDevice1C},
346 {"EStdKeyDevice1D",EStdKeyDevice1D},
347 {"EStdKeyDevice1E",EStdKeyDevice1E},
348 {"EStdKeyDevice1F",EStdKeyDevice1F},
349 {"EStdKeyDevice20",EStdKeyDevice20},
350 {"EStdKeyDevice21",EStdKeyDevice21},
351 {"EStdKeyDevice22",EStdKeyDevice22},
352 {"EStdKeyDevice23",EStdKeyDevice23},
353 {"EStdKeyDevice24",EStdKeyDevice24},
354 {"EStdKeyDevice25",EStdKeyDevice25},
355 {"EStdKeyDevice26",EStdKeyDevice26},
356 {"EStdKeyDevice27",EStdKeyDevice27},
357 {"EStdKeyApplication0",EStdKeyApplication0},
358 {"EStdKeyApplication1",EStdKeyApplication1},
359 {"EStdKeyApplication2",EStdKeyApplication2},
360 {"EStdKeyApplication3",EStdKeyApplication3},
361 {"EStdKeyApplication4",EStdKeyApplication4},
362 {"EStdKeyApplication5",EStdKeyApplication5},
363 {"EStdKeyApplication6",EStdKeyApplication6},
364 {"EStdKeyApplication7",EStdKeyApplication7},
365 {"EStdKeyApplication8",EStdKeyApplication8},
366 {"EStdKeyApplication9",EStdKeyApplication9},
367 {"EStdKeyApplicationA",EStdKeyApplicationA},
368 {"EStdKeyApplicationB",EStdKeyApplicationB},
369 {"EStdKeyApplicationC",EStdKeyApplicationC},
370 {"EStdKeyApplicationD",EStdKeyApplicationD},
371 {"EStdKeyApplicationE",EStdKeyApplicationE},
372 {"EStdKeyApplicationF",EStdKeyApplicationF},
373 {"EStdKeyApplication10",EStdKeyApplication10},
374 {"EStdKeyApplication11",EStdKeyApplication11},
375 {"EStdKeyApplication12",EStdKeyApplication12},
376 {"EStdKeyApplication13",EStdKeyApplication13},
377 {"EStdKeyApplication14",EStdKeyApplication14},
378 {"EStdKeyApplication15",EStdKeyApplication15},
379 {"EStdKeyApplication16",EStdKeyApplication16},
380 {"EStdKeyApplication17",EStdKeyApplication17},
381 {"EStdKeyApplication18",EStdKeyApplication18},
382 {"EStdKeyApplication19",EStdKeyApplication19},
383 {"EStdKeyApplication1A",EStdKeyApplication1A},
384 {"EStdKeyApplication1B",EStdKeyApplication1B},
385 {"EStdKeyApplication1C",EStdKeyApplication1C},
386 {"EStdKeyApplication1D",EStdKeyApplication1D},
387 {"EStdKeyApplication1E",EStdKeyApplication1E},
388 {"EStdKeyApplication1F",EStdKeyApplication1F},
389 {"EStdKeyApplication20",EStdKeyApplication20},
390 {"EStdKeyApplication21",EStdKeyApplication21},
391 {"EStdKeyApplication22",EStdKeyApplication22},
392 {"EStdKeyApplication23",EStdKeyApplication23},
393 {"EStdKeyApplication24",EStdKeyApplication24},
394 {"EStdKeyApplication25",EStdKeyApplication25},
395 {"EStdKeyApplication26",EStdKeyApplication26},
396 {"EStdKeyApplication27",EStdKeyApplication27},
397 {"EStdKeyYes",EStdKeyYes},
398 {"EStdKeyNo",EStdKeyNo},
399 {"EStdKeyIncBrightness",EStdKeyIncBrightness},
400 {"EStdKeyDecBrightness",EStdKeyDecBrightness},
437 {"EKeyScreenDimension0",EKeyScreenDimension0<<16},
438 {"EKeyScreenDimension1",EKeyScreenDimension1<<16},
439 {"EKeyScreenDimension2",EKeyScreenDimension2<<16},
440 {"EKeyScreenDimension3",EKeyScreenDimension3<<16}
443 const KeySet::SEntry RealKeyNames[] =
470 {"SquareBracketLeft",26},
471 {"SquareBracketRight",27},
500 {"LeftAlt",56}, // Alt key used as Func Key
533 const KeySet::SEntry RealExtendedKeyNames[] =
537 {"NkpForwardSlash", 25},
556 const KeySet EpocKeys(EPOCKeyNameToKeyMap, sizeof(EPOCKeyNameToKeyMap)/sizeof(KeySet::SEntry));
557 const KeySet StandardKeys(RealKeyNames, sizeof(RealKeyNames)/sizeof(KeySet::SEntry));
558 const KeySet ExtendedKeys(RealExtendedKeyNames, sizeof(RealExtendedKeyNames)/sizeof(KeySet::SEntry));
560 TInt KeySet::operator[](const TDesC8& aName) const
562 TInt len = aName.Length();
563 const char* p = (const char*)aName.Ptr();
564 for (const SEntry* e = iMap + iSize; --e >= iMap; )
566 if (_strnicmp(e->iName, p, len) == 0 && e->iName[len] == '\0')
578 TInt Alias::Add(const TDesC8& aAlias, const TDesC8& aName)
583 TInt r = KErrNoMemory;
585 e.iAlias = HBuf8::New(aAlias);
588 e.iName = HBuf8::New(aName);
591 r = iMap.InsertInOrder(e, &Alias::Compare);
601 const TDesC8* Alias::operator[](const TDesC8& aAlias)
607 e.iAlias = const_cast<TDesC8*>(&aAlias);
608 TInt ix = iMap.FindInOrder(e, &Alias::Compare);
609 return ix >= 0 ? iMap[ix].iName : NULL;
612 TInt Alias::Compare(const SEntry& aLhs, const SEntry& aRhs)
614 return CompareI(*aLhs.iAlias, *aRhs.iAlias);
621 DWinsKeyboard::DWinsKeyboard()
623 memcpy(iStandardKeyMap, StandardKeyMap, KStandardKeyMapSize);
624 memcpy(iExtendedKeyMap, ExtendedKeyMap, KExtendedKeyMapSize);
625 memcpy(iAltStandardKeyMap, StandardKeyMap, KStandardKeyMapSize);
626 memcpy(iAltExtendedKeyMap, ExtendedKeyMap, KExtendedKeyMapSize);
627 memcpy(iCtrlStandardKeyMap, StandardKeyMap, KStandardKeyMapSize);
628 memcpy(iCtrlExtendedKeyMap, ExtendedKeyMap, KExtendedKeyMapSize);
631 TInt DWinsKeyboard::Init(TInt aId)
633 // Initialise the alias and key maps from the properties
637 wsprintfA(property, "Configuration[%d]DefineKeyName",aId);
638 TInt r = MultiProperty(&DWinsKeyboard::DoDefineAlias, this, property);
641 wsprintfA(property, "Configuration[%d]KeyMap",aId);
642 r = MultiProperty(&DWinsKeyboard::DoMapKey, this, property);
646 TInt DWinsKeyboard::DoDefineAlias(TAny* aPtr, const char* aValue)
648 return static_cast<DWinsKeyboard*>(aPtr)->DefineAlias(aValue);
651 TInt DWinsKeyboard::DefineAlias(const char* aValue)
653 // The character string terminates in a ';' or a '\0'
657 const char* beg = skipws(aValue);
658 const char* end = skiptok(beg);
659 TPtrC8 alias((const TUint8*)beg, end-beg);
664 TPtrC8 name((const TUint8*)beg, end-beg);
666 //prevent an alias being made of an alias
667 if (iAliasedKeys[name] != NULL)
670 // ensure this is valid name
671 TInt r = GetEPOCKeyCode(name);
672 if (r == KErrNotFound)
675 //now we need to record the alias name and the real key name
676 return iAliasedKeys.Add(alias, name);
680 TInt DWinsKeyboard::DoMapKey(TAny* aPtr, const char* aValue)
682 return static_cast<DWinsKeyboard*>(aPtr)->MapKey(aValue);
685 TInt DWinsKeyboard::MapKey(const char* aValue)
688 const char* beg = skipws(aValue);
689 const char* end = skiptok(beg);
691 // check to see if a modifier key has been specified
692 TBool altModifier = !_strnicmp(beg, "LeftAlt", 7);
693 altModifier |= !_strnicmp(beg, "RightAlt", 8);
694 TBool ctrlModifier = !_strnicmp(beg, "LeftCtrl", 8);
695 ctrlModifier |= !_strnicmp(beg, "RightCtrl", 9);
697 // if modifier was found, skip to next token
698 if (altModifier || ctrlModifier)
704 TPtrC8 name((const TUint8*)beg, end-beg);
709 TInt key = GetEPOCKeyCode(TPtrC8((const TUint8*)beg, end-beg));
710 if (key == KErrNotFound)
713 TInt scancode = StandardKeys[name];
715 // if alt modifier was specified, change the alt key map
719 iAltStandardKeyMap[scancode] = (TUint8)key;
722 scancode = ExtendedKeys[name];
724 iAltExtendedKeyMap[scancode] = (TUint8)key;
730 // if ctrl modifier was specified, change the ctrl key map
731 else if (ctrlModifier)
734 iCtrlStandardKeyMap[scancode] = (TUint8)key;
737 scancode = ExtendedKeys[name];
739 iCtrlExtendedKeyMap[scancode] = (TUint8)key;
745 // no modifier, change the default key map
749 iStandardKeyMap[scancode] = (TUint8)key;
752 scancode = ExtendedKeys[name];
754 iExtendedKeyMap[scancode] = (TUint8)key;
763 TInt DWinsKeyboard::GetEPOCKeyCode(const TDesC8& aStr)
766 const TDesC8* arg = iAliasedKeys[aStr];
767 return EpocKeys[arg ? *arg : aStr];
770 TInt DWinsKeyboard::ScanCodeToKey(TInt aScanCode, const TUint8* aStandardMap, const TUint8* aExtendedMap)
772 // Map Windows scan codes to Epoc key
775 TInt stdCode = EStdKeyNull;
776 TInt extended = aScanCode&KKeyExtendedBit;
777 aScanCode &= KKeyNormalBits;
780 if (aScanCode >= KExtendedKeyBase && aScanCode <= KMaxExtendedKey)
781 stdCode = aExtendedMap[aScanCode - KExtendedKeyBase];
783 else if (aScanCode < KStandardKeyMapSize)
784 stdCode = aStandardMap[aScanCode];
788 TInt DWinsKeyboard::ScanCodeToStandardKey(TInt aScanCode)
790 // Map Windows scan codes to standard keys
793 return ScanCodeToKey(aScanCode, StandardKeyMap, ExtendedKeyMap );
796 TInt DWinsKeyboard::ScanCodeToRemappedKey(TInt aScanCode)
798 // Map Windows scan codes to remapped keys
801 if (HIBYTE(GetKeyState(VK_MENU))) // Alt key is pressed
802 return ScanCodeToKey(aScanCode, iAltStandardKeyMap, iAltExtendedKeyMap );
804 if (HIBYTE(GetKeyState(VK_CONTROL))) // Ctrl key is pressed
805 return ScanCodeToKey(aScanCode, iCtrlStandardKeyMap, iCtrlExtendedKeyMap );
807 return ScanCodeToKey(aScanCode, iStandardKeyMap, iExtendedKeyMap );
813 TInt DWinsKeyboard::GetScanCode(const TDesC8& aStr)
815 return StandardKeys[aStr];