windowing/windowserver/tman/TMPOINTR.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tman/TMPOINTR.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,808 @@
+// 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:
+// Test pointer event handling
+// 
+//
+
+#include <e32std.h>
+#include <hal.h>
+#include "W32STD.H"
+#include "../tlib/testbase.h"
+#include "TMAN.H"
+
+class CTPointerTest;
+class CGrabWindow;
+
+class CPointerWindow : public CTWin
+	{
+	enum {KRepeatMargin=200000};	// 0.2 Seconds
+	enum {KRepeatCount=4};
+	enum {KRepeatIntervalIncrements=100000};
+	enum {KRepeatRectXExtra=50};
+	enum {KRepeatRectYExtra=50};
+	enum {KStateWaitingForTest1,KStateFailed,KStateTesting1,
+			KStateWaitingForTest2,KStateTesting2,
+			KStateWaitingForTest3,KStateTesting3,
+			KStateWaitingForTest4,KStateTesting4,
+			KStateWaitingForTest5,KStateTesting5,
+			KStateWaitingForTest6,KStateTesting6,
+			KStateWaitingForTest8,KStateTesting8,
+			KStateWaitingForTest7,KStateTesting7,
+			KStateFinished};
+public:
+	CPointerWindow(CTPointerTest *aTest);
+	void SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
+	void Draw();
+	void StartNextRepeatTest();
+	void QueueNextRepeat();
+	void PointerL(const TPointerEvent &aPointer,const TTime&);
+	void WinKeyL(const TKeyEvent &aKey,const TTime &aTime);
+private:
+	void SwitchOn(const TTime &);
+	void ResetTest(TInt aState);
+	void SetState(TInt aState);
+	void FinishedTests();
+	void TestFailed();
+private:
+	CTPointerTest *iTest;
+	TInt iRepeatCount;
+	TInt iState;
+	TTimeIntervalMicroSeconds32 iInterval;
+	TTime iPrevTime;
+	TRect iRepeatRect;
+	};
+
+class CGrabWindow2 : public CTWin
+	{
+public:
+	CGrabWindow2(CGrabWindow *aWindow);
+	void SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
+private:
+	void Draw();
+	void PointerL(const TPointerEvent &aPointer,const TTime&);
+private:
+	CGrabWindow *iGrabWindow;
+	};
+
+class CGrabWindow : public CTWin
+	{
+	enum {KGrabStateWaitingForDown,KGrabStateWaitingForDragOut,KGrabStateWaitingForUp,KGrabStateFinished,
+		KGrabStateWaitingForDown2,KGrabStateWaitingForUp2a,KGrabStateWaitingForDrag2,KGrabStateWaitingForUp2b,
+		KGrabStateWaitingForDown3,KGrabStateWaitingForUp3a,KGrabStateWaitingForUp3b,
+		KGrabStateWaitingForDown4,KGrabStateWaitingForUp4,
+		KGrabStateWaitingForDown5,KGrabStateWaitingForUp5,KGrabStateWaitingForDrag5,
+		KStateFailed};
+public:
+	CGrabWindow(CTPointerTest *aTest);
+	void Pointer2(const TPointerEvent &aPointer);
+	void SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
+	void WinKeyL(const TKeyEvent &aKey,const TTime &aTime);
+private:
+	void Draw();
+	void SetState(TInt aState);
+	void ResetTest();
+	void PointerL(const TPointerEvent &aPointer,const TTime&);
+	void TestFailed();
+	void FinishedTests();
+private:
+	TInt iState;
+	CTPointerTest *iTest;
+	};
+
+class CTPointerTest : public CTestBase
+	{
+public:
+	CTPointerTest();
+	~CTPointerTest();
+	TBool TestFailed();
+	TestState DoTestL();
+	void StartGrabTestL();
+	void ConstructL();
+	CGrabWindow2 *GrabWin2() const;
+	inline TBool Digitiser() const {return !iNoDigitiser;}
+private:
+	TInt doTestFailedL();
+private:
+	CPointerWindow *iRepeatWin;
+	CGrabWindow *iGrabWin;
+	CGrabWindow2 *iGrabWin2;
+	TSize iWinSize;
+	TInt iState;
+	TBool iOldPointerState;
+	TBool iNoDigitiser;
+	};
+
+GLDEF_C CTestBase *CreatePointerTest()
+	{
+	return(new(ELeave) CTPointerTest());
+	}
+
+CPointerWindow::CPointerWindow(CTPointerTest *aTest) : CTWin(), iTest(aTest)
+	{}
+
+void CPointerWindow::SetState(TInt aState)
+	{
+	iState=aState;
+	iWin.Invalidate();
+	switch(aState)
+		{
+		case KStateWaitingForTest1:
+		case KStateWaitingForTest2:
+		case KStateWaitingForTest3:
+		case KStateWaitingForTest4:
+		case KStateWaitingForTest5:
+		case KStateWaitingForTest6:
+		case KStateWaitingForTest8:
+		case KStateWaitingForTest7:
+			iRepeatRect=TRect();
+			break;
+		case KStateTesting8:
+			iWin.Close();
+			Client()->iWs.Flush();
+			User::After(500000);
+			FinishedTests();
+			break;
+		}
+	}
+
+void CPointerWindow::ResetTest(TInt aState)
+	{
+	TInt newState=KStateFinished;
+	switch(aState)
+		{
+		case KStateTesting1:
+			newState=KStateWaitingForTest1;
+			break;
+		case KStateTesting2:
+			newState=KStateWaitingForTest2;
+			break;
+		case KStateTesting3:
+			newState=KStateWaitingForTest3;
+			break;
+		case KStateTesting4:
+			newState=KStateWaitingForTest4;
+			break;
+		case KStateTesting5:
+			newState=KStateWaitingForTest5;
+			break;
+		case KStateTesting6:
+			newState=KStateWaitingForTest6;
+			break;
+		case KStateTesting8:
+			newState=KStateWaitingForTest8;
+			break;
+		case KStateTesting7:
+			newState=KStateWaitingForTest7;
+			break;
+		}
+	SetState(newState);
+	}
+
+void CPointerWindow::SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
+	{
+	ConstructExtLD(*parent,pos,size);
+	Activate();
+	AssignGC(aGc);
+	//SetState(KStateWaitingForTest1);
+	SetState(KStateWaitingForTest7);		//Only unconverted test
+	BaseWin()->EnableOnEvents();
+	}
+
+void CPointerWindow::Draw()
+	{
+	iGc->Clear();
+	iGc->DrawRect(Size());
+	iGc->DrawRect(iRepeatRect);
+	TBuf<0x80> buf;
+	TBuf<0x80> buf2;
+	switch(iState)
+		{
+		case KStateWaitingForTest1:
+			buf.Format(_L("Click anywhere in the window and hold the pointer steady"));
+			break;
+		case KStateTesting1:
+			buf.Format(_L("Hold pointer inside the box"));
+			break;
+		case KStateWaitingForTest2:
+			buf.Format(_L("Release the pointer then click in the window and hold the pointer steady"));
+			break;
+		case KStateTesting2:
+			buf.Format(_L("Drag the pointer outside the box"));
+			break;
+		case KStateWaitingForTest3:
+			buf.Format(_L("Release the pointer then click in the window and hold the pointer steady"));
+			break;
+		case KStateTesting3:
+			buf.Format(_L("Release the pointer"));
+			break;
+		case KStateWaitingForTest4:
+			buf.Format(_L("Click anywhere in the window and move the pointer slightly"));
+			break;
+		case KStateTesting4:
+			buf.Format(_L("Release the pointer"));
+			break;
+		case KStateWaitingForTest5:
+			buf.Format(_L("Click anywhere in the window and move the pointer slightly"));
+			break;
+		case KStateTesting5:
+			buf.Format(_L("Release the pointer"));
+			break;
+		case KStateWaitingForTest6:
+			buf.Format(_L("Click anywhere in the window"));
+			break;
+		case KStateTesting6:
+			buf.Format(_L("Move the pointer"));
+			break;
+		case KStateWaitingForTest8:
+			buf.Format(_L("Click anywhere in the window, and keep the pointer pressed"));
+			break;
+		case KStateTesting8:
+			buf.Format(_L(""));
+			break;
+		case KStateWaitingForTest7:
+			buf.Format(_L("Switch off and touch the center of the screen"));
+			break;
+		case KStateTesting7:
+			buf.Format(_L(""));
+			break;
+		}
+	switch(iState)
+		{
+		case KStateTesting1:
+			buf2.Format(TRefByValue<const TDesC>(_L("Repeat (%d/%d), interval=%d.%d")),iRepeatCount,KRepeatCount,iInterval.Int()/1000000,(iInterval.Int()%1000000)/100000);
+			break;
+		case KStateTesting2:
+		case KStateTesting3:
+			buf2.Format(TRefByValue<const TDesC>(_L("Repeat (%d), interval=%d.%d")),iRepeatCount,iInterval.Int()/1000000,(iInterval.Int()%1000000)/100000);
+			break;
+		}
+	iGc->DrawText(buf,TPoint(10,20));
+	iGc->DrawText(buf2,TPoint(10,40));
+	}
+
+void CPointerWindow::FinishedTests()
+	{
+	iState=KStateFinished;
+	iTest->Request();
+	}
+
+void CPointerWindow::StartNextRepeatTest()
+	{
+	iInterval=0;
+	iRepeatCount=0;
+	if (iState==KStateWaitingForTest4)
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+	else if (iState==KStateWaitingForTest5)
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+	QueueNextRepeat();
+	switch(iState)
+		{
+		case KStateWaitingForTest1:
+			SetState(KStateTesting1);
+			break;
+		case KStateWaitingForTest2:
+			SetState(KStateTesting2);
+			break;
+		case KStateWaitingForTest3:
+			SetState(KStateTesting3);
+			break;
+		case KStateWaitingForTest4:
+			SetState(KStateTesting4);
+			break;
+		case KStateWaitingForTest5:
+			SetState(KStateTesting5);
+			break;
+		case KStateWaitingForTest6:
+			SetState(KStateTesting6);
+			break;
+		case KStateWaitingForTest8:
+			SetState(KStateTesting8);
+			break;
+		case KStateWaitingForTest7:
+			SetState(KStateTesting7);
+			break;
+		}
+	}
+
+void CPointerWindow::QueueNextRepeat()
+	{
+	iInterval=iInterval.Int()+KRepeatIntervalIncrements;
+	iWin.RequestPointerRepeatEvent(TTimeIntervalMicroSeconds32(iInterval),TRect(iRepeatRect));
+	iPrevTime.HomeTime();
+	iWin.Invalidate();
+	}
+
+void CPointerWindow::PointerL(const TPointerEvent &aPointer,const TTime &aTime)
+	{
+	if (aPointer.iType==TPointerEvent::EButtonRepeat)
+		{
+		if (iState!=KStateTesting1 && iState!=KStateTesting2 && iState!=KStateTesting3 && iState!=KStateTesting4)
+			TestFailed();
+		else
+			{
+			TTimeIntervalMicroSeconds32 interval(I64LOW(aTime.MicroSecondsFrom(iPrevTime).Int64()));
+			if (interval.Int()<(iInterval.Int()-KRepeatMargin) || interval.Int()>(iInterval.Int()+KRepeatMargin))
+				TestFailed();
+			else
+				{
+				if (!iRepeatRect.Contains(aPointer.iPosition) ||
+					aPointer.iParentPosition!=(aPointer.iPosition+iWin.InquireOffset(*Parent()->WinTreeNode())))
+					TestFailed();
+				else
+					{
+					iRepeatCount++;
+					if (iState==KStateTesting1 && iRepeatCount==KRepeatCount)
+						{
+						QueueNextRepeat();
+						Client()->iWs.Flush();
+						User::After(TTimeIntervalMicroSeconds32(iRepeatCount*KRepeatIntervalIncrements));
+						iWin.CancelPointerRepeatEventRequest();
+						SetState(KStateWaitingForTest2);
+						}
+					else
+						QueueNextRepeat();
+					}
+				}
+			}
+		}
+	else switch(iState)
+		{
+		case KStateWaitingForTest1:
+		case KStateWaitingForTest2:
+		case KStateWaitingForTest3:
+		case KStateWaitingForTest4:
+		case KStateWaitingForTest8:
+			if (aPointer.iType==TPointerEvent::EButton1Down)
+				{
+				iRepeatRect.iTl=aPointer.iPosition-TPoint(KRepeatRectXExtra,KRepeatRectYExtra);
+				iRepeatRect.iBr=aPointer.iPosition+TPoint(KRepeatRectXExtra,KRepeatRectYExtra);
+				StartNextRepeatTest();
+				}
+			break;
+		case KStateWaitingForTest5:
+			if (aPointer.iType==TPointerEvent::EButton1Down)
+				{
+				iRepeatRect.iTl=aPointer.iPosition;
+				iRepeatRect.iBr=aPointer.iPosition+TPoint(1,1);
+				StartNextRepeatTest();
+				}
+			break;
+		case KStateWaitingForTest6:
+			if (aPointer.iType==TPointerEvent::EButton1Down)
+				{
+				iRepeatRect.iTl=aPointer.iPosition+TPoint(KRepeatRectXExtra,KRepeatRectYExtra);
+				iRepeatRect.iBr=aPointer.iPosition+TPoint(2*KRepeatRectXExtra,2*KRepeatRectYExtra);
+				StartNextRepeatTest();
+				}
+			break;
+		case KStateTesting1:
+			TestFailed();
+			break;
+		case KStateTesting2:
+			if (aPointer.iType==TPointerEvent::EDrag)
+				SetState(KStateWaitingForTest3);
+			else
+				TestFailed();
+			break;
+		case KStateTesting3:
+			if (aPointer.iType==TPointerEvent::EButton1Up)
+				SetState(KStateWaitingForTest4);
+			else
+				TestFailed();
+			break;
+		case KStateTesting4:
+			if (aPointer.iType==TPointerEvent::EButton1Up)
+				SetState(KStateWaitingForTest5);
+			else
+				TestFailed();
+			break;
+		case KStateTesting5:
+			if (aPointer.iType==TPointerEvent::EButton1Up)
+				SetState(KStateWaitingForTest6);
+			else if (aPointer.iType!=TPointerEvent::EDrag)
+				TestFailed();
+			break;
+		case KStateTesting6:
+			if (aPointer.iType==TPointerEvent::EDrag)
+				{
+		#if !defined(__WINS__)	// Can't emulate touching dig when switched off under WINS
+				if (iTest->Digitiser())
+					SetState(KStateWaitingForTest7);
+				else
+		#endif
+					SetState(KStateWaitingForTest8);
+				}
+			else
+				TestFailed();
+			break;
+		case KStateWaitingForTest7:
+			if (aPointer.iType==TPointerEvent::EButton1Down || aPointer.iType==TPointerEvent::ESwitchOn)
+				TestFailed();
+			break;
+		case KStateTesting7:
+			if (aPointer.iType!=TPointerEvent::ESwitchOn)
+				TestFailed();
+			else
+				SetState(KStateTesting8);		//Jump straight to end as this is only unconverted test.
+				//SetState(KStateWaitingForTest8);
+			break;
+		case KStateTesting8:
+			break;
+		}
+	}
+
+void CPointerWindow::TestFailed()
+	{
+	if (iState!=KStateFailed)
+		{
+		TInt oldState=iState;
+		iState=KStateFailed;
+		if (iTest->TestFailed())
+			ResetTest(oldState);
+		}
+	}
+
+void CPointerWindow::WinKeyL(const TKeyEvent &aKey,const TTime &)
+	{
+	if (aKey.iCode==EKeyEscape)
+		FinishedTests();	// Simply skip this test if the Escape key is pressed
+	}
+
+void CPointerWindow::SwitchOn(const TTime &)
+	{
+	if (iState==KStateWaitingForTest7)
+		SetState(KStateTesting7);
+	else
+		TestFailed();
+	}
+
+//
+// CGrabWindow //
+//
+
+CGrabWindow::CGrabWindow(CTPointerTest *aTest) : iTest(aTest)
+	{
+	}
+
+void CGrabWindow::SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
+	{
+	ConstructExtLD(*parent,pos,size);
+	Activate();
+	AssignGC(aGc);
+	SetState(KGrabStateWaitingForDown);
+	}
+
+void CGrabWindow::Draw()
+	{
+	iGc->Clear();
+	iGc->DrawRect(Size());
+	TBuf<0x80> buf;
+	switch(iState)
+		{
+		case KGrabStateWaitingForDown:
+		case KGrabStateWaitingForDown2:
+		case KGrabStateWaitingForDown5:
+			buf.Copy(_L("Press the pointer inside the window"));
+			break;
+		case KGrabStateWaitingForDown3:
+		case KGrabStateWaitingForUp3a:
+			buf.Copy(_L("Press and release the pointer inside the window"));
+			break;
+		case KGrabStateWaitingForDragOut:
+			buf.Copy(_L("Drag the pointer outside into the outside window"));
+			break;
+		case KGrabStateWaitingForDrag2:
+			buf.Copy(_L("Drag the pointer outside outside both windows"));
+			break;
+		case KGrabStateWaitingForUp:
+		case KGrabStateWaitingForUp2b:
+		case KGrabStateWaitingForUp5:
+			buf.Copy(_L("Release the pointer"));
+			break;
+		case KGrabStateWaitingForDown4:
+			buf.Copy(_L("Press then release the pointer"));
+			break;
+		default:;
+		}
+	iGc->DrawText(buf,TPoint(10,20));
+	}
+
+void CGrabWindow::PointerL(const TPointerEvent &aPointer,const TTime&)
+	{
+	switch(iState)
+		{
+		case KGrabStateWaitingForDown:
+			if (aPointer.iType==TPointerEvent::EButton1Down)
+				SetState(KGrabStateWaitingForDragOut);
+			break;
+		case KGrabStateWaitingForDragOut:
+			if (aPointer.iType!=TPointerEvent::EDrag)
+				TestFailed();
+			else
+				{
+				if (!TRect(Size()).Contains(aPointer.iPosition))
+					SetState(KGrabStateWaitingForUp);
+				}
+			break;
+		case KGrabStateWaitingForUp:
+			if (aPointer.iType==TPointerEvent::EDrag)
+				break;
+			if (aPointer.iType==TPointerEvent::EButton1Up)
+				SetState(KGrabStateWaitingForDown2);
+			else
+				TestFailed();
+			break;
+		case KGrabStateWaitingForDown2:
+			if (aPointer.iType!=TPointerEvent::EButton1Down)
+				TestFailed();
+			else
+				{
+				iTest->GrabWin2()->BaseWin()->ClaimPointerGrab();
+				iTest->GrabWin2()->BaseWin()->ClaimPointerGrab();	// Call twice to check it's harmless
+				SetState(KGrabStateWaitingForUp2a);
+				}
+			break;
+		case KGrabStateWaitingForUp2a:
+			SetState(KGrabStateWaitingForDrag2);
+			break;
+		case KGrabStateWaitingForDrag2:
+			break;
+		case KGrabStateWaitingForUp2b:
+			TestFailed();
+			break;
+		case KGrabStateWaitingForDown3:
+			if (aPointer.iType!=TPointerEvent::EButton1Down)
+				TestFailed();
+			else
+				SetState(KGrabStateWaitingForUp3a);
+			break;
+		case KGrabStateWaitingForUp3a:
+			if (aPointer.iType==TPointerEvent::EButton1Up)
+				{
+				iTest->GrabWin2()->BaseWin()->ClaimPointerGrab();
+				SetState(KGrabStateWaitingForUp3b);
+				}
+			break;
+		case KGrabStateWaitingForUp3b:
+			TestFailed();
+			break;
+		case KGrabStateWaitingForDown5:
+			if (aPointer.iType!=TPointerEvent::EButton1Down)
+				TestFailed();
+			else
+				{
+				iTest->GrabWin2()->BaseWin()->ClaimPointerGrab(EFalse);
+				SetState(KGrabStateWaitingForDrag5);
+				}
+			break;
+		case KGrabStateWaitingForDrag5:
+			if (aPointer.iType==TPointerEvent::EButton1Up)
+				TestFailed();
+			break;
+		case KGrabStateWaitingForUp5:
+			TestFailed();
+			break;
+		case KGrabStateWaitingForDown4:
+			SetState(KGrabStateWaitingForUp4);
+			iWin.Close();	// Close the window with the grab captured in it
+			break;
+		case KGrabStateFinished:
+			break;
+		}
+	}
+
+void CGrabWindow::ResetTest()
+	{
+	SetState(KGrabStateWaitingForDown);
+	}
+
+void CGrabWindow::Pointer2(const TPointerEvent &aPointer)
+	{
+	switch(iState)
+		{
+		case KGrabStateWaitingForDrag2:
+			{
+			if (aPointer.iType==TPointerEvent::EDrag)
+				{
+				SetState(KGrabStateWaitingForUp2b);
+				}
+			else
+				{
+				if (iTest->TestFailed())
+					ResetTest();
+				}
+			break;
+			}
+		case KGrabStateWaitingForUp2b:
+			if (aPointer.iType==TPointerEvent::EDrag)	// Harmless
+				break;
+			if (aPointer.iType==TPointerEvent::EButton1Up)
+				SetState(KGrabStateWaitingForDown3);
+			else
+				TestFailed();
+			break;
+		case KGrabStateWaitingForUp3b:
+			if (aPointer.iType==TPointerEvent::EButton1Up)
+				SetState(KGrabStateWaitingForDown5);
+			else
+				TestFailed();
+			break;
+		case KGrabStateWaitingForUp4:
+			FinishedTests();
+			break;
+		case KGrabStateWaitingForDrag5:
+			{
+			if (aPointer.iType==TPointerEvent::EDrag)
+				SetState(KGrabStateWaitingForUp5);
+			else if (iTest->TestFailed())
+				ResetTest();
+			break;
+			}
+		case KGrabStateWaitingForUp5:
+			if (aPointer.iType==TPointerEvent::EDrag)	// Harmless
+				break;
+			if (aPointer.iType==TPointerEvent::EButton1Up)
+				SetState(KGrabStateWaitingForDown4);
+			else
+				TestFailed();
+			break;
+		default:;
+		}
+	}
+
+void CGrabWindow::SetState(TInt aState)
+	{
+	iState=aState;
+	iWin.Invalidate();
+	}
+
+void CGrabWindow::TestFailed()
+	{
+	if (iState!=KStateFailed)
+		{
+		iState=KStateFailed;
+		if (iTest->TestFailed())
+			ResetTest();
+		}
+	}
+
+void CGrabWindow::FinishedTests()
+	{
+	iState=KGrabStateFinished;
+	iTest->Request();
+	}
+
+void CGrabWindow::WinKeyL(const TKeyEvent &aKey,const TTime &)
+	{
+	if (aKey.iCode==EKeyEscape)
+		FinishedTests();	// Simply skip this test if the Escape key is pressed
+	}
+
+//
+// CGrabWindow2, used as part of grab tests //
+//
+
+CGrabWindow2::CGrabWindow2(CGrabWindow *aWindow) : iGrabWindow(aWindow)
+	{
+	}
+
+void CGrabWindow2::Draw()
+	{
+	iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	iGc->SetBrushColor(TRgb::Gray4(2));
+	iGc->DrawRect(Size());
+	}
+
+void CGrabWindow2::PointerL(const TPointerEvent &aPointer,const TTime&)
+	{
+	iGrabWindow->Pointer2(aPointer);
+	}
+
+//
+// CTPointTest //
+//
+
+CTPointerTest::CTPointerTest() : CTestBase(_L("CTPointerTest"))
+	{}
+
+CTPointerTest::~CTPointerTest()
+	{
+	HAL::Set(HALData::EPenDisplayOn,iOldPointerState);
+	delete iRepeatWin;
+	delete iGrabWin;
+	delete iGrabWin2;
+	Client()->ResetFocus();
+	}
+
+void CTPointerTest::ConstructL()
+	{
+	iRepeatWin=new(ELeave) CPointerWindow(this);
+	TSize screenSize(Client()->iScreen->SizeInPixels());
+	iRepeatWin->SetUpLD(TPoint(screenSize.iWidth/8,screenSize.iHeight/8),TSize(screenSize.iWidth*3/4,screenSize.iHeight*3/4),Client()->iGroup,*Client()->iGc);
+	Client()->iGroup->SetCurrentWindow(iRepeatWin);
+	iNoDigitiser=EFalse;
+	TInt err=HAL::Get(HALData::EPenDisplayOn,iOldPointerState);
+	if (err==KErrNotSupported)
+		iNoDigitiser=ETrue;
+	else if (err==KErrNone)
+		err=HAL::Set(HALData::EPenDisplayOn,ETrue);
+	if (err==KErrNotSupported)
+		iNoDigitiser=(!iOldPointerState);
+	else
+		TestL(err==KErrNone);
+	}
+
+TBool CTPointerTest::TestFailed()
+	{
+	TInt ret=1;
+	TRAP_IGNORE(ret=doTestFailedL());
+	switch(ret)
+		{
+		case 0:
+			return(ETrue);	// Re-try test
+		case 1:
+			Request();
+			break;
+		}
+	return(EFalse);
+	}
+
+TInt CTPointerTest::doTestFailedL()
+	{
+	CTDialog *dialog=new(ELeave) CTDialog();
+	dialog->SetTitle(_L("Pointer repeat test failed"));
+	dialog->SetNumButtons(2);
+	dialog->SetButtonText(0,_L("Retest"));
+	dialog->SetButtonText(1,_L("Fail"));
+	dialog->ConstructLD(*Client()->iGroup,*Client()->iGc);
+	return dialog->Display();
+	}
+
+CGrabWindow2 *CTPointerTest::GrabWin2() const
+	{
+	return(iGrabWin2);
+	}
+
+void CTPointerTest::StartGrabTestL()
+	{
+	iGrabWin=new(ELeave) CGrabWindow(this);
+	iGrabWin2=new(ELeave) CGrabWindow2(iGrabWin);
+//
+	TSize screenSize(Client()->iScreen->SizeInPixels());
+	iGrabWin2->SetUpL(TPoint(screenSize.iWidth/8,screenSize.iHeight/8),TSize(screenSize.iWidth*3/4,screenSize.iHeight*3/4),Client()->iGroup,*Client()->iGc);
+	Client()->iGroup->SetCurrentWindow(iGrabWin2);
+//
+	iGrabWin->SetUpLD(TPoint(screenSize.iWidth/4,screenSize.iHeight/4),TSize(screenSize.iWidth/2,screenSize.iHeight/2),Client()->iGroup,*Client()->iGc);
+	Client()->iGroup->SetCurrentWindow(iGrabWin);
+//
+	}
+
+#pragma warning( disable : 4065 )	//switch statement contains 'default' but no 'case' labels
+TestState CTPointerTest::DoTestL()
+	{
+	switch(iState)
+		{
+	#if !defined(__WINS__)		//Only unconverted test is MARM only
+		case 0:
+			LogSubTest(_L("Repeat tests"),1);
+			iState++;
+			return(EContinue);
+	#endif
+		
+		default:
+			return(EFinished);
+		}
+	}
+#pragma warning( default : 4065 )
+