windowing/windowserver/nga/SERVER/CAPKEY.CPP
changeset 188 1b081cb0800b
parent 0 5d03bc08d59c
child 164 25ffed67c7ef
--- a/windowing/windowserver/nga/SERVER/CAPKEY.CPP	Fri Sep 24 16:14:28 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/CAPKEY.CPP	Fri Sep 24 16:44:34 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1995-2010 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"
@@ -24,9 +24,6 @@
 _LIT(KWsProtectedKey, "PROTECTEDKEY");
 _LIT(KWsProtectedWindowName, "PROTECTEDKEYWINDOWNAME");
 
-TPriQue<CWsCaptureKeyUpsAndDowns> CWsCaptureKeyUpsAndDowns::iCaptureKeysUpsAndDowns(_FOFF(CWsCaptureKeyUpsAndDowns,iLink));
-TPriQue<CWsCaptureLongKey> CWsCaptureLongKey::iCaptureLongKeys(_FOFF(CWsCaptureLongKey,iLink));
-
 
 /*CWsCaptureKey*/
 
@@ -35,20 +32,38 @@
 
 CWsCaptureKey::~CWsCaptureKey()
 	{
-	TWindowServerEvent::CancelCaptureKey((TUint32)this);
+	TWindowServerEvent::CancelCaptureKey(ECaptureTypeKey, this);
 	}
 
-void CWsCaptureKey::CmdToParams(const TWsWinCmdCaptureKey &aCaptureKey, TCaptureKey &aParams)
+/**
+Convert a window server key capture command to a capture request for the
+key routing plug-in.
+
+@param	aCaptureKey		Input capture command
+@param	aRequest		Output capture request
+*/
+void CWsCaptureKey::CmdToRequest(const TWsWinCmdCaptureKey &aCaptureKey, TKeyCaptureRequest &aRequest)
 	{
-	aParams.iModifiers.iMask=aCaptureKey.modifierMask;
-	aParams.iModifiers.iValue=aCaptureKey.modifiers;
-	aParams.iKeyCodePattern.iKeyCode=(TInt16)aCaptureKey.key;
-	aParams.iKeyCodePattern.iPattern=EMatchKey;
-	aParams.iKeyCodePattern.iFiller=STATIC_CAST(TUint8,aCaptureKey.priority);
-	aParams.iApp=(TUint32)iWindowGroup;
-	aParams.iHandle=(TUint32)this;
+	aRequest.iType = ECaptureTypeKey;
+	aRequest.iModifierMask = aCaptureKey.modifierMask;
+	aRequest.iModifiers = aCaptureKey.modifiers;
+	aRequest.iInputCode = aCaptureKey.key;
+	aRequest.iOutputCode = aCaptureKey.key;
+	aRequest.iPriority = aCaptureKey.priority;
+	aRequest.iWindowGroup = iWindowGroup;
+	aRequest.iWindowGroupId = iWindowGroup ? iWindowGroup->Identifier() : 0;
+	aRequest.iAppUid = iWsOwner ? TUid::Uid(iWsOwner->SecureId().iId) : KNullUid;
+	aRequest.iHandle = this;
 	}
 
+/**
+Check for protected key in a capture command
+
+@param	aWindowGroup	Window Group of capture request
+@param	aCaptureKey		Key capture command
+
+@leave KErrPermissionDenied		Capture key is protected
+*/
 void CheckProtectedKeyL(CWsWindowGroup* aWindowGroup,const TWsWinCmdCaptureKey &aCaptureKey)
 	{
 	//The key specified in the WSINI file with the keyword: PROTECTEDKEY can only be captured 
@@ -56,7 +71,7 @@
 	TInt protectedKey;
 	if(WsIniFile->FindVar(KWsProtectedKey,protectedKey))
 		{
-		if (aCaptureKey.key == (TUint)protectedKey)
+		if (aCaptureKey.key == static_cast<TUint>(protectedKey))
 			{
 			if (aWindowGroup->GroupName()==NULL)
 				{
@@ -73,20 +88,36 @@
 		}
 	}
 
+/**
+Construct a capture object for normal key events and make a capture request
+to the key routing plug-in.
+
+@param	aCaptureKey		Key capture command from RWindowGroup::CaptureKey(),
+						RWsSession::SetHotKey() or default hot key settings.
+*/
 void CWsCaptureKey::ConstructL(const TWsWinCmdCaptureKey &aCaptureKey)
 	{
 	CheckProtectedKeyL(iWindowGroup, aCaptureKey);
 	NewObjL();
-	TCaptureKey params;
-	CmdToParams(aCaptureKey, params);
-	TWindowServerEvent::AddCaptureKeyL(params);
+
+	TKeyCaptureRequest request;
+	CmdToRequest(aCaptureKey, request);
+	TWindowServerEvent::AddCaptureKeyL(request);
 	}
 
+/**
+Make a capture request update for normal key events to the key routing plug-in.
+
+@param	aCaptureKey		Key capture command from CWsHotKey::SetL()
+
+Note: this function is used only to disable hot key capture requests or to
+reset them to their defaults.
+*/
 void CWsCaptureKey::SetL(const TWsWinCmdCaptureKey &aCaptureKey)
 	{
-	TCaptureKey params;
-	CmdToParams(aCaptureKey, params);
-	TWindowServerEvent::SetCaptureKey((TUint32)this, params);
+	TKeyCaptureRequest request;
+	CmdToRequest(aCaptureKey, request);
+	TWindowServerEvent::UpdateCaptureKeyL(request);
 	}
 
 void CWsCaptureKey::CommandL(TInt , const TAny *)
@@ -101,37 +132,39 @@
 
 CWsCaptureKeyUpsAndDowns::~CWsCaptureKeyUpsAndDowns()
 	{
-	iLink.Deque();
+	TWindowServerEvent::CancelCaptureKey(ECaptureTypeKeyUpDown, this);
 	}
 
+/**
+Construct a capture object for up/down key events and make a capture request
+to the key routing plug-in.
+
+@param	aCaptureKey		Key capture command from
+						RWindowGroup::CaptureKeyUpAndDowns().
+*/
 void CWsCaptureKeyUpsAndDowns::ConstructL(const TWsWinCmdCaptureKey &aCaptureKey)
 	{
 	CheckProtectedKeyL(iWindowGroup, aCaptureKey);
 	NewObjL();
-	iModifierMask=aCaptureKey.modifierMask;
-	iModifierValue=aCaptureKey.modifiers;
-	iScanCode=aCaptureKey.key;
-	iLink.iPriority=aCaptureKey.priority + 1;
-	iCaptureKeysUpsAndDowns.Add(*this);
-	--iLink.iPriority;
+
+	TKeyCaptureRequest request;
+	request.iType = ECaptureTypeKeyUpDown;
+	request.iInputCode = aCaptureKey.key;
+	request.iOutputCode = aCaptureKey.key;
+	request.iModifiers = aCaptureKey.modifiers;
+	request.iModifierMask = aCaptureKey.modifierMask;
+	request.iPriority = aCaptureKey.priority;
+	request.iWindowGroup = iWindowGroup;
+	request.iWindowGroupId = iWindowGroup ? iWindowGroup->Identifier() : 0;
+	request.iAppUid = iWsOwner ? TUid::Uid(iWsOwner->SecureId().iId) : KNullUid;
+	request.iHandle = this;
+	TWindowServerEvent::AddCaptureKeyL(request);
 	}
 
 void CWsCaptureKeyUpsAndDowns::CommandL(TInt , const TAny *)
 	{
 	}
 
-CWsWindowGroup *CWsCaptureKeyUpsAndDowns::CheckForCapture(TUint aScanCode, TUint aModifiers)
-	{
-	TDblQueIter<CWsCaptureKeyUpsAndDowns> iter(iCaptureKeysUpsAndDowns);
-	CWsCaptureKeyUpsAndDowns* cap;
-	while ((cap=iter++)!=NULL)
-		{
-		if (cap->iScanCode==aScanCode && (aModifiers&cap->iModifierMask)==cap->iModifierValue)
-			return(cap->iWindowGroup);
-		}
-	return NULL;
-	}
-
 
 /*CWsCaptureLongKey*/
 
@@ -141,35 +174,40 @@
 
 CWsCaptureLongKey::~CWsCaptureLongKey()
 	{
-	iLink.Deque();
+	TWindowServerEvent::CancelCaptureKey(ECaptureTypeLongKey, this);
 	}
 
+/**
+Construct a capture object for long key events and make a capture request
+to the key routing plug-in.
+
+@param	aCaptureKey		Key capture command from RWindowGroup::CaptureLongKey()
+*/
 void CWsCaptureLongKey::ConstructL(const TWsWinCmdCaptureLongKey &aCaptureKey)
 	{
 	NewObjL();
-	iData=aCaptureKey;
-	if (iData.delay.Int()<0)
+	iFlags = aCaptureKey.flags;
+	iDelay = aCaptureKey.delay;
+	if (iDelay.Int() < 0)
 		{
 		TTimeIntervalMicroSeconds32 time;
-		CKeyboardRepeat::GetRepeatTime(iData.delay,time);
+		CKeyboardRepeat::GetRepeatTime(iDelay, time);
 		}
-	iLink.iPriority=iData.priority + 1;
-	iCaptureLongKeys.Add(*this);
-	--iLink.iPriority;
+
+	TKeyCaptureRequest request;
+	request.iType = ECaptureTypeLongKey;
+	request.iInputCode = aCaptureKey.inputKey;
+	request.iOutputCode = aCaptureKey.outputKey;
+	request.iModifiers = aCaptureKey.modifiers;
+	request.iModifierMask = aCaptureKey.modifierMask;
+	request.iPriority = aCaptureKey.priority;
+	request.iWindowGroup = iWindowGroup;
+	request.iWindowGroupId = iWindowGroup ? iWindowGroup->Identifier() : 0;
+	request.iAppUid = iWsOwner ? TUid::Uid(iWsOwner->SecureId().iId) : KNullUid;
+	request.iHandle = this;
+	TWindowServerEvent::AddCaptureKeyL(request);
 	}
 
 void CWsCaptureLongKey::CommandL(TInt , const TAny *)
 	{
 	}
-
-CWsCaptureLongKey* CWsCaptureLongKey::CheckForCapture(TUint aKeyCode, TInt aModifiers)
-	{
-	TDblQueIter<CWsCaptureLongKey> iter(iCaptureLongKeys);
-	CWsCaptureLongKey* longCapture;
-	while ((longCapture=iter++)!=NULL)
-		{
-		if (aKeyCode==longCapture->iData.inputKey && (aModifiers&longCapture->iData.modifierMask)==longCapture->iData.modifiers)
-			return longCapture;
-		}
-	return NULL;
-	}