windowing/windowserver/nga/SERVER/KEYBEMUL.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/SERVER/KEYBEMUL.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,75 @@
+// Copyright (c) 1996-2009 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"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Emulte key presses on pointer events
+// 
+//
+
+#include <e32std.h>
+#include <e32hal.h>
+#include "server.h"
+#include "EVENT.H"
+
+TInt WsKeyboardEmulator::iCurrentKeyDown;
+TBool WsKeyboardEmulator::iKeyIsDown=EFalse;
+
+void WsKeyboardEmulator::RawKeyEvent(TRawEvent::TType aType)
+	{
+	if (aType==TRawEvent::EKeyUp)
+		iKeyIsDown=EFalse;
+	else
+		iKeyIsDown=ETrue;
+	TRawEvent rawEvent;
+	rawEvent.Set(aType,iCurrentKeyDown);
+	TWindowServerEvent::ProcessRawEvent(rawEvent);
+	}
+
+TBool WsKeyboardEmulator::PointerEvent(TPointerEvent::TType aPointerEventType,const TPoint &aPoint, TDblQue<TPointerKeyList> *aKeyList)
+	{
+	if (iKeyIsDown && (aPointerEventType==TPointerEvent::EButton1Up))
+		RawKeyEvent(TRawEvent::EKeyUp);
+	else if (!aKeyList)
+		return(EFalse);
+	else
+		{
+		TPointerKeyList *pkl=NULL;
+		for(TDblQueIter<TPointerKeyList> iter(*aKeyList);(pkl=iter++)!=NULL;)
+			if (pkl->iRect.Contains(aPoint))
+				break;
+		if (iKeyIsDown && 
+			(aPointerEventType==TPointerEvent::EDrag || 
+			 aPointerEventType==TPointerEvent::EEnterHighPressure ||
+			 aPointerEventType==TPointerEvent::EExitHighPressure) && 
+			(!pkl || iCurrentKeyDown!=pkl->iScanCode))
+			{
+			RawKeyEvent(TRawEvent::EKeyUp);
+			}
+		else if (pkl)
+			{
+			if (aPointerEventType==TPointerEvent::EButton1Down ||
+			    (aPointerEventType==TPointerEvent::ESwitchOn && pkl->iActivatedByPointerSwitchOn))
+				{
+				if (iKeyIsDown)
+					RawKeyEvent(TRawEvent::EKeyUp);
+				iCurrentKeyDown=pkl->iScanCode;
+				RawKeyEvent(TRawEvent::EKeyDown);
+				if (aPointerEventType==TPointerEvent::ESwitchOn)
+					RawKeyEvent(TRawEvent::EKeyUp);
+				}
+			}
+		else
+			return(EFalse);
+		}
+	return(ETrue);
+	}
+