windowing/windowserver/nga/SERVER/pointer.h
changeset 0 5d03bc08d59c
child 2 5e30ef2e26cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/SERVER/pointer.h	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,309 @@
+// Copyright (c) 2006-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:
+// TWsPointer and associated classes definitions
+// 
+//
+
+#ifndef __POINTER_H__
+#define __POINTER_H__
+
+#include "server.h"
+#include "advancedpointereventhelper.h"
+
+class TWsPointer;
+class CWsPointerTimer : public CTimer
+	{
+public:
+	class MPointerTimerCallback
+		{
+	public:
+		virtual void RepeatTimerCompleted() =0;
+		};	
+	
+	static CWsPointerTimer* NewL(MPointerTimerCallback& aWsPointer);
+private:
+	CWsPointerTimer(MPointerTimerCallback& aPointerTimerCallback);
+	void ConstructL();
+	void RunL();
+private:
+	MPointerTimerCallback& iPointerTimerCallback;
+	};
+
+class TWsPointer : public CWsPointerTimer::MPointerTimerCallback
+	{
+	enum {EPointerUpdateGapInMicroSeconds=50000};
+	enum TPointerState
+		{
+		EPointerStateOutOfRange=0,
+		EPointerStateUp,
+		EPointerStateDown
+		};
+public:
+	static void InitStaticsL();
+	static void Stop();
+	static void DeleteStatics();
+	static inline TPointerCursorMode PointerCursorMode();
+	static inline void SetPointerCursorMode(TPointerCursorMode aMode);
+	static inline TPoint PointerCursorPos();
+	static void SetPointerCursorPos(TPoint aPos);
+	static void ReLogPointersCurrentWindows();
+	static void ReLogWindow(const CWsWindow* aWin);
+	static void WindowDisconnected(const CWsWindow* deletedWindow);
+	static TInt ClaimGrab(const CWsWindow* aWindow,const TWsWinCmdGrabControl& aGrabControl);	
+#if defined(__WINS__)
+	static TBool PreProcessDriverEvent(TRawEvent &aRawEvent,TBool aFromHardware=EFalse);
+#else
+	static TBool PreProcessDriverEvent(TRawEvent &aRawEvent);
+#endif
+	static TBool PreProcessClientEvent(TRawEvent &aRawEvent, TBool aAdvancedPointersEnabled);
+	static TBool IsPointerEventType(TRawEvent::TType aType);
+	static void ProcessWsEvent(TWsEvent& aEvent,const CWsWindowGroup* aForceInGroup,TBool aNatural);	
+	static void GetDoubleClickSettings(TTimeIntervalMicroSeconds32 &aTime, TInt &aDistance);
+	static void SetDoubleClick(const TTimeIntervalMicroSeconds32 &aTime, TInt aDistance);
+	static void UpdatePointerCursor();
+	static TInt RequestPointerRepeatEvent(CWsWindow* aWindow, const TWsWinCmdRequestPointerRepeatEvent& aRequest);
+	static TInt CancelPointerRepeatEventRequest(const TWsWinCmdCancelPointerRepeatEventRequest& aCancel);
+	void RepeatTimerCompleted(); // from CWsPointerTimer::MPointerTimerCallback	
+	static TEventQueueWalkRet PointerRepeatPurgeCheck(TWsEvent* aEvent, TUint8 aPointerNumber);
+	static inline void UnmatchedEventPurged(TPointerEvent::TType aPointerType, TWsEvent* aEventPurged);
+	static void TimerExpired();
+	static inline TBool XyInput();
+#if defined(__WINS__)
+	static void SetXyInputType(TXYInputType aXyInputType);
+#endif
+	static void UpdatePrimaryPointer(const TRawEvent& aRawEvent);
+	static inline void RollbackPrimaryPointer();
+	static TInt SetCloseProximityThresholds(TInt aEnterCloseProximityThreshold, TInt aExitCloseProximityThreshold);
+	static TInt GetEnterCloseProximityThreshold();
+	static TInt GetExitCloseProximityThreshold();
+	static TInt SetHighPressureThresholds(TInt aEnterHighPressureThreshold, TInt aExitHighPressureThreshold);
+	static TInt GetEnterHighPressureThreshold();
+	static TInt GetExitHighPressureThreshold();
+	static inline TInt PrimaryPointer();
+private:
+	/** Clears all fields to default values, state goes to EPointerStateOutOfRange */
+	void Clear();
+	void SendEnterExitEvent(TEventCode aType);
+	void SetCurrentWindow(const CWsWindow* aWin);
+	void ReLogCurrentWindow();
+	void ReLogCurrentWindow(TPoint &aPos, TPoint &aParentPos, const CWsWindowGroup* aForceInGroup);
+	void ProcessForegroundCheck();
+	CWsPointerCursor* CalculatePointerCursor();
+	void ProcessEvent(TWsEvent& aEvent,const CWsWindowGroup* aForceInGroup,TBool aNatural);	
+	void ProcessEvent(TWsEvent& aEvent, TBool aNatural);
+	void ProcessPointerEvent(TWsEvent& aEvent);
+	void ProcessOutOfRangeEvent(TWsEvent& aEvent,const CWsWindowGroup* aForceInGroup, TBool aNatural);
+	void UnmatchedEventPurged(TPointerEvent::TType aPointerType, TUint aHandle);
+	TBool CheckMatchingEventPurged(TPointerEvent::TType aType);
+	TBool QueuePointerEvent(const CWsWindow* aWindow, TWsEvent &event);
+	void ClaimGrab(const CWsWindow* aWindow, TBool aSendUpEvent);
+	void PointerCursorUpdateCheck();
+	void NotifyCClick(TAdvancedPointerEvent& aPointerEvent);
+	
+	static void RestrictPos(TPoint& aPos,TBool aWithinDrawableArea=ETrue);
+	void RequestRepeatEvent(CWsWindow* aWindow, const TWsWinCmdRequestPointerRepeatEvent& aRequest);
+	void CancelPointerRepeatEventRequest();
+	TBool PointerEventRepeatCheck(const TWsEvent* aEvent, TUint32 aHandle);
+	static void UpdatePointerCursorTo(CWsPointerCursor* aNewCursor);
+	static inline TBool MovesAvailable();
+	static inline TBool DeltaMouse();
+	static inline CWsWindow*& RepeatWindow(TUint8 aPointerNumber);
+	static inline TRect& RepeatRect(TUint8 aPointerNumber);
+	static inline CWsPointerTimer*& RepeatTimer(TUint8 aPointerNumber);
+	static inline TBool PointerNumberInRange(TUint8 aPointerNumber);
+	static void ShiftYCoordinate(TInt& aY);
+private:
+	/** Pointer number used to identify this pointer */
+	TUint iNumber;
+	
+	/** State of the pointer - Up, Down or OutOfRange */
+	TPointerState iState;
+	
+	/** 2D position of the pointer. Valid if iState != EPointerStateOutOfRange. */
+	TPoint iPos;
+	
+	/** Combined pressure and proximity values for the pointer */
+	TInt iPressureProximity;
+	
+	/** Where the pointer is 'Logged' taking into account position, grabbing and capturing */
+	const CWsWindow* iCurrentWindow;
+	
+	/** Window under pointer */
+	const CWsWindow* iActualWinPointerIsOver;
+	
+	/** Window that is grabbing this pointer's events (related to Drag events) */
+	const CWsWindow* iGrabWindow;
+	
+	TUint iLastUnmatchedDown1;
+	TUint iLastUnmatchedDown2;
+	TUint iLastUnmatchedDown3;
+	TUint iLastUnmatchedEnterHighPressure;
+	
+	/** Window which received last click, for double click detection */
+	const CWsWindow* iPrevClickWindow;
+	
+	/** Position of last click, for double click detection */
+	TPoint iPrevClickPos;
+	
+	/** Time of last click, for double click detection */ 
+	TTime iPrevClickTime;
+	
+	/** Which button has been clicked last time, for double click detection */ 
+	TPointerEvent::TType iPrevClickEventType;
+	
+	/** State upon which firing of EEnterCloseProximity and EExitCloseProximity
+	events is based. */
+	TBool iInCloseProximity;
+	
+	/** State upon which firing of EEnterHighPressure and EExitHighPressure
+	events is based. */
+	TBool iInHighPressure;
+	
+	/** Timer for pointer event repeating */
+	CWsPointerTimer* iRepeatTimer;
+	
+	CWsWindow* iRepeatWindow;
+	
+	TRect iRepeatRect;
+	
+	/** Pointing device's type */
+	static TXYInputType iXyInputType;
+
+	/** Maximum number of pointers handled at the same time. Always at least 1. */ 
+	static TInt iMaxPointers;
+	
+	/** Main array of TWsPointer objects, can keep up to iMaxPointers objects */
+	static RArray<TWsPointer> iPointers;
+	
+	/** Index of Primary Pointer in iPointers array. */
+	static TInt iPrimaryPointer;
+	
+	/** Previous primary pointer, before last run of UpdatePrimaryPointer(TRawEvent). */
+	static TInt iPreviousPrimaryPointer;
+	
+	static CWsRootWindow* iRootWindow;
+	
+	/** Global setting for all pointers */
+	static TTimeIntervalMicroSeconds32 iDoubleClickMaxInterval;
+
+	/** Global setting for all pointers */
+	static TInt iDoubleClickMaxDistance;
+	
+	static CWsPointerCursor* iCursorSprite;
+	
+	static TPointerCursorMode iPointerCursorMode;
+	
+	/** If pointer cursor update is required */
+	static TBool iUpdateRequired;
+	
+	/** Timer for pointer cursor updates */
+	static CPeriodic* iPeriodicTimer;
+	
+	/** For iPeriodicTimer */
+	static TBool iTimerQueued;
+	
+	static TBool iIs3DPointer;
+	
+	/** Threshold upon which firing of EEnterCloseProximity event is based */
+	static TInt iEnterCloseProximityThreshold;
+	
+	/** Threshold upon which firing of EExitCloseProximity event is based */
+	static TInt iExitCloseProximityThreshold;
+
+	/** Threshold upon which firing of EEnterHighPressure event is based */
+	static TInt iEnterHighPressureThreshold;
+
+	/** Threshold upon which firing of EExitHighPressure event is based */
+	static TInt iExitHighPressureThreshold;
+	
+	/** Used to offset the y pointer */
+	static TInt iYOffset;
+	};
+
+class CWsPointerBuffer : public CBase
+	{
+public:
+	~CWsPointerBuffer();
+	static void ConnectL(CWsClientWindow* aWindow, TInt aMaxPoints, TUint aFlags);
+	static void Disconnect(CWsClientWindow* aWindow);
+	static void PointerEvent(CWsClientWindow* aWindow,const TPoint &aPoint);
+	static void RetrievePointerMoveBuffer(CWsClientWindow* aWindow,TInt aMaxPoints);
+	static void DiscardPointerMoveBuffer(CWsClientWindow* aWindow);
+	static void DiscardPointerMoveBuffer(TUint aHandle);
+private:
+	static void AdjustMaxSizeL();
+	static void Reset();
+	static void SignalBufferReady();
+private:
+	CWsClientWindow* iWindow;
+	TInt iMaxPoints;
+	TInt iFlags;
+	TSglQueLink iQue;
+	static TBool iSignalled;
+	static CWsPointerBuffer* iCurrentBuffer;
+	static CCirBuf<TPoint>* iPointerBuffer;
+	static TSglQue<CWsPointerBuffer> iList;
+	};
+
+
+inline void TWsPointer::SetPointerCursorMode(TPointerCursorMode aMode)
+	{iPointerCursorMode=aMode;}
+	
+inline TPointerCursorMode TWsPointer::PointerCursorMode()
+	{return iPointerCursorMode;}
+	
+inline TPoint TWsPointer::PointerCursorPos()
+	{return iPointers[iPrimaryPointer].iPos;}
+
+inline void TWsPointer::UnmatchedEventPurged(TPointerEvent::TType aPointerType, TWsEvent* aEventPurged)
+	{iPointers[TAdvancedPointerEventHelper::PointerNumber(*aEventPurged)].UnmatchedEventPurged(aPointerType, aEventPurged->Handle());}
+
+inline TBool TWsPointer::XyInput()
+	{return iXyInputType!=EXYInputNone;}
+
+/*
+EXYInputNone => no pointer, no moves.
+EXYInputPointer && !iIs3DPointer => drags only, no moves (allows mouse to behave like pen for emulator)
+EXYInputPointer && iIs3DPointer => drags and moves
+EXYInputMouse => drags and moves  
+EXYInputDeltaMouse => drags and moves
+*/
+inline TBool TWsPointer::MovesAvailable()
+	{return (iXyInputType!=EXYInputNone && ((iXyInputType!=EXYInputPointer)||iIs3DPointer));}
+
+inline TBool TWsPointer::DeltaMouse()
+	{return (iXyInputType==EXYInputDeltaMouse);}
+
+inline TInt TWsPointer::PrimaryPointer()
+	{return iPrimaryPointer;}
+
+/**
+Sets primary pointer to the one which was present before last run of UpdatePrimaryPointer() method.
+*/
+inline void TWsPointer::RollbackPrimaryPointer()
+	{iPrimaryPointer = iPreviousPrimaryPointer;}
+
+inline CWsWindow*& TWsPointer::RepeatWindow(TUint8 aPointerNumber)
+	{return iPointers[aPointerNumber].iRepeatWindow;}
+
+inline TRect& TWsPointer::RepeatRect(TUint8 aPointerNumber)
+	{return iPointers[aPointerNumber].iRepeatRect;}
+
+inline CWsPointerTimer*& TWsPointer::RepeatTimer(TUint8 aPointerNumber)
+	{return iPointers[aPointerNumber].iRepeatTimer;}
+
+inline TBool TWsPointer::PointerNumberInRange(TUint8 aPointerNumber)
+	{return (aPointerNumber<iMaxPointers);}
+
+#endif