windowing/windowserver/tman/TMPOINTR.CPP
author Matt Plumtree <matt.plumtree@nokia.com>
Fri, 06 Aug 2010 17:05:20 +0100
branchNewGraphicsArchitecture
changeset 143 3db46cb3f779
parent 0 5d03bc08d59c
permissions -rw-r--r--
Fix TRANSPARENCY_NONE composition for surfaces narrower than the context. Improve performance of point sample scaling with 8-bit samples, by using fixed point code Allow any non-zero value for the boolean attribute WFC_ELEMENT_SOURCE_FLIP Simplify RemoveElement code

// 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 )