windowing/windowserver/tman/TMTScrMd.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tman/TMTScrMd.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,463 @@
+// 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;
+		}
+	}