--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nonnga/SERVER/KEYBEMUL.CPP Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,69 @@
+// 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 && (!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);
+ }
+