diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/tlisten/listener.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/tlisten/listener.cpp Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,380 @@ +// Copyright (c) 2006-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: +// + +/** + @file + @test + @internalComponent - Internal Symbian test code +*/ + +#include "listener.h" +#include "wsgraphicdrawercontext.h" +#include +#include +#include +#include +#ifdef __WINS__ +#include "../debuglog/osbwin.h" +#endif + +const TInt KDefaultScreen = 0; +const TInt KListenDisable = 0; +const TInt KListenEnable = 1; +const TInt KCmdQuery = 2; + +const TUint8 KListenerInfoSig = 0xaa; + +NONSHARABLE_STRUCT(TListenerInfo) + { + TUint8 iSignature; + TInt iNumRect; + TRect iRect; + TInt iWindowGroupId; + }; + +const TInt KMaxColors = 14; +const TInt KColorList[KMaxColors] = + { + 0x555555, + 0x000080, + 0x008000, + 0x008080, + 0x800000, + 0x800080, + 0x808000, + 0x0000ff, + 0x00ff00, + 0x00ffff, + 0xff0000, + 0xff00ff, + 0xffff00, + 0xaaaaaa + }; + +CWsEventListener* CWsEventListener::NewL() + { + return new(ELeave) CWsEventListener; + } + +CWsEventListener::~CWsEventListener() + { + if (iEnabled) + Env().UnregisterEventHandler(this); + +#ifdef __WINS__ + if (!iDisableWin) + delete iWin; +#endif + delete iGc; + delete iDev; + delete iBit; + + if (iDrawerContext) + { + iDrawerContext->Destroy(); + iDrawerContext = NULL; + } + } + +void CWsEventListener::ConstructL(MWsGraphicDrawerEnvironment& aEnv, const TGraphicDrawerId& aId, MWsClient& aOwner, const TDesC8& aData) + { + BaseConstructL(aEnv, aId, aOwner); + +#ifdef __WINS__ + if (aData.Length()>0) + iDisableWin = aData[0]==1; +#endif + + iScreen = aEnv.Screen(KDefaultScreen); + MWsScreenConfig* screenConfig = iScreen->ObjectInterface(); + if (screenConfig) + {// Non NGA + iSize = screenConfig->SizeInPixels(); + iDisplayMode = screenConfig->DisplayMode(); + iDrawerContext = CWsGraphicDrawerNonNgaContext::NewL(); + } + else + {// NGA + MWsScreenDevice* screenDevice = iScreen->ObjectInterface(); + User::LeaveIfNull(screenDevice); + iSize = screenDevice->SizeInPixels(); + iDisplayMode = screenDevice->DisplayMode(); + iDrawerContext = CWsGraphicDrawerNgaContext::NewL(); + } + + iWindowGroupId = KErrNotFound; + + iBit = new(ELeave) CFbsBitmap; + User::LeaveIfError(iBit->Create(iSize,iDisplayMode)); + iDev = CFbsBitmapDevice::NewL(iBit); + User::LeaveIfNull(iDev); + User::LeaveIfError(iDev->CreateContext(iGc)); + iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); + iGc->SetPenStyle(CGraphicsContext::ENullPen); + +#ifdef __WINS__ + if (!iDisableWin) + { + _LIT(KListener, "EventListener"); + iWin = CDebugOsbWin::NewL(KListener, iBit->SizeInPixels()); + } +#endif + iReady = ETrue; + } + +void CWsEventListener::HandleMessage(const TDesC8& aData) + { + // wserv already check data size, and won't invoke this handler if it's empty + switch (aData[0]) + { + case KListenEnable: + if (!iEnabled) + { + Env().RegisterEventHandler(this, this, TWservCrEvent::EScreenSizeModeChanged|TWservCrEvent::EWindowVisibilityChanged|TWservCrEvent::EWindowGroupChanged); + iEnabled = ETrue; + } + break; + + case KListenDisable: + if (iEnabled) + { + iEnabled = EFalse; + Env().UnregisterEventHandler(this); + } + break; + + case KCmdQuery: + SendInfo(); + break; + } + } + +void CWsEventListener::DoHandleEvent(const TWservCrEvent& aEvent) + { + if (!iReady) + return; + + switch (aEvent.Type()) + { + case TWservCrEvent::EScreenSizeModeChanged: + OnScreenSizeModeChanged(aEvent.SizeMode()); + break; + + case TWservCrEvent::EWindowVisibilityChanged: + OnWindowVisibilityChanged(aEvent.VisibleRegion()); + break; + + case TWservCrEvent::EWindowGroupChanged: + OnWindowGroupChanged(aEvent.ScreenNumber(), aEvent.WindowGroupIdentifier()); + break; + } + } + +void CWsEventListener::DoDraw(MWsGc& aGc, const TRect& aRect, const TDesC8& /*aData*/) const + { + iDrawerContext->DrawEllipse(aGc, aRect, TRgb(0,255,0,128)); + } + +void CWsEventListener::OnScreenSizeModeChanged(TInt /*aMode*/) + { + iGc->SetBrushColor(KRgbWhite); + iGc->Clear(); + +#ifdef __WINS__ + if (!iDisableWin) + { + iBit->LockHeap(); + iWin->Refresh(iBit->SizeInPixels(), iBit->DisplayMode(), iBit->DataAddress()); + iBit->UnlockHeap(); + } +#endif + } + +TRgb CWsEventListener::CurrentColor() + { + iColorIdx = (iColorIdx+1) % KMaxColors; + return TRgb(KColorList[iColorIdx]); + } + +void CWsEventListener::OnWindowVisibilityChanged(const RRegion* aRegion) + { + if (!aRegion) + return; + + TInt n = aRegion->Count(); + if (n==0) + return; + iGc->SetBrushColor(CurrentColor()); + for (TInt i=0; iDrawRect((*aRegion)[i]); + } + + iSaveNumRect = n; + iSaveRect = (*aRegion)[0]; + +#ifdef __WINS__ + if (!iDisableWin) + { + iBit->LockHeap(); + iWin->Refresh(iBit->SizeInPixels(), iBit->DisplayMode(), iBit->DataAddress()); + iBit->UnlockHeap(); + } +#endif + } + +void CWsEventListener::OnWindowGroupChanged(TInt /*aScreenNumber*/, TInt aWindowGroupId) + { + iWindowGroupId = aWindowGroupId; + } + +void CWsEventListener::SendInfo() + { + TPckgBuf buf; + buf().iSignature = KListenerInfoSig; + buf().iNumRect = iSaveNumRect; + buf().iRect = iSaveRect; + buf().iWindowGroupId = iWindowGroupId; + TInt err = SendMessage(buf); + __ASSERT_ALWAYS(err>=KErrNone, User::Invariant()); + iSaveNumRect = 0; + iSaveRect = TRect(); + } + +CWsEventNotifier* CWsEventNotifier::NewL() + { + return new(ELeave) CWsEventNotifier; + } + +CWsEventNotifier::~CWsEventNotifier() + { + Env().UnregisterEventHandler(this); + } + +void CWsEventNotifier::ConstructL(MWsGraphicDrawerEnvironment& aEnv, const TGraphicDrawerId& aId, MWsClient& aOwner, const TDesC8& /*aData*/) + { + BaseConstructL(aEnv, aId, aOwner); + iEnv = &aEnv; + iTestGraphicDrawerEnvironment = EFalse; + iReady = ETrue; + } + +void CWsEventNotifier::HandleMessage(const TDesC8& aData) + { + // wserv already checked data size, and won't invoke this handler if it's empty + switch (aData[0]) + { //Set how it will handle the first visibility event + case KNotifyRemoveSelf: + case KNotifyRemoveThenAddSelf: + case KNotifyAddSelf: + case KNotifyRemoveOther: + case KNotifyRemoveThenAddOther: + case KNotifyAddOther: + case KNotifyRemoveSelfAndOther: + case KNotifyDoNothing: + Env().RegisterEventHandler(this, this, TWservCrEvent::EWindowVisibilityChanged); + iHandleMethod = aData[0]; + break; + case KNotifyDisable: + Env().UnregisterEventHandler(this); + iHandleMethod = KNotifyDoNothing; + break; + default: + break; + } + } + +void CWsEventNotifier::DoHandleEvent(const TWservCrEvent& /*aEvent*/) + { + if(!iTestGraphicDrawerEnvironment) + { + iTestGraphicDrawerEnvironment = ETrue; + TestGraphicDrawerEnvironment(); + } + + if (iHandleMethod == KNotifyRemoveSelf) + { + Env().UnregisterEventHandler(this); + iHandleMethod = KNotifyDoNothing; + } + else if (iHandleMethod == KNotifyRemoveThenAddSelf) + { + Env().UnregisterEventHandler(this); + Env().RegisterEventHandler(this, this, TWservCrEvent::EWindowVisibilityChanged); + iHandleMethod = KNotifyDoNothing; + } + else if (iHandleMethod == KNotifyAddSelf) + { + Env().RegisterEventHandler(this, this, TWservCrEvent::EWindowVisibilityChanged); + iHandleMethod = KNotifyDoNothing; + } + else if (iHandleMethod == KNotifyRemoveOther) + { + iAnotherPluginID.iId = 0x102754c5; //First method that needs the address of the other plugin + iAnotherPluginID.iIsUid = ETrue; + iAnotherPlugin = const_cast(Env().ResolveGraphic(iAnotherPluginID)); + Env().UnregisterEventHandler(iAnotherPlugin); + iHandleMethod = KNotifyDoNothing; + } + else if (iHandleMethod == KNotifyRemoveThenAddOther) + { + Env().UnregisterEventHandler(iAnotherPlugin); + Env().RegisterEventHandler(iAnotherPlugin, this, TWservCrEvent::EWindowVisibilityChanged); + iHandleMethod = KNotifyDoNothing; + } + else if (iHandleMethod == KNotifyAddOther) + { + Env().RegisterEventHandler(iAnotherPlugin, this, TWservCrEvent::EWindowVisibilityChanged); + iHandleMethod = KNotifyDoNothing; + } + else if (iHandleMethod == KNotifyRemoveSelfAndOther) + { + Env().UnregisterEventHandler(this); + Env().UnregisterEventHandler(iAnotherPlugin); + iHandleMethod = KNotifyDoNothing; + } + } + +void CWsEventNotifier::DoDraw(MWsGc& /*aGc*/, const TRect& /*aRect*/, const TDesC8& /*aData*/) const + { + } + +void CWsEventNotifier::TestGraphicDrawerEnvironment() + { + const MWsGraphicDrawerEnvironment* aEnvConst = iEnv; + TInt lowerbound = -1; + //-tests Screen methods (const and non const) + __ASSERT_ALWAYS(iEnv->Screen(lowerbound)==NULL, SendMessage(_L8("Error:iEnv->Screen(lowerbound) - expected: NULL, actual: !NULL (listener.cpp)"))); + __ASSERT_ALWAYS(iEnv->Screen(iEnv->ScreenCount())==NULL, SendMessage(_L8("Error:iEnv->Screen(iEnv->ScreenCount()) - expected: NULL, actual: !NULL (listener.cpp)"))); + __ASSERT_ALWAYS(aEnvConst->Screen(lowerbound)==NULL, SendMessage(_L8("Error:aEnvConst->Screen(lowerbound) - expected: NULL, actual: !NULL (listener.cpp)"))); + __ASSERT_ALWAYS(aEnvConst->Screen(aEnvConst->ScreenCount())==NULL, SendMessage(_L8("Error:aEnvConst->ScreenCount()) - expected: NULL, actual: !NULL (listener.cpp)"))); + //+test const screen method + const MWsScreen* constScreen = aEnvConst->Screen(aEnvConst->ScreenCount()-1); + __ASSERT_ALWAYS(constScreen!=NULL, SendMessage(_L8("Error:constScreen - expected: !NULL, actual: NULL (listener.cpp)"))); + //+test resolveobjectinterface method + MWsActiveSchedulerDebug* scheduler = iEnv->ObjectInterface(); + __ASSERT_ALWAYS(scheduler!=NULL, SendMessage(_L8("Error:scheduler - expected: !NULL, actual: NULL (listener.cpp)"))); + TUint32 eventMask = 0; + //-tests for registereventhandler and unregistereventhandler + __ASSERT_ALWAYS(iEnv->RegisterEventHandler(NULL,this, TWservCrEvent::EWindowClosing)==KErrArgument, SendMessage(_L8("Error:iEnv->RegisterEventHandler(NULL,this, TWservCrEvent::EWindowClosing) - expected: KErrArgument, actual: !KErrArgument (listener.cpp)"))); + __ASSERT_ALWAYS(iEnv->RegisterEventHandler(this,NULL, TWservCrEvent::EWindowClosing)==KErrArgument, SendMessage(_L8("Error:iEnv->RegisterEventHandler(this,NULL, TWservCrEvent::EWindowClosing) - expected: KErrArgument, actual: !KErrArgument (listener.cpp)"))); + __ASSERT_ALWAYS(iEnv->RegisterEventHandler(this,this, eventMask)==KErrArgument, SendMessage(_L8("Error:iEnv->RegisterEventHandler(this,this, eventMask) - expected: KErrArgument, actual: !KErrArgument (listener.cpp)"))); + __ASSERT_ALWAYS(iEnv->UnregisterEventHandler(NULL)==KErrArgument, SendMessage(_L8("Error:iEnv->UnregisterEventHandler(NULL) - expected: KErrArgument, actual: !KErrArgument (listener.cpp)"))); + //-tests for registerwseventhandler +#ifdef SYMBIAN_GRAPHICS_GCE + __ASSERT_ALWAYS(iEnv->RegisterWsEventHandler(this, eventMask)==KErrArgument, SendMessage(_L8("Error:iEnv->RegisterWsEventHandler(this, eventMask) - expected: KErrArgument, actual: !KErrArgument (listener.cpp)"))); + __ASSERT_ALWAYS(iEnv->RegisterWsEventHandler(NULL, TWservCrEvent::EWindowClosing)==KErrArgument, SendMessage(_L8("Error:iEnv->RegisterWsEventHandler(NULL, TWservCrEvent::EWindowClosing) - expected: KErrArgument, actual: !KErrArgument (listener.cpp)"))); +#endif //SYMBIAN_GRAPHICS_GCE + }