windowing/windowserver/tman/TMTScrMd.CPP
author Faisal Memon <faisal.memon@nokia.com>
Fri, 25 Jun 2010 17:49:58 +0100
branchEGL_MERGE
changeset 105 158b2308cc08
parent 0 5d03bc08d59c
permissions -rw-r--r--
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) 2000-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:
// Screen mode changing tests
// 
//

#include <e32std.h>
#include <e32def_private.h>
#include "W32STD.H"
#include "../tlib/testbase.h"
#include "TMAN.H"

class CTimeWindow;

class CQBlankWindow : public CBlankWindow
	{
public:
	static TInt iInitialColor;
public:
	//Virtual function from CTBaseWin
	void InitWin();
public:
	static TSize iSize;
	TSglQueLink iLink;
	};

class CFixScreenModeGroup : public CTWindowGroup
	{
public:
	static TInt iNoClientWins;
public:
	~CFixScreenModeGroup();
	CFixScreenModeGroup(CTClient *aClient);
	void ConstructL();
public:
	TSglQueLink iLink;
private:
	TSglQue<CQBlankWindow> iWindows;
	};

class CFlipClient : public CTClient
	{
public:
	void ConstructL();
private:
	};

class CScreenModeTimes : public CTestBase
	{
public:
	CScreenModeTimes();
	~CScreenModeTimes();
	TestState DoTestL();
	void ConstructL();
	void DoTimings();
private:
	void CreateGroupL(CTClient* aClient,TSglQue<CFixScreenModeGroup>& aQue);
	void DeleteGroups(TSglQue<CFixScreenModeGroup>& aQue);
	void BringToFront(TSglQue<CFixScreenModeGroup>& aQue);
private:
	TScreenModeEnforcement iEnforcementMode;
	CInfoDialog* iDialogue;
	CTimeWindow* iInfoWindow;
	CFlipClient* iFlipClient;
	TSglQue<CFixScreenModeGroup> iNormalGroupQue;
	TSglQue<CFixScreenModeGroup> iFlipGroupQue;
	TInt iNoGroupWins;
	TInt iState;
	};

class CTimeWindow : public CTTitledWindow
	{
public:
	void Construct(CTestBase* aTest);
	void SetNumWindows(TInt aGroup,TInt aWin);
	void SetTime1(TTimeIntervalMicroSeconds& aTime);
	void SetTime2(TTimeIntervalMicroSeconds& aTime);
	void DoDraw();
	//virtual function from CTWinBase overridden by CTBaseWin
	void WinKeyL(const TKeyEvent &aKey,const TTime &aTime);
	//virtual functions from CTBaseWin
	void SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
	void PointerL(const TPointerEvent &aPointer,const TTime &aTime);
	//virtual function from CTBaseWin overridden by CTTitledWindow
	void Draw();
private:
	inline CScreenModeTimes* Test() {return STATIC_CAST(CScreenModeTimes*,iTest);}
	void UpdateString1();
	void UpdateString2();
	void UpdateString3();
private:
	CTestBase* iTest;
	TInt iNumGroups;
	TInt iNumWins;
	TTimeIntervalMicroSeconds iTime1;
	TTimeIntervalMicroSeconds iTime2;
	TBuf<32> iString1;
	TBuf<32> iString2;
	TBuf<32> iString3;
	TBuf<32> iString4;
	TRect iRect1;
	TRect iRect2;
	TRect iRect3;
	TRect iRect4;
	TBool iPressed;
	TBool iExit;
	};


TSize CQBlankWindow::iSize;
TInt CQBlankWindow::iInitialColor;
TInt CFixScreenModeGroup::iNoClientWins=0;


GLDEF_C CTestBase *CreateScreenModeTimes()
	{
	return(new(ELeave) CScreenModeTimes());
	}


//
// CFlipClient
//

void CFlipClient::ConstructL()
	{
	CTClient::ConstructL();
	TPixelsAndRotation sizeAndRotation;
	iScreen->GetScreenModeSizeAndRotation(1,sizeAndRotation);
	iScreen->SetScreenSizeAndRotation(sizeAndRotation);
	}


//
// CTimeWindow
//

void CTimeWindow::Construct(CTestBase* aTest)
	{
	_LIT(Title,"StatusWindow");
	_LIT(String4,"Click here to finish");
	const TInt fontHeight=iFont->HeightInPixels();
	iTest=aTest;
	TWindowTitle title(Title);
	SetTitle(title);
	TInt yy=iTitleHeight+fontHeight+7;
	iRect1.SetRect(3,iTitleHeight+5,iSize.iWidth-1,yy);
	yy+=fontHeight/2;
	TInt yy1=yy+fontHeight+2;
	iRect2.SetRect(3,yy+3,iSize.iWidth-1,yy1);
	TInt yy2=yy1+iFont->HeightInPixels()+2;
	iRect3.SetRect(3,yy1+3,iSize.iWidth-1,yy2);
	yy2+=fontHeight/2;
	iRect4.SetRect(3,yy2+3,iSize.iWidth-1,yy2+iFont->HeightInPixels()+2);
	//
	iString4.Copy(String4);
	iExit=EFalse;
	}

void CTimeWindow::SetUpL(TPoint aPos,TSize aSize,CTWinBase *aParent,CWindowGc &aGc)
	{
	CTTitledWindow::SetUpL(aPos,aSize,aParent,aGc);
	}

void CTimeWindow::WinKeyL(const TKeyEvent &aKey,const TTime&)
	{
	switch(aKey.iCode)
		{
		case EKeyEscape:
			iTest->Request();
			break;
		default:;
		}
	}

void CTimeWindow::PointerL(const TPointerEvent &aPointer,const TTime &aTime)
	{
	if (iRect2.Contains(aPointer.iPosition) || iRect3.Contains(aPointer.iPosition))
		{
		if (aPointer.iType==TPointerEvent::EButton1Down)
			iPressed=ETrue;
		}
	else if (iRect4.Contains(aPointer.iPosition))
		iExit=ETrue;
	else
		CTTitledWindow::PointerL(aPointer,aTime);
	if ((iExit||iPressed) && aPointer.iType==TPointerEvent::EButton1Up)
		{
		if (iExit)
			iTest->Request();
		else
			{
			Test()->DoTimings();
			DoDraw();
			}
		}
	}

void CTimeWindow::Draw()
	{
	CTTitledWindow::Draw();
	TInt ascent=iFont->AscentInPixels()+1;
	iGc->DrawText(iString1,iRect1,ascent,CGraphicsContext::ELeft);
	iGc->DrawText(iString2,iRect2,ascent,CGraphicsContext::ELeft);
	iGc->DrawText(iString3,iRect3,ascent,CGraphicsContext::ELeft);
	iGc->DrawText(iString4,iRect4,ascent,CGraphicsContext::ELeft);
	}

void CTimeWindow::DoDraw()
	{
	iGc->Activate(iWin);
	iGc->UseFont((CFont *)iFont);
	Draw();
	iGc->Deactivate();
	}

void CTimeWindow::SetNumWindows(TInt aGroups,TInt aWins)
	{
	iNumGroups=aGroups;
	iNumWins=aWins;
	UpdateString1();
	}

void CTimeWindow::UpdateString1()
	{
	_LIT(NumberWin,"Groups (2x)%d, Windows %d");
	iString1.Format(NumberWin,iNumGroups,iNumWins);
	}

void CTimeWindow::SetTime1(TTimeIntervalMicroSeconds& aTime)
	{
	iTime1=aTime;
	UpdateString2();
	}

void CTimeWindow::SetTime2(TTimeIntervalMicroSeconds& aTime)
	{
	iTime2=aTime;
	UpdateString3();
	}

_LIT(TimeFormat,"Time%d = %d.%04dsecs");

void CTimeWindow::UpdateString2()
	{
	TInt time = I64LOW(iTime1.Int64());
	iString2.Format(TimeFormat,1,time/1000000,(time%1000000)/100);
	}

void CTimeWindow::UpdateString3()
	{
	TInt time = I64LOW(iTime2.Int64());
	iString3.Format(TimeFormat,2,time/1000000,(time%1000000)/100);
	}


//
// CQBlankWindow
//

void CQBlankWindow::InitWin()
	{
	SetColor(TRgb::Gray4(iInitialColor));
	iWin.SetSize(iSize);
	}


//
// CFixScreenModeGroup
//

CFixScreenModeGroup::~CFixScreenModeGroup()
	{
	GroupWin()->EnableReceiptOfFocus(EFalse);
	ClearCurrentWindow();
	CQBlankWindow* win;
	while (!iWindows.IsEmpty())
		{
		win=iWindows.First();
		iWindows.Remove(*win);
		delete win;
		}
	}

CFixScreenModeGroup::CFixScreenModeGroup(CTClient *aClient) : CTWindowGroup(aClient), iWindows(_FOFF(CQBlankWindow,iLink))
	{}

void CFixScreenModeGroup::ConstructL()
	{
	CTWindowGroup::ConstructL();
	CQBlankWindow* win;
	TInt ii;
	for(ii=0;ii<iNoClientWins;++ii)
		{
		win=new(ELeave) CQBlankWindow();
		CleanupStack::PushL(win);
		win->ConstructL(*this);
		win->Activate();
		win->AssignGC(*iClient->iGc);
		iWindows.AddLast(*win);
		CleanupStack::Pop(win);
		Client()->Flush();
		}
	SetCurrentWindow(iWindows.First());
	}

/*void CFixScreenModeGroup::ScreenDeviceChanged()
	{
	iWindow->ScreenDeviceChanged();
	}*/


//
// CScreenModeTimes
//

_LIT(TestName,"Screen Mode Times");
CScreenModeTimes::CScreenModeTimes() : CTestBase(TestName)
								,iNormalGroupQue(_FOFF(CFixScreenModeGroup,iLink)),iFlipGroupQue(_FOFF(CFixScreenModeGroup,iLink))
	{}

CScreenModeTimes::~CScreenModeTimes()
	{
	Client()->iGroup->GroupWin()->EnableScreenChangeEvents();
	Client()->iScreen->SetScreenMode(0);
	DeleteGroups(iNormalGroupQue);
	DeleteGroups(iFlipGroupQue);
	Client()->iGroup->SetCurrentWindow(NULL);
	delete iFlipClient;
	delete iInfoWindow;
	if (iEnforcementMode==ESizeEnforcementNone)
		 Client()->iScreen->SetScreenModeEnforcement(ESizeEnforcementNone);
	}

void CScreenModeTimes::ConstructL()
	{
	iEnforcementMode=Client()->iScreen->ScreenModeEnforcement();
	if (iEnforcementMode==ESizeEnforcementNone)
		 Client()->iScreen->SetScreenModeEnforcement(ESizeEnforcementPixelsAndRotation);
	iDialogue=new(ELeave) CInfoDialog(Client()->iGroup,Client()->iGc);
	iDialogue->ConstructLD();
	iFlipClient=new(ELeave) CFlipClient();
	iFlipClient->ConstructL();
	Client()->iGroup->GroupWin()->DisableScreenChangeEvents();
	iNoGroupWins=12;		//20;
	CFixScreenModeGroup::iNoClientWins=20;		//30;
	TSize screenSize=Client()->iScreen->SizeInPixels();
	CQBlankWindow::iSize.iWidth=Max(screenSize.iHeight,screenSize.iWidth);
	CQBlankWindow::iSize.iHeight=CQBlankWindow::iSize.iWidth;
	TInt ii;
	for(ii=0;ii<iNoGroupWins;++ii)
		{
		CQBlankWindow::iInitialColor=1;
		CreateGroupL(Client(),iNormalGroupQue);
		CQBlankWindow::iInitialColor=2;
		CreateGroupL(iFlipClient,iFlipGroupQue);
		}
	Client()->iGroup->GroupWin()->SetOrdinalPosition(0);
	iInfoWindow=new(ELeave) CTimeWindow();
	iInfoWindow->SetUpL(TPoint(Max(Min(415,screenSize.iWidth-210),0),Min(50,screenSize.iHeight-180)),TSize(210,180),Client()->iGroup,*Client()->iGc);
	Client()->iGroup->SetCurrentWindow(iInfoWindow);
	iInfoWindow->Construct(this);
	iInfoWindow->WinTreeNode()->SetOrdinalPosition(1);
	iInfoWindow->SetNumWindows(iNoGroupWins,CFixScreenModeGroup::iNoClientWins);

	Client()->iGroup->GroupWin()->DisableScreenChangeEvents();
	Client()->iWs.SetAutoFlush(ETrue);
	iFlipClient->iWs.SetAutoFlush(ETrue);
	Client()->iWs.SetPointerCursorMode(EPointerCursorNone);
	}

void CScreenModeTimes::CreateGroupL(CTClient *aClient,TSglQue<CFixScreenModeGroup>& aQue)
	{
	CFixScreenModeGroup* group;
	group=new(ELeave) CFixScreenModeGroup(aClient);
	CleanupStack::PushL(group);
	group->ConstructL();
	aQue.AddLast(*group);
	CleanupStack::Pop(group);
	}

void CScreenModeTimes::DeleteGroups(TSglQue<CFixScreenModeGroup>& aQue)
	{
	CFixScreenModeGroup* group;
	while (!aQue.IsEmpty())
		{
		group=aQue.First();
		aQue.Remove(*group);
		delete group;
		}
	}

void CScreenModeTimes::BringToFront(TSglQue<CFixScreenModeGroup>& aQue)
	{
	TSglQueIter<CFixScreenModeGroup> iter(aQue);
	CFixScreenModeGroup* group=iter++;
	group->GroupWin()->SetOrdinalPosition(0);
	while ((group=iter++)!=NULL)
		group->GroupWin()->SetOrdinalPosition(1);
	}

void CScreenModeTimes::DoTimings()
	{
	//Timings 1 SCRDEV, DWsScreenDevice::CommandL, around call to SetScreenMode
	//Timings 2 GROUPWIN, CWsWindowGroup::SetScreenDeviceValidStates, around main body of function including calls to old way
	//Timings 3 CLIWIN, CWsTopClientWindow::SetScreenDeviceValidState, around call to ResetHiddenFlagAndAdjustRegions
	//Timings 3 GROUPWIN, CWsWindowGroup::SetScreenDeviceValidStates, around main body of function excluding calls to old way
	//Timings 4&5 CLIWIN, CWsClientWindow::ResetHiddenFlagAndAdjustRegions, going invisible and becomming visible sections
	Client()->iGroup->GroupWin()->SetOrdinalPosition(-2);
	Client()->Flush();
	TTime startTime;
	TTime middleTime;
	TTime endTime;
__PROFILE_START(0);
	startTime.HomeTime();
	BringToFront(iNormalGroupQue);
	Client()->iScreen->SetScreenMode(1);
	middleTime.HomeTime();
	BringToFront(iFlipGroupQue);
	Client()->iScreen->SetScreenMode(0);
	endTime.HomeTime();
__PROFILE_END(0);
#if defined(__PROFILING__)
	TProfile profile;
	RDebug::ProfileResult(&profile,3,1);
	if (profile.iCount>0)
		iDialogue->TimerResults(0);
#endif
	TTimeIntervalMicroSeconds time=middleTime.MicroSecondsFrom(startTime);
	iInfoWindow->SetTime1(time);
	time=endTime.MicroSecondsFrom(middleTime);
	iInfoWindow->SetTime2(time);
	Client()->iGroup->GroupWin()->SetOrdinalPosition(0);
#if defined(__PROFILING__)
	if (profile.iCount>0)
		iDialogue->Display();
#endif
	}

TestState CScreenModeTimes::DoTestL()
	{
	switch(iState)
		{
		case 0:
			LogSubTest(_L("Time ScreenMode Changes"),1);
			DoTimings();
			iState++;
			return EContinue;
		default:
			return EFinished;
		}
	}