Fix def files so that the implementation agnostic interface definition has no non-standards defined entry points, and change the eglrefimpl specific implementation to place its private entry points high up in the ordinal order space in the implementation region, not the standards based entrypoints region.
// 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 )