diff -r 0ba996a9b75d -r 613943a21004 bluetoothengine/bthid/keyboard/src/keyboard.cpp --- a/bluetoothengine/bthid/keyboard/src/keyboard.cpp Thu Aug 19 10:05:41 2010 +0300 +++ b/bluetoothengine/bthid/keyboard/src/keyboard.cpp Tue Aug 31 15:25:10 2010 +0300 @@ -23,9 +23,6 @@ #include #include #include -#include -#include -#include #include "hidtranslate.h" #include "finder.h" @@ -53,28 +50,6 @@ const TInt KKeyRepeatDelay = 500000; const TInt KKeyRepeatInterval = 75000; - -// The bitmap of modifier byte is defined in the HID spec. -// 8.3 Report Format for Array Items (HID1_11.pdf p56) -// -// bit description mask -// ------------------------- -// 0 LEFT CTRL = 0x01 -// 1 LEFT SHIFT = 0x02 -// 2 LEFT ALT = 0x04 -// 3 LEFT GUI = 0x08 -// 4 RIGHT CTRL = 0x10 -// 5 RIGHT SHIFT = 0x20 -// 6 RIGHT ALT = 0x40 -// 7 RIGHT GUI = 0x80 - -const TUint KHidModifierCtrl = 0x01; -const TUint KHidModifierCtrlRight = 0x10; -const TUint KHidModifierAlt = 0x04; -const TUint KHidModifierAltRight = 0x40; -const TUint KHidModifierShift = 0x02; -const TUint KHidModifierShiftRight = 0x20; - //---------------------------------------------------------------------------- // CHidKeyboardDriver::CHidKeyboardDriver //---------------------------------------------------------------------------- @@ -135,11 +110,6 @@ iIdleAppId = IdleAppId(); iSettings = CBtHidSettings::NewL(); - - // create a keylock session - TInt err = iKeyLock.Connect(); - TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::ConstructL: key lock err = %d"), err)); - User::LeaveIfError(err); } //---------------------------------------------------------------------------- @@ -163,8 +133,6 @@ if (iSettings) delete iSettings; - - iKeyLock.Close(); } //---------------------------------------------------------------------------- @@ -175,7 +143,6 @@ { TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::StartL"))); aConnectionId = aConnectionId; - // No keys are pressed: iModifiers = 0; for (TInt i = 0; i < KNumInputFieldTypes; ++i) @@ -528,7 +495,8 @@ //check if the key is multimedia key that needs to be sent as RawEvent and send it. // if key event is consumed don't send it anymore. - if (!HandleKeyMapping(decodedKeys, aIsKeyDown, iModifiers)) + if (!HandleMultimediaKeys(decodedKeys.iScanCode, aIsKeyDown, + iModifiers)) //check if the key is multimedia key that needs to be sent as RawEvent and send it. { if (decodedKeys.iScanCode != EStdKeyNull) { @@ -547,8 +515,7 @@ //Send key codes differently to idle app if ((IsDigitKey(decodedKeys.iScanCode) || IsSpecialHandleKey( unikey) || decodedKeys.iScanCode == EStdKeyYes - || decodedKeys.iScanCode == EStdKeyBackspace - || decodedKeys.iScanCode == EStdKeyNo) + || decodedKeys.iScanCode == EStdKeyBackspace) && IsPhoneAppTopMost()) { TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::KeyEvent: Send event %c to idle editor"), unikey)); @@ -1189,6 +1156,17 @@ TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::WindowGroupForKeyEvent: type %d, kc 0x%08x, sc 0x%08x, mod 0x%06x, rep %d]"), aType, aKeyEvent.iCode, aKeyEvent.iScanCode, aKeyEvent.iModifiers, aKeyEvent.iRepeats)); + _LIT(KBackDrop, "*EiksrvBackdrop*"); + + if (EStdKeyApplication0 == aKeyEvent.iScanCode && (EEventKeyDown == aType + || EEventKeyUp == aType)) + { + // Application key up/down events go to the Eikon server + // Use this old way for application key + TInt result = iWsSession.FindWindowGroupIdentifier(0, KBackDrop); //This was in A2.x __EIKON_SERVER_NAME + DBG(if (KErrNotFound == result) RDebug::Print(_L("[HID]\tCHidKeyboardDriver::WindowGroupForKeyEvent(): BackDropWindowGroup Name not found!"))); + return result; + } if (EKeyDevice2 == aKeyEvent.iCode && EEventKey == aType) { @@ -1369,33 +1347,7 @@ void CHidKeyboardDriver::LaunchApplicationL(TInt aAppUid) { TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::LaunchApplication: UID 0x%08x"), aAppUid)); - - //KeyLock or phone auto lock is on, refuse to continue - if (iKeyLock.IsKeyLockEnabled()) - { - TRACE_INFO( _L("[HID]\tCHidKeyboardDriver::LaunchApplicationL() SKIPPED BECAUSE OF KEYLOCK")); - return; - } - - TInt devLockStatus( EAutolockStatusUninitialized ); - TInt err = RProperty::Get( KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, devLockStatus ); - - if (!err) - { - if ( EAutolockOff != devLockStatus && EAutolockStatusUninitialized != devLockStatus) - { - //Auto lock is on, refuse to continue - TRACE_INFO( _L("[HID]\tCHidKeyboardDriver::LaunchApplicationL() SKIPPED BECAUSE OF AUTO LOCK")); - return; - } - } - else - { - //failed to get AUTO LOCK status - TRACE_INFO( _L("[HID]\tCHidKeyboardDriver::LaunchApplicationL() SKIPPED BECAUSE OF FAILED TO GET AUTO LOCK STATUS")); - return; - } - + TApaTaskList taskList(iWsSession); TUid uid = TUid::Uid(aAppUid); TApaTask task = taskList.FindApp(uid); @@ -1447,616 +1399,17 @@ //---------------------------------------------------------------------------- // -TBool CHidKeyboardDriver::HandleKeyMapping(TDecodedKeyInfo& aKey, - TBool aIsKeyDown, - TUint8 aHIDModifiers) +TBool CHidKeyboardDriver::HandleMultimediaKeys(TUint16 aScancodeKey, + TBool aIsKeyDown, TUint8 aHIDModifiers) { - TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleKeyMapping"))); - - TBool ret = EFalse; - - switch (aKey.iScanCode) - { - case EStdKeyUpArrow: - { - ret = HandleKeyMappingUp(aKey, aIsKeyDown, aHIDModifiers); - break; - } - case EStdKeyDownArrow: - { - ret = HandleKeyMappingDown(aKey, aIsKeyDown, aHIDModifiers); - break; - } - case EStdKeyLeftArrow: - { - ret = HandleKeyMappingLeft(aKey, aIsKeyDown, aHIDModifiers); - break; - } - case EStdKeyRightArrow: - { - ret = HandleKeyMappingRight(aKey, aIsKeyDown, aHIDModifiers); - break; - } - case EStdKeyEscape: - // fall through - case EStdKeyF8: - // fall through - case EStdKeyApplication0: - // fall through - case EStdKeyApplication2: - // fall through - case EStdKeyApplication3: - // fall through - case EStdKeyF9: - // break; - case EStdKeyApplication4: - // fall through - case EStdKeyF7: - // fall through - case EStdKeyApplication5: - // fall through - case EStdKeyF12: - // fall through - case EStdKeyIncVolume: - // fall through - case EStdKeyF11: - // fall through - case EStdKeyDecVolume: - // fall through - case EStdKeyF10: - { - ret = HandleKeyMappingOther(aKey, aIsKeyDown, aHIDModifiers); - break; - } - default: - { - // no actions for these keys - break; - } - } - - return ret; - } - -// ---------------------------------------------------------------------- -// CHidKeyboardDriver::HandleKeyMappingUp -// Handle key mapping gor UP + MODIFIER -// ---------------------------------------------------------------------- -// -TBool CHidKeyboardDriver::HandleKeyMappingUp(TDecodedKeyInfo& aKey, - TBool aIsKeyDown, - TUint8 aHIDModifiers) - { - TRACE_INFO((_L("[HID]\tCHidKeyboardDriver::HandleKeyMappingUp"))); - - TBool ret = EFalse; - TInt scancode = 0; - TUint modifier = 0; - TBool isMmKey = EFalse; - TMmKeyDown bitmapToReset = ENone; - - switch (aKey.iScanCode) - { - case EStdKeyUpArrow: - { - // Key up and send key was emulated - if (!aIsKeyDown && - iNavKeyDown & ESend) - { - TRACE_INFO((_L("[HID]\tCTRL + UP >>> SEND KEY UP"))); - - aKey.iScanCode = EStdKeyYes; - TTranslatedKey& key = aKey.iEvent[0]; - key.iIsRepeatingKey = aIsKeyDown; - key.iScanCode = EStdKeyYes; - key.iUnicode = EKeyYes; - - iNavKeyDown = (iNavKeyDown & !ESend); - } - - //CTRL = Send key - else if (aIsKeyDown && - aHIDModifiers & (KHidModifierCtrl | KHidModifierCtrlRight)) - { - TRACE_INFO((_L("[HID]\tCTRL + UP >>> SEND KEY DOWN"))); - - aKey.iScanCode = EStdKeyYes; - aKey.iCount = 1; - TTranslatedKey& key = aKey.iEvent[0]; - key.iIsRepeatingKey = aIsKeyDown; - key.iScanCode = EStdKeyYes; - key.iUnicode = EKeyYes; - - iNavKeyDown = (iNavKeyDown | ESend); - } - - //ALT = Stop - else if (aHIDModifiers & (KHidModifierAlt | KHidModifierAltRight) || - iMmKeyDown & EStop) - { - TRACE_INFO((_L("[HID]\tALT + UP >>> STOP"))); - - scancode = EStdKeyApplication3; - isMmKey = ETrue; - bitmapToReset = EStop; - } + TBool ret = HandleMultimediaKeysForNokia(aScancodeKey, aIsKeyDown, + aHIDModifiers); - //SHIFT = Volume up - else if (aHIDModifiers & (KHidModifierShift | KHidModifierShiftRight) || - iMmKeyDown & EVolUp) - { - TRACE_INFO((_L("[HID]\tSHIFT + UP >>> VOLUME UP"))); - - scancode = EStdKeyIncVolume; - isMmKey = ETrue; - bitmapToReset = EVolUp; - } - break; - } - default: - { - // no actions - break; - } - } - - if (isMmKey) - { - if (bitmapToReset) - { - ResetBitmap(aIsKeyDown, bitmapToReset); - } - SendRawEvent(scancode, aIsKeyDown, modifier); - ret = ETrue; - } - - return ret; - } - -// ---------------------------------------------------------------------- -// CHidKeyboardDriver::HandleKeyMappingDown -// Handle key mapping gor DOWN + MODIFIER -// ---------------------------------------------------------------------- -// -TBool CHidKeyboardDriver::HandleKeyMappingDown(TDecodedKeyInfo& aKey, - TBool aIsKeyDown, - TUint8 aHIDModifiers) - { - TRACE_INFO((_L("[HID]\tCHidKeyboardDriver::HandleKeyMappingDown"))); - - TBool ret = EFalse; - TInt scancode = 0; - TUint modifier = 0; - TBool isMmKey = EFalse; - TMmKeyDown bitmapToReset = ENone; - - switch (aKey.iScanCode) - { - case EStdKeyDownArrow: - { - // Key up and end key was emulated - if (!aIsKeyDown && - iNavKeyDown & EEnd) - { - TRACE_INFO((_L("[HID]\tCTRL + DOWN >>> END KEY UP"))); - - aKey.iScanCode = EStdKeyNo; - TTranslatedKey& key = aKey.iEvent[0]; - key.iIsRepeatingKey = aIsKeyDown; - key.iScanCode = EStdKeyNo; - key.iUnicode = EKeyNo; - - iNavKeyDown = (iNavKeyDown & !EEnd); - } - - //CTRL = End key - else if (aIsKeyDown && - aHIDModifiers & (KHidModifierCtrl | KHidModifierCtrlRight)) - { - TRACE_INFO((_L("[HID]\tCTRL + DOWN >>> END KEY DOWN"))); - - aKey.iScanCode = EStdKeyNo; - aKey.iCount = 1; - TTranslatedKey& key = aKey.iEvent[0]; - key.iIsRepeatingKey = aIsKeyDown; - key.iScanCode = EStdKeyNo; - key.iUnicode = EKeyNo; - - iNavKeyDown = (iNavKeyDown | EEnd); - } - - //ALT = Stop - else if (aHIDModifiers & (KHidModifierAlt | KHidModifierAltRight) || - iMmKeyDown & EPlay) - { - TRACE_INFO((_L("[HID]\tALT + DOWN >>> PLAY / PAUSE"))); - - scancode = EStdKeyApplication2; - isMmKey = ETrue; - bitmapToReset = EPlay; - } - - //SHIFT = Volume down - else if (aHIDModifiers & (KHidModifierShift | KHidModifierShiftRight) || - iMmKeyDown & EVolDown) - { - TRACE_INFO((_L("[HID]\tSHIFT + DOWN >>> VOLUME DOWN"))); - - scancode = EStdKeyDecVolume; - isMmKey = ETrue; - bitmapToReset = EVolDown; - } - break; - } - default: - { - // no actions - break; - } - } - - if (isMmKey) - { - if (bitmapToReset) - { - ResetBitmap(aIsKeyDown, bitmapToReset); - } - SendRawEvent(scancode, aIsKeyDown, modifier); - ret = ETrue; - } - - return ret; - } - -// ---------------------------------------------------------------------- -// CHidKeyboardDriver::HandleKeyMappingLeft -// Handle key mapping gor LEFT + MODIFIER -// ---------------------------------------------------------------------- -// -TBool CHidKeyboardDriver::HandleKeyMappingLeft(TDecodedKeyInfo& aKey, - TBool aIsKeyDown, - TUint8 aHIDModifiers) - { - TRACE_INFO((_L("[HID]\tCHidKeyboardDriver::HandleKeyMappingLeft"))); - - TBool ret = EFalse; - TInt scancode = 0; - TUint modifier = 0; - TBool isMmKey = EFalse; - TMmKeyDown bitmapToReset = ENone; - - switch (aKey.iScanCode) + if (!ret) { - case EStdKeyLeftArrow: - { - // Key up and LSK was simulated - if (!aIsKeyDown && - iNavKeyDown & ELsk) - { - TRACE_INFO((_L("[HID]\tCTRL + LEFT >>> LEFT SOFTKEY UP"))); - - aKey.iScanCode = EStdKeyDevice0; - TTranslatedKey& key = aKey.iEvent[0]; - key.iIsRepeatingKey = aIsKeyDown; - key.iScanCode = EStdKeyDevice0; - key.iUnicode = EKeyDevice0; - - iNavKeyDown = (iNavKeyDown & !ELsk); - } - - //CTRL = LSK - else if (aIsKeyDown && - aHIDModifiers & (KHidModifierCtrl | KHidModifierCtrlRight)) - { - TRACE_INFO((_L("[HID]\tCTRL + LEFT >>> LEFT SOFTKEY DOWN"))); - - aKey.iScanCode = EStdKeyDevice0; - aKey.iCount = 1; - TTranslatedKey& key = aKey.iEvent[0]; - key.iIsRepeatingKey = aIsKeyDown; - key.iScanCode = EStdKeyDevice0; - key.iUnicode = EKeyDevice0; - - iNavKeyDown = (iNavKeyDown | ELsk); - } - - //ALT (short) = Previous - //ALT (long) = Backwards - else if (aHIDModifiers & (KHidModifierAlt | KHidModifierAltRight) || - iMmKeyDown & EPrev) - { - TRACE_INFO((_L("[HID]\tALT + LEFT >>> PREVIOUS / REW"))); - - scancode = EStdKeyApplication5; - isMmKey = ETrue; - bitmapToReset = ENext; - } - - //SHIFT = Mute toggle - else if (aHIDModifiers & (KHidModifierShift | KHidModifierShiftRight) || - iMmKeyDown & EPlay) - { - TRACE_INFO((_L("[HID]\tSHIFT + LEFT >>> MUTE / UNMUTE"))); - - scancode = EStdKeyApplication2; - isMmKey = ETrue; - bitmapToReset = EPlay; - } - break; - } - default: - { - // no actions - break; - } - } - - if (isMmKey) - { - if (bitmapToReset) - { - ResetBitmap(aIsKeyDown, bitmapToReset); - } - SendRawEvent(scancode, aIsKeyDown, modifier); - ret = ETrue; - } - - return ret; - } - -// ---------------------------------------------------------------------- -// CHidKeyboardDriver::HandleKeyMappingRight -// Handle key mapping gor RIGHT + MODIFIER -// ---------------------------------------------------------------------- -// -TBool CHidKeyboardDriver::HandleKeyMappingRight(TDecodedKeyInfo& aKey, - TBool aIsKeyDown, - TUint8 aHIDModifiers) - { - TRACE_INFO((_L("[HID]\tCHidKeyboardDriver::HandleKeyMappingRight"))); - - TBool ret = EFalse; - TInt scancode = 0; - TUint modifier = 0; - TBool isMmKey = EFalse; - TMmKeyDown bitmapToReset = ENone; - - switch (aKey.iScanCode) - { - case EStdKeyRightArrow: - { - // Key up and RSK was simulated - if (!aIsKeyDown && - iNavKeyDown & ERsk) - { - TRACE_INFO((_L("[HID]\tCTRL + LEFT >>> RIGHT SOFTKEY UP"))); - - aKey.iScanCode = EStdKeyDevice1; - TTranslatedKey& key = aKey.iEvent[0]; - key.iIsRepeatingKey = aIsKeyDown; - key.iScanCode = EStdKeyDevice1; - key.iUnicode = EKeyDevice1; - - iNavKeyDown = (iNavKeyDown & !ERsk); - } - - //CTRL = RSK - else if (aIsKeyDown && - aHIDModifiers & (KHidModifierCtrl | KHidModifierCtrlRight)) - { - TRACE_INFO((_L("[HID]\tCTRL + RIGHT >>> RIGHT SOFTKEY DOWN"))); - - aKey.iScanCode = EStdKeyDevice1; - aKey.iCount = 1; - TTranslatedKey& key = aKey.iEvent[0]; - key.iIsRepeatingKey = aIsKeyDown; - key.iScanCode = EStdKeyDevice1; - key.iUnicode = EKeyDevice1; - - iNavKeyDown = (iNavKeyDown | ERsk); - } - - //ALT (short) = Next - //ALT (long) = Forward - else if (aHIDModifiers & (KHidModifierAlt | KHidModifierAltRight) || - iMmKeyDown & EPrev) - { - TRACE_INFO((_L("[HID]\tALT + RIGHT >>> NEXT / FF"))); - - scancode = EStdKeyApplication4; - isMmKey = ETrue; - bitmapToReset = EPrev; - } - - //SHIFT = Mute toggle (currently just toggle play / pause) - else if (aHIDModifiers & (KHidModifierShift | KHidModifierShiftRight) || - iMmKeyDown & EPlay) - { - TRACE_INFO((_L("[HID]\tSHIFT + RIGHT >>> MUTE / UNMUTE"))); - - scancode = EStdKeyApplication2; - isMmKey = ETrue; - bitmapToReset = EPlay; - } - break; - } - default: - { - // no actions - break; - } + ret = HandleMultimediaKeysForStandard(aScancodeKey, aIsKeyDown, + aHIDModifiers); } - - if (isMmKey) - { - if (bitmapToReset) - { - ResetBitmap(aIsKeyDown, bitmapToReset); - } - SendRawEvent(scancode, aIsKeyDown, modifier); - ret = ETrue; - } - - return ret; - } - -// ---------------------------------------------------------------------- -// CHidKeyboardDriver::HandleKeyMappingOther -// Handle key mapping gor OTHER + MODIFIER -// ---------------------------------------------------------------------- -// -TBool CHidKeyboardDriver::HandleKeyMappingOther(TDecodedKeyInfo& aKey, - TBool aIsKeyDown, - TUint8 /*aHIDModifiers*/) - { - TRACE_INFO((_L("[HID]\tCHidKeyboardDriver::HandleKeyMappingOther"))); - - TBool ret = EFalse; - TInt scancode = 0; - TUint modifier = 0; - TBool isMmKey = EFalse; - - switch (aKey.iScanCode) - { - case EStdKeyEscape: - { - // ESC is released and keys were locked, eat the key press - if (!aIsKeyDown && - iNavKeyDown & EEsc) - { - TRACE_INFO((_L("[HID]\tESC >>> DISBALE KEY LOCK UP"))); - - ret = ETrue; - iNavKeyDown = (iNavKeyDown & !EEsc); - } - - // ESC when keylock enabled >>> Disabled key lock - else if (aIsKeyDown && - iKeyLock.IsKeyLockEnabled()) - { - TInt devLockStatus( EAutolockStatusUninitialized ); - TInt err = RProperty::Get( KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, devLockStatus ); - - if (!err) - { - if (EAutolockOff == devLockStatus || EAutolockStatusUninitialized == devLockStatus) - { - TRACE_INFO((_L("[HID]\tESC >>> AUTO LOCK IS OFF, DISBALE KEY LOCK DOWN "))); - iKeyLock.DisableKeyLock(); - ret = ETrue; - iNavKeyDown = (iNavKeyDown | EEsc); - } - else - { - TRACE_INFO((_L("[HID]\tESC >>> AUTO LOCK IS ON, DISBALE KEY LOCK DOWN SKIPPED"))); - } - } - else - { - TRACE_INFO((_L("[HID]\tESC >>> FAILED to get AUTO LOCK status, DISBALE KEY LOCK DOWN SKIPPED"))); - } - - } - - break; - } - case EStdKeyApplication0: - { - TRACE_INFO((_L("[HID]\tAPPLICATION KEY(Alt+Tab) >>> TSW"))); - - // Dedicated Application key - scancode = EStdKeyApplication0; - isMmKey = ETrue; - break; - } - case EStdKeyF8: - // fall through - case EStdKeyApplication2: - { - TRACE_INFO((_L("[HID]\tF8 / APPLICATION2 >>> PLAY / PAUSE"))); - - // PLAY / PAUSE - if (aKey.iScanCode != EStdKeyApplication2) - { - scancode = EStdKeyApplication2; - isMmKey = ETrue; - } - break; - } - case EStdKeyApplication3: - { - TRACE_INFO((_L("[HID]\tAPPLICATION3 >>> STOP"))); - - // STOP - scancode = EStdKeyApplication3; - isMmKey = ETrue; - break; - } - case EStdKeyF9: - // break; - case EStdKeyApplication4: - { - TRACE_INFO((_L("[HID]\tF9 / APPLICATION4 >>> NEXT / FF"))); - - // NEXT - scancode = EStdKeyApplication4; - isMmKey = ETrue; - break; - } - case EStdKeyF7: - // fall through - case EStdKeyApplication5: - { - TRACE_INFO((_L("[HID]\tF7 / APPLICATION5 >>> PREVIOUS / REW"))); - - // PREVIOUS - scancode = EStdKeyApplication5; - isMmKey = ETrue; - break; - } - case EStdKeyF12: - // fall through - case EStdKeyIncVolume: - { - TRACE_INFO((_L("[HID]\tF12 / INCVOLUME >>> VOLUME UP"))); - - // VOLUME UP - scancode = EStdKeyIncVolume; - isMmKey = ETrue; - break; - } - case EStdKeyF11: - // fall through - case EStdKeyDecVolume: - { - TRACE_INFO((_L("[HID]\tF11 / DECVOLUME >>> VOLUME DOWN"))); - - // VOLUME DOWN - scancode = EStdKeyDecVolume; - isMmKey = ETrue; - break; - } - case EStdKeyF10: - { - TRACE_INFO((_L("[HID]\tF10 >>> MUTE"))); - - // MUTE (currently just toggle play / pause) - scancode = EStdKeyApplication2; - isMmKey = ETrue; - break; - } - default: - { - break; - } - } - - if (isMmKey) - { - SendRawEvent(scancode, aIsKeyDown, modifier); - ret = ETrue; - } - return ret; } @@ -2073,6 +1426,184 @@ } } +TBool CHidKeyboardDriver::HandleMultimediaKeysForNokia(TUint16 aScancodeKey, + TBool aIsKeyDown, TUint8 aHIDModifiers) + { + const TUint KHidModifierCtrl = 0x01; + const TUint KHidModifierCtrlRight = 0x10; + const TUint KHidModifierAlt = 0x04; + + // const TUint KHidModifierAltGr = 0x64; + TInt scancode = 0; + TUint modifier = 0; + TBool isMmKey = EFalse; + + TMmKeyDown bitmapToReset; + + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: scancode 0x%08x, HIDmodifiers 0x%08x"), aScancodeKey, aHIDModifiers)); + + switch (aScancodeKey) + { + + // Mappings for Nokia SU-8W + // Key down events are stored into bitmap in order to detect if keys are released in reverse order, which caused jamming. + // For example: control key released before arrow key. + + case EStdKeyUpArrow: + { + if (aHIDModifiers & (KHidModifierCtrl | KHidModifierCtrlRight) + || iMmKeyDown & EVolUp) + { + scancode = EStdKeyIncVolume; //Volume Up = Ctrl + ArrowUp + isMmKey = ETrue; + // Set or reset flag bit + + bitmapToReset = EVolUp; + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: Volume up %d"), aIsKeyDown)); + } + break; + } + + case EStdKeyDownArrow: + { + if (aHIDModifiers & (KHidModifierCtrl | KHidModifierCtrlRight) + || iMmKeyDown & EVolDown) + { + scancode = EStdKeyDecVolume; //Volume Down = Ctrl + ArrowDown + isMmKey = ETrue; + bitmapToReset = EVolDown; + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: Volume down %d"), aIsKeyDown)); + } + break; + } + + case EStdKeyRightArrow: + { + if (aHIDModifiers & KHidModifierAlt || iMmKeyDown & EPlay) + { + scancode = EStdKeyApplication2; //Play = Alt + ArrowRight + isMmKey = ETrue; + bitmapToReset = EPlay; + + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: Play %d"), aIsKeyDown)); + } + else if (aHIDModifiers & (KHidModifierCtrl + | KHidModifierCtrlRight) || iMmKeyDown & ENext) + { + scancode = EStdKeyApplication4; //Next = Ctrl + ArrowRight + isMmKey = ETrue; + bitmapToReset = ENext; + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: Next %d"), aIsKeyDown)); + } + break; + } + + case EStdKeyLeftArrow: + { + if (aHIDModifiers & KHidModifierAlt || iMmKeyDown & EStop) + { + scancode = EStdKeyApplication3; //Stop = Alt + ArrowLeft + isMmKey = ETrue; + bitmapToReset = EStop; + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: Stop %d"), aIsKeyDown)); + } + else if (aHIDModifiers & (KHidModifierCtrl + | KHidModifierCtrlRight) || iMmKeyDown & EPrev) + { + scancode = EStdKeyApplication5; //Prev = Ctrl + ArrowLeft + isMmKey = ETrue; + bitmapToReset = EPrev; + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: Prev %d"), aIsKeyDown)); + } + break; + } + + default: + break; + } + + if (isMmKey) + { + ResetBitmap(aIsKeyDown, bitmapToReset); + SendRawEvent(scancode, aIsKeyDown, modifier); + } + return isMmKey; + } + +TBool CHidKeyboardDriver::HandleMultimediaKeysForStandard( + TUint16 aScancodeKey, TBool aIsKeyDown, TUint8 aHIDModifiers) + { + TInt scancode = 0; + TUint modifier = 0; + TBool isMmKey = EFalse; + + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: scancode 0x%08x, HIDmodifiers 0x%08x"), aScancodeKey, aHIDModifiers)); + //please complier... + (void) aHIDModifiers; + + switch (aScancodeKey) + { + // Mappings for standard keyboards + + case EStdKeyApplication2: //Play + { + scancode = EStdKeyApplication2; + isMmKey = ETrue; + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: Play %d"), aIsKeyDown)); + break; + } + + case EStdKeyApplication3: //Stop + { + scancode = EStdKeyApplication3; + isMmKey = ETrue; + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: Stop %d"), aIsKeyDown)); + break; + } + + case EStdKeyApplication4: //Next + { + scancode = EStdKeyApplication4; + isMmKey = ETrue; + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: Next %d"), aIsKeyDown)); + break; + } + + case EStdKeyApplication5: //Prev + { + scancode = EStdKeyApplication5; + isMmKey = ETrue; + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: Prev %d"), aIsKeyDown)); + break; + } + + case EStdKeyIncVolume: //Volume up + { + scancode = EStdKeyIncVolume; + isMmKey = ETrue; + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: Volume up %d"), aIsKeyDown)); + break; + } + + case EStdKeyDecVolume: //Volume down + { + scancode = EStdKeyDecVolume; + isMmKey = ETrue; + TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::HandleNokiaMultimediaKeys: Volume down %d"), aIsKeyDown)); + break; + } + + default: + break; + } + + if (isMmKey) + { + SendRawEvent(scancode, aIsKeyDown, modifier); + } + return isMmKey; + } + // ---------------------------------------------------------------------- // CHidKeyboardDriver::SendRawEvent // Send raw key event to window server