--- 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 <eiksvdef.h>
#include <apgcli.h>
#include <apgtask.h>
+#include <e32keys.h>
+#include <avkondomainpskeys.h>
+#include <coreapplicationuisdomainpskeys.h>
#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