diff -r 613943a21004 -r 9386f31cc85b bluetoothengine/bthid/keyboard/src/keyboard.cpp --- a/bluetoothengine/bthid/keyboard/src/keyboard.cpp Tue Aug 31 15:25:10 2010 +0300 +++ b/bluetoothengine/bthid/keyboard/src/keyboard.cpp Wed Sep 01 12:20:04 2010 +0100 @@ -23,6 +23,9 @@ #include #include #include +#include +#include +#include #include "hidtranslate.h" #include "finder.h" @@ -50,6 +53,28 @@ 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 //---------------------------------------------------------------------------- @@ -110,6 +135,11 @@ 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); } //---------------------------------------------------------------------------- @@ -133,6 +163,8 @@ if (iSettings) delete iSettings; + + iKeyLock.Close(); } //---------------------------------------------------------------------------- @@ -143,6 +175,7 @@ { TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::StartL"))); aConnectionId = aConnectionId; + // No keys are pressed: iModifiers = 0; for (TInt i = 0; i < KNumInputFieldTypes; ++i) @@ -495,8 +528,7 @@ //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 (!HandleMultimediaKeys(decodedKeys.iScanCode, aIsKeyDown, - iModifiers)) //check if the key is multimedia key that needs to be sent as RawEvent and send it. + if (!HandleKeyMapping(decodedKeys, aIsKeyDown, iModifiers)) { if (decodedKeys.iScanCode != EStdKeyNull) { @@ -515,7 +547,8 @@ //Send key codes differently to idle app if ((IsDigitKey(decodedKeys.iScanCode) || IsSpecialHandleKey( unikey) || decodedKeys.iScanCode == EStdKeyYes - || decodedKeys.iScanCode == EStdKeyBackspace) + || decodedKeys.iScanCode == EStdKeyBackspace + || decodedKeys.iScanCode == EStdKeyNo) && IsPhoneAppTopMost()) { TRACE_INFO( (_L("[HID]\tCHidKeyboardDriver::KeyEvent: Send event %c to idle editor"), unikey)); @@ -1156,17 +1189,6 @@ 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) { @@ -1347,7 +1369,33 @@ 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); @@ -1399,17 +1447,616 @@ //---------------------------------------------------------------------------- // -TBool CHidKeyboardDriver::HandleMultimediaKeys(TUint16 aScancodeKey, - TBool aIsKeyDown, TUint8 aHIDModifiers) +TBool CHidKeyboardDriver::HandleKeyMapping(TDecodedKeyInfo& aKey, + 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) { - TBool ret = HandleMultimediaKeysForNokia(aScancodeKey, aIsKeyDown, - 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; + } + + //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"))); - if (!ret) + TBool ret = EFalse; + TInt scancode = 0; + TUint modifier = 0; + TBool isMmKey = EFalse; + TMmKeyDown bitmapToReset = ENone; + + switch (aKey.iScanCode) + { + 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) { - ret = HandleMultimediaKeysForStandard(aScancodeKey, aIsKeyDown, - aHIDModifiers); + 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; + } + } + + 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; } @@ -1426,184 +2073,6 @@ } } -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