--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/appfw/viewserver/server/VWSWEVNT.CPP Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,285 @@
+// Copyright (c) 1999-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:
+//
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include "vwsinternal.h"
+#include "vwsdefpartner.h"
+#endif //SYMBIAN_ENABLE_SPLIT_HEADERS
+#include "VWSWEVNT.H"
+#include "VWSERVER.H"
+#include "VWSDEBUG.H"
+
+const TInt KPriorityNeverAtFront = -999;
+const TInt KPriorityAlwaysAtFront = 999;//Setting a priority greater than or equal to KPasswordWindowGroupPriority which is 1000,
+ //on a window group will require the capability SwEvent.If the client does not have
+ //this capability, then the window group priority will be reduced to KPasswordWindowGroupPriority - 1.
+ //As KPasswordWindowGroupPriority has been deprectated 999 is set as the priority.KPriorityAlwaysAtFront
+ //is used when calling SetOrdinalPosition API.
+
+
+//
+// CVwsWServEventHandler.
+//
+
+CVwsWServEventHandler::CVwsWServEventHandler(CVwsServer& aServer, RWsSession& aWsSession, TBool aIgnoreFirstScreenDeviceChangedEvent)
+ : CActive(CActive::EPriorityStandard),iServer(aServer),iWsSession(aWsSession),
+ iIgnoreNextScreenDeviceChangedEvent(aIgnoreFirstScreenDeviceChangedEvent)
+ {
+ }
+
+CVwsWServEventHandler::~CVwsWServEventHandler()
+ {
+ Cancel();
+ }
+
+CVwsWServEventHandler* CVwsWServEventHandler::NewL(CVwsServer& aServer, RWsSession& aWsSession, TBool aIgnoreFirstScreenDeviceChangedEvent)
+ {
+ CVwsWServEventHandler* self=new(ELeave) CVwsWServEventHandler(aServer, aWsSession, aIgnoreFirstScreenDeviceChangedEvent);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+void CVwsWServEventHandler::ConstructL()
+ {
+ CActiveScheduler::Add(this);
+ Queue();
+ }
+
+void CVwsWServEventHandler::Queue()
+ {
+ ASSERT (!IsActive());
+ iWsSession.EventReady(&iStatus);
+ SetActive();
+ }
+
+void CVwsWServEventHandler::RunL()
+ {
+ TWsEvent event;
+ iWsSession.GetEvent(event);
+ LOG3(CVwsLog::ELoud,_L("Received %d event type from WServ"),event.Type());
+ TInt err=KErrNone;
+ switch (event.Type())
+ {
+ case EEventScreenDeviceChanged:
+ if (iIgnoreNextScreenDeviceChangedEvent)
+ {
+ iIgnoreNextScreenDeviceChangedEvent = EFalse;
+ }
+ else
+ {
+ TRAP(err,iServer.HandleScreenDeviceChangedL());
+ }
+ break;
+ case EEventFocusGroupChanged:
+ iServer.HandleForegroundTaskChange();
+ break;
+ default:
+ break;
+ }
+
+ Queue();
+ User::LeaveIfError(err);
+ }
+
+void CVwsWServEventHandler::DoCancel()
+ {
+ iWsSession.EventReadyCancel();
+ }
+
+#ifdef _DEBUG
+TInt CVwsWServEventHandler::RunError(TInt aError)
+#else
+TInt CVwsWServEventHandler::RunError(TInt /*aError*/)
+#endif
+ {
+ LOG3(CVwsLog::ENormal,_L("CVwsWServEventHandler::RunError: %d"), aError);
+ iServer.KickStartEventQ();
+ return KErrNone;
+ }
+
+//
+// class CVwsWServRedrawer
+//
+
+CVwsWServRedrawer::CVwsWServRedrawer(RWsSession& aWsSession, CWindowGc& aGc, RWindow& aWindow)
+ : CActive(EPriorityLow),iWsSession(aWsSession),iGc(aGc),iWindow(aWindow),iOpaque(EFalse)
+ {
+ }
+
+CVwsWServRedrawer::~CVwsWServRedrawer()
+ {
+ Cancel();
+ }
+
+CVwsWServRedrawer* CVwsWServRedrawer::NewL(RWsSession& aWsSession, CWindowGc& aGc, RWindow& aWindow)
+ {
+ CVwsWServRedrawer* self=new(ELeave) CVwsWServRedrawer(aWsSession,aGc,aWindow);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+void CVwsWServRedrawer::ConstructL()
+ {
+ CActiveScheduler::Add(this);
+ Queue();
+ }
+
+void CVwsWServRedrawer::RunL()
+ {
+ TWsRedrawEvent redraw;
+ iWsSession.GetRedraw(redraw);
+ HandleRedrawEvent(redraw.Rect());
+ Queue();
+ }
+
+void CVwsWServRedrawer::Queue()
+ {
+ ASSERT (!IsActive());
+ iWsSession.RedrawReady(&iStatus);
+ SetActive();
+ }
+
+void CVwsWServRedrawer::DoCancel()
+ {
+ iWsSession.RedrawReadyCancel();
+ }
+
+void CVwsWServRedrawer::SetDrawMode(TBool aOpaque)
+ {
+ iOpaque=aOpaque;
+ }
+
+void CVwsWServRedrawer::HandleRedrawEvent(const TRect& aRect)
+ {
+ // this code is needed to make the screen redraw correctly
+ // after a screen mode switch.
+
+ LOG2(CVwsLog::ELoud,_L("CVwsWServRedrawer::HandleRedrawEvent"));
+ iGc.Activate(iWindow);
+ iWindow.BeginRedraw(aRect);
+ iWindow.EndRedraw();
+ iGc.Deactivate();
+ iWsSession.Flush();
+ }
+
+CVwsWServSessionHandler::CVwsWServSessionHandler(CVwsServer& aServer)
+ :iServer(aServer),
+ iFirstDisplay(ETrue)
+ {
+ }
+
+CVwsWServSessionHandler::~CVwsWServSessionHandler()
+ {
+ delete iWServEventHandler;
+ delete iWServRedrawer;
+ delete iGc;
+ delete iScreen;
+ iRootWin.Close();
+ if (iWindow!=NULL)
+ {
+ iWindow->Close();
+ delete iWindow;
+ }
+
+ ASSERT(iWsSession.ResourceCount()==0);
+ iWsSession.Close();
+ }
+
+CVwsWServSessionHandler* CVwsWServSessionHandler::NewL(CVwsServer& aServer)
+ {
+ CVwsWServSessionHandler* self=new(ELeave) CVwsWServSessionHandler(aServer);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+void CVwsWServSessionHandler::ConstructL()
+ {
+ CreateWServSessionL();
+ TBool ignoreFirstScreenDeviceChangedEvent = (GetScreenMode() > 0);
+ iWServEventHandler=CVwsWServEventHandler::NewL(iServer,iWsSession,
+ ignoreFirstScreenDeviceChangedEvent);
+ iWServRedrawer=CVwsWServRedrawer::NewL(iWsSession,*iGc,*iWindow);
+ }
+
+void CVwsWServSessionHandler::CreateWServSessionL()
+ {
+ User::LeaveIfError(iWsSession.Connect());
+
+ iScreen=new(ELeave) CWsScreenDevice(iWsSession);
+ User::LeaveIfError(iScreen->Construct());
+ User::LeaveIfError(iScreen->CreateContext(iGc));
+
+ iRootWin=RWindowGroup(iWsSession);
+ User::LeaveIfError(iRootWin.Construct((TUint32)this,EFalse));
+ iRootWin.SetOrdinalPosition(0,KPriorityNeverAtFront);
+ iRootWin.EnableScreenChangeEvents();
+ iRootWin.EnableFocusChangeEvents();
+
+ iWindow=new(ELeave) RWindow(iWsSession);
+ User::LeaveIfError(iWindow->Construct(iRootWin,((TUint32)this)+1));
+ iWindow->Activate();
+ iWindow->SetVisible(EFalse);
+ }
+
+TInt CVwsWServSessionHandler::GetScreenMode()
+ {
+ return iScreen->CurrentScreenMode();
+ }
+
+void CVwsWServSessionHandler::ConfigureScreenDevice()
+ {
+ LOG2(CVwsLog::ENormal,_L("CVwsWServSessionHandler:::ConfigureScreenDevice()"));
+ TPixelsAndRotation sizeAndRotation;
+ iScreen->GetDefaultScreenSizeAndRotation(sizeAndRotation);
+ iScreen->SetScreenSizeAndRotation(sizeAndRotation);
+ iWindow->SetSize(sizeAndRotation.iPixelSize);
+ }
+
+void CVwsWServSessionHandler::DisplayWindow()
+ {
+ LOG2(CVwsLog::ENormal,_L("CVwsWServSessionHandler::DisplayWindow()"));
+ if (iFirstDisplay)
+ {
+ iRootWin.SetOrdinalPosition(0,KPriorityAlwaysAtFront);
+ iFirstDisplay=EFalse;
+ }
+ iWindow->SetVisible(ETrue);
+ iWsSession.Flush();
+ }
+
+void CVwsWServSessionHandler::HideWindow()
+ {
+ LOG2(CVwsLog::ENormal,_L("CVwsWServSessionHandler::HideWindow()"));
+ iWindow->SetVisible(EFalse);
+ iWsSession.Flush();
+ iWServRedrawer->SetDrawMode(EFalse);
+ }
+
+void CVwsWServSessionHandler::UpdateScreenAndDisplayWindow()
+ {
+ ConfigureScreenDevice();
+ iWServRedrawer->SetDrawMode(ETrue);
+ DisplayWindow();
+ }
+
+void CVwsWServSessionHandler::SetWindowBackgroundColor(const TRgb& aBgColor)
+ {
+ iWindow->SetBackgroundColor(aBgColor);
+ }