--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tsrc/xmltestharness/xmlclient/src/windowmanager.cpp Wed Aug 25 12:40:50 2010 +0300
@@ -0,0 +1,181 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+/**
+@file
+@internalComponent
+*/
+
+#include "windowmanager.h"
+
+CWindowManager* CWindowManager::NewL()
+ {
+ CWindowManager* self = new(ELeave) CWindowManager();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CWindowManager::CWindowManager():
+CActive(EPriorityStandard)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+void CWindowManager::ConstructL()
+ {
+ User::LeaveIfError(iMsgQueue.CreateLocal(1));
+ User::LeaveIfError(iSemaphore.CreateLocal(0));
+
+ User::LeaveIfError(iWsSession.Connect());
+ // Create the Screen device for the WServ session.
+ iWsSd = new (ELeave) CWsScreenDevice(iWsSession);
+ User::LeaveIfError(iWsSd->Construct());
+ // Create a Window Group.
+ iWindowGroup = RWindowGroup(iWsSession);
+ User::LeaveIfError(iWindowGroup.Construct((TUint32)this, ETrue));
+ iWindow = new (ELeave) RWindow(iWsSession);
+ User::LeaveIfError(iWindow->Construct(iWindowGroup, ((TUint32)(this)) + 1));
+
+ // Reset the screen mode.
+ if(iWsSd->CurrentScreenMode() != 0)
+ {
+ iWsSd->SetAppScreenMode(0);
+ iWsSd->SetScreenMode(0);
+ }
+
+ iScreenSize = iWsSd->SizeInPixels();
+ iWindow->SetExtent(TPoint(0,0), iScreenSize);
+ iWindow->SetVisible(ETrue);
+ iWindow->Activate();
+
+ User::LeaveIfError(iWindow->SetRequiredDisplayMode(EColor16MA));
+
+ // TODO - this forcing of transparency may not be needed, as there is
+ // a defect in the graphics component right now
+ // force the transparency change to take place
+ iWindow->SetBackgroundColor(TRgb(0x000000, 0));
+ iWindow->BeginRedraw();
+ iWindow->EndRedraw();
+ iWsSession.Flush();
+
+ iCreatorThreadId = RThread().Id();
+
+ SetActive();
+ iMsgQueue.NotifyDataAvailable(iStatus);
+ }
+
+CWindowManager::~CWindowManager()
+ {
+ Cancel();
+ if(iWindow)
+ {
+ iWindow->Close();
+ delete iWindow;
+ }
+ iWindowGroup.Close();
+ delete iWsSd;
+ iWsSession.Close();
+
+ iSemaphore.Close();
+ iMsgQueue.Close();
+ }
+
+void CWindowManager::RunL()
+ {
+ TMessage msg;
+ TInt err = iMsgQueue.Receive(msg);
+ if(err != KErrNone && err != KErrUnderflow)
+ {
+ iReturnCode = err;
+ }
+ else
+ {
+ iReturnCode = DoCommand(msg.iCommand, msg.iParam1, msg.iParam2);
+ }
+ SetActive();
+ iMsgQueue.NotifyDataAvailable(iStatus);
+ iSemaphore.Signal();
+ }
+
+void CWindowManager::DoCancel()
+ {
+ iMsgQueue.CancelDataAvailable();
+ }
+
+TInt CWindowManager::RegisterSurface(TSurfaceId& aSurfaceId)
+ {
+ return RunCommand(ERegisterSurface, &aSurfaceId);
+ }
+
+TInt CWindowManager::SetBackgroundSurface(TSurfaceConfiguration& aSurfaceConfig, TBool aTriggerRedraw)
+ {
+ return RunCommand(ESetBackgroundSurface, &aSurfaceConfig, aTriggerRedraw);
+ }
+
+TInt CWindowManager::RunCommand(TCommand aCommand, TAny* aParam1, TInt aParam2)
+ {
+ if(RThread().Id() == iCreatorThreadId)
+ {
+ return DoCommand(aCommand, aParam1, aParam2);
+ }
+ else
+ {
+ TMessage msg;
+ msg.iCommand = aCommand;
+ msg.iParam1 = aParam1;
+ msg.iParam2 = aParam2;
+ iMsgQueue.SendBlocking(msg);
+ iSemaphore.Wait();
+ return iReturnCode;
+ }
+ }
+
+TInt CWindowManager::DoCommand(TCommand aCommand, TAny* aParam1, TInt aParam2)
+ {
+ switch(aCommand)
+ {
+ case ERegisterSurface:
+ {
+ TSurfaceId& surfaceId = *reinterpret_cast<TSurfaceId*>(aParam1);
+ return iWsSession.RegisterSurface(iWsSd->GetScreenNumber(), surfaceId);
+ }
+ case ESetBackgroundSurface:
+ {
+ TSurfaceConfiguration& surfaceConfig = *reinterpret_cast<TSurfaceConfiguration*>(aParam1);
+ TBool triggerRedraw = aParam2;
+ return iWindow->SetBackgroundSurface(surfaceConfig, triggerRedraw);
+ }
+ default:
+ {
+ User::Invariant();
+ return KErrNone;
+ }
+ }
+ }
+
+TSize CWindowManager::ScreenSize() const
+ {
+ return iScreenSize;
+ }
+
+void CWindowManager::Flush()
+ {
+ iWsSession.Flush();
+ }