diff -r 433cbbb6a04b -r 10534483575f uiacceltk/hitchcock/backgroundanim/src/bganimhost.cpp --- a/uiacceltk/hitchcock/backgroundanim/src/bganimhost.cpp Fri Mar 12 15:47:04 2010 +0200 +++ b/uiacceltk/hitchcock/backgroundanim/src/bganimhost.cpp Mon Mar 15 12:43:37 2010 +0200 @@ -16,7 +16,6 @@ */ #include #include -#include #include #include #include @@ -38,6 +37,9 @@ CBgAnimHost::~CBgAnimHost() { + iSkinSrv.Close(); + delete iCurrentPluginDllName; + delete iCurrentPluginAssetDir; delete iTimer; if (iPlugin) { @@ -45,7 +47,9 @@ free(iPlugin); } iPluginLibrary.Close(); +#if !defined(SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS) delete iSCPropertyListener; +#endif delete iThemeRepositoryListener; while (iSensorListeners.Count()) { @@ -79,18 +83,24 @@ CActiveScheduler::Install(ac); iTimer = CHighResTimer::NewL(TCallBack(TimerFunc, this),CActive::EPriorityStandard); iThemeRepositoryListener = CThemeRepositoryListener::NewL(&iRunning); +#if !defined(SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS) iSCPropertyListener = CScreenSaverPropertyListener::NewL(TCallBack(ScreenSaverCallback, this)); +#endif CreateWindowL(); + User::LeaveIfError(iSkinSrv.Connect()); // load the initial plugin + GetPluginConfigurationL(); LoadPluginL(); InitEGLL(); CreateWindowSurfaceL(); User::LeaveIfError(iPlugin->gpuresourcesavailable(1)); iThemeRepositoryListener->IssueRequest(); +#if !defined(SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS) iSCPropertyListener->IssueRequest(); +#endif } void CBgAnimHost::CreateWindowL() @@ -185,7 +195,7 @@ iSurfaceInitialized = EFalse; - if (aReleaseObserver) + if (aReleaseObserver && iCompSource) { iCompSource->RemoveObserver(*this); delete iCompSource; @@ -385,42 +395,68 @@ } else { - User::After(5000000); + User::After(1000000); } } iSurfaceInitialized = ETrue; } - -void CBgAnimHost::LoadPluginL() + +TBool CBgAnimHost::GetPluginConfigurationL() { // dig out the skin config from skin server HBufC* configstr = NULL; - RAknsSrvSession skinsrv; - User::LeaveIfError(skinsrv.Connect()); - CleanupClosePushL(skinsrv); - CAknsSrvChunkLookup* cl = skinsrv.CreateChunkLookupL(); + CAknsSrvChunkLookup* cl = iSkinSrv.CreateChunkLookupL(); CleanupStack::PushL(cl); CAknsStringItemDef* configitem = static_cast(cl->LookupAndCreateDefL( KAknsIIDPropertyAnimBgParam )); User::LeaveIfNull(configitem); CleanupStack::PushL(configitem); configstr = configitem->String().AllocL(); - CleanupStack::PopAndDestroy(3); // skinsrv, cl, configitem + CleanupStack::PopAndDestroy(2); // cl, configitem CleanupStack::PushL(configstr); - RDebug::Print(_L("----------------------")); - RDebug::Print(_L("backgroundhost config:")); - RDebug::Print(*configstr); - RDebug::Print(_L("----------------------")); TLex lex(*configstr); - TPtrC dllname = lex.NextToken(); - if (!dllname.Length()) + HBufC* dllname = lex.NextToken().AllocL(); + CleanupStack::PushL(dllname); + if (!dllname || !dllname->Length()) + { + User::Leave(KErrNotFound); + } + + HBufC* assetdir = lex.NextToken().AllocL(); + CleanupStack::PushL(assetdir); + if (!assetdir || !assetdir->Length()) { User::Leave(KErrNotFound); } - User::LeaveIfError(iPluginLibrary.Load(dllname)); + TBool confchanged = EFalse; + if (!iCurrentPluginDllName || !iCurrentPluginAssetDir || + (iCurrentPluginDllName && !iCurrentPluginDllName->CompareF(*dllname)) || + (iCurrentPluginAssetDir && !iCurrentPluginAssetDir->CompareF(*assetdir)) ) + + { + confchanged = ETrue; + delete iCurrentPluginDllName; + delete iCurrentPluginAssetDir; + iCurrentPluginDllName = dllname; + iCurrentPluginAssetDir = assetdir; + CleanupStack::Pop(2); // dllname, assetdir + } + else + { + CleanupStack::PopAndDestroy(2); // dllname, assetdir + } + + CleanupStack::PopAndDestroy(); // configstr + + return confchanged; + } + +void CBgAnimHost::LoadPluginL() + { + User::LeaveIfError(iPluginLibrary.Load(*iCurrentPluginDllName)); plugingetinterfacefunc getif = (plugingetinterfacefunc)iPluginLibrary.Lookup(1); if (!getif) { @@ -430,23 +466,10 @@ iPlugin = (plugin_export_v1_t*) getif(1); - TPtrC configpath = lex.NextToken(); - if (!configpath.Length()) - { - User::Leave(KErrNotFound); - } TBuf8<256> pluginpath; - pluginpath.Copy(configpath); + pluginpath.Copy(*iCurrentPluginAssetDir); User::LeaveIfError(iPlugin->initialize((const char*)pluginpath.PtrZ(), KMaxGPUMemUsage)); - -// } -// else -// { -// User::LeaveIfError(iPlugin->initialize("z:\\private\\200286D3", KMaxGPUMemUsage)); -// } - - CleanupStack::PopAndDestroy(); // configstr - + iPlugin->setdisplaydimensions(iDisplaySize.iWidth, iDisplaySize.iHeight); if (iPlugin->desiredsensors && iPlugin->receivesensordata) { @@ -463,6 +486,24 @@ } } +void CBgAnimHost::ReleasePlugin() + { + if (iPlugin) + { + while (iSensorListeners.Count()) + { + delete iSensorListeners[0]; + iSensorListeners.Remove(0); + } + + iPlugin->gpuresourcesavailable(0); + iPlugin->destroy(); + free(iPlugin); + iPlugin = NULL; + iPluginLibrary.Close(); + } + } + void CBgAnimHost::NewFrame() { if (!iRunning) @@ -506,6 +547,12 @@ iTimer->CallBack(100); iTimerRunning = ETrue; iRunning = ETrue; + // we only want to receive skin change messages + // after we have been properly initialized + // and running, close the session without observer + // and re-open with observer + iSkinSrv.Close(); + User::LeaveIfError(iSkinSrv.Connect(this)); CActiveScheduler::Start(); } @@ -535,7 +582,6 @@ return; } - RDebug::Print(_L("!!! - HIDDEN - !!!")); // release gpu resources... iTimer->Cancel(); iTimerRunning = EFalse; @@ -552,8 +598,6 @@ return; } - RDebug::Print(_L("!!! - VISIBLE - !!!")); - if (!iSurfaceInitialized && iCompSource) { iCompSource->RemoveObserver(*this); @@ -573,17 +617,13 @@ void CBgAnimHost::HandleScreenSaverEvent() { - RDebug::Print(_L("-----------------------------------")); - RDebug::Print(_L("CBgAnimHost::HandleScreenSaverEvent")); +#if !defined(SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS) TInt scStatus = iSCPropertyListener->GetScreenSaverStatus(); - RDebug::Print(_L("status: %d, timerrunning %d, surfacecreated %d"),scStatus, iTimerRunning, iSurfaceInitialized); - RDebug::Print(_L("-----------------------------------")); if (scStatus) { // screensaver is ON if (iTimerRunning) { - RDebug::Print(_L("--- screensaver on, stopping timer ---")); iTimer->Cancel(); iTimerRunning = EFalse; } @@ -593,12 +633,11 @@ // screensaver is OFF if (!iTimerRunning && iSurfaceInitialized) { - RDebug::Print(_L("--- screensaver off, starting timer ---")); - iTimerRunning = ETrue; iTimer->CallBack(1); } } +#endif } TInt CBgAnimHost::ScreenSaverCallback(TAny* aPtr) @@ -623,3 +662,34 @@ void CBgAnimHost::GetDataListenerInterfaceL( TUid aInterfaceUid, TAny*& aInterface) { } + +void CBgAnimHost::SkinContentChanged() + { + } + +void CBgAnimHost::SkinConfigurationChanged( const TAknsSkinStatusConfigurationChangeReason aReason ) + { + if (aReason == EAknsSkinStatusConfigurationDeployed && iPlugin) + { + // okay, the skin has changed, let's check that should we load a different + // animation plugin + TBool changed = EFalse; + TRAPD(err, changed = GetPluginConfigurationL()); + if (err || !changed) + { + // plugin configuration has not changed, or there is not animation + // in the theme, just return + return; + } + + CompositionTargetHidden(); + ReleasePlugin(); + + TRAP_IGNORE(LoadPluginL()); + CompositionTargetVisible(); + } + } + +void CBgAnimHost::SkinPackageChanged( const TAknsSkinStatusPackageChangeReason /*aReason*/ ) + { + }