--- a/uiacceltk/hitchcock/ServerCore/Src/alfbridge.cpp Tue Apr 27 17:34:42 2010 +0300
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfbridge.cpp Tue May 11 17:03:00 2010 +0300
@@ -103,6 +103,10 @@
// Timeout for manual refresh
const TInt KAlfManualRefreshTimeout = 35000;
+_LIT_SECURITY_POLICY_PASS(KAlwaysPass);
+const TUid KPSSysCategory = { KUidSystemCategoryValue };
+const TUint32 KAlfPSKeyHSVisible = 0x2002EA91;
+
const TInt KFadeAction = 6000;
NONSHARABLE_CLASS( TAlfBridgeDrawerWrapper ) : public MAlfDrawerScreenInterface
@@ -222,6 +226,10 @@
RegisterFadeEffectL();
iManualRefreshTimer = CPeriodic::NewL(CActive::EPriorityStandard);
+
+ RProperty::Define( KPSSysCategory, KAlfPSKeyHSVisible, RProperty::EInt, KAlwaysPass, KAlwaysPass );
+ RProperty::Set( KPSSysCategory, KAlfPSKeyHSVisible, 0 );
+
}
// ---------------------------------------------------------------------------
@@ -1385,6 +1393,7 @@
iBgSurfaceFound = EFalse;
iHomeScreenWallpaperWindowFound = EFalse;
+ iHomeScreenVisible = EFalse;
// Check if effect group has an effect with opaque hint.
CHuiControlGroup& fxcontrolgroup = *(iAlfScreens[aScreenNumber]->iFullscreenEffectControlGroup);
@@ -1663,11 +1672,22 @@
}
}
}
-
- if ( iSwRenderingEnabled )
- {
- screen->iDisplay->SetForegroundTextureOptions( alfWindowGroupFoundVisible );
- }
+
+ if (iHomeScreenPSValue != iHomeScreenVisible)
+ {
+ TInt value = iHomeScreenVisible;
+ if ((iHomeScreenVisible && iHomeScreenWallpaperWindowFound) || iBgAnimHidden)
+ {
+ value = EFalse;
+ }
+ if (value != iHomeScreenPSValue)
+ {
+ RProperty::Set( KPSSysCategory, KAlfPSKeyHSVisible, value );
+ iHomeScreenPSValue = value;
+ }
+ }
+
+ screen->iDisplay->SetForegroundTextureOptions( alfWindowGroupFoundVisible | alfClientWindowGroupVisible );
// Finally, if there are fadeeffects applied to windowgroups, make sure first one does not
// blend itself, but other windowgroups do blend. Otherwise windowgrouops above others
@@ -1861,6 +1881,7 @@
// We found an _ACTIVE_ window in homescreens controlgroup
if (aControlGroup.SecureId() == 0x102750F0)
{
+ iHomeScreenVisible = ETrue;
// which is fully opaque, and visible ...
if ( (canvasVisual->iOpacity.Now() > 0.001) && canvasVisual->Flags() & EHuiVisualFlagOpaqueHint)
{
@@ -2071,9 +2092,17 @@
// Determine if surface is visible.
TBool surfaceWasVisible = ( canvasVisual->CanvasFlags() & EHuiCanvasFlagSurfaceVisible );
TBool surfaceWasInvisible = ( canvasVisual->CanvasFlags() & EHuiCanvasFlagSurfaceInvisible );
- __ALFLOGSTRING2("CAlfBridge::HideTarget: %d %d", aVisible, surfaceWasVisible);
+ __ALFLOGSTRING2("CAlfBridge::HandleLayerVisibility aVisible %d surfaceWasVisible %d", aVisible, surfaceWasVisible);
TBool forcedUpdate = !surfaceWasVisible && !surfaceWasInvisible;
+
+#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
+ if ( !aVisible && canvasVisual->LayerUsesAlphaFlag() )
+ {
+ __ALFLOGSTRING( "CAlfBridge::HandleLayerVisibility LayerUsesAlphaFlag setting visible" );
+ aVisible = ETrue;
+ }
+#endif // SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
if ( !aVisible && ( forcedUpdate || surfaceWasVisible ) )
{
@@ -2477,6 +2506,11 @@
iHuiEnv->ContinueRefresh();
break;
}
+ case EAlfDSSetDistractionWindow:
+ {
+ HandleSetDistractionWindowL( data );
+ break;
+ }
case KUnInitialized:
{
__ALFLOGSTRING1("CAlfBridge::DoDispatchL: Received KUnInitialized: %d - CRITICAL ERROR!",data.iOp);
@@ -2618,14 +2652,10 @@
viz->SetCanvasFlags(EHuiCanvasFlagEnableCanvasClipping);
viz->SetParentCanvas(parentViz);
}
- else
- {
- __ALFLOGSTRING1("CAlfBridge::HandleNewWindowL: Parent not found for visual %d!",windowNodeId);
- }
}
else
{
- __ALFLOGSTRING1("CAlfBridge::HandleNewWindowL: Control group not found for visual %d!",windowNodeId);
+ __ALFLOGSTRING1("CAlfBridge::HandleNewWindowL: Control group not found for visual 0x%x!",windowNodeId);
}
break;
@@ -2674,6 +2704,16 @@
if (layout)
layout->Remove(aVisual);
aVisual->Owner().Remove(aVisual);
+ RPointerArray<CHuiLayout> familyTree;
+ ListFamilyTreeL(familyTree, (CHuiLayout*)aVisual); // recursively dig the family tree
+ for (TInt familyIndex = 1; familyIndex < familyTree.Count();familyIndex++)
+ {
+ CHuiLayout* lVisual = familyTree[familyIndex];
+ lVisual->Owner().Remove(lVisual);
+ iOrphanStorage->AppendL( lVisual );
+ }
+ familyTree.Close();
+
__ALFLOGSTRING1("CAlfBridge::HandleDestroyWindow - destroying visual 0x%x", aVisual);
// check if visual is having an effect at the moment. This could occur, if options menu is exited (with effect) and then
// application is exited. EHuiVisualFlagDrawOnlyAsExternalContent is indication that
@@ -5016,7 +5056,36 @@
__ALFFXLOGSTRING("CAlfBridge::HandleGfxStopControlEffectsL - end");
}
-
+void CAlfBridge::HandleSetDistractionWindowL( TAlfBridgerData data )
+ {
+ TInt windowGroupId = data.iInt1;
+ TInt windowClientHandle = data.iInt2;
+ TBool setDistractionWindow = (TBool)data.iPtr;
+
+ CControlEffectState* fxData = new (ELeave) CControlEffectState;
+ CleanupStack::PushL(fxData);
+ fxData->ConstructL(windowClientHandle, windowGroupId, setDistractionWindow);
+
+ __ALFFXLOGSTRING2("CAlfBridge::HandleSetDistractionWindowL client handle: %d, group: %d", windowClientHandle, windowGroupId );
+ CHuiCanvasVisual* visual = FindVisualByClientSideIds(windowClientHandle, windowGroupId);
+
+ iControlEffectData = fxData;
+ CleanupStack::Pop(fxData);
+
+ if (visual)
+ {
+ HandleGfxControlEventL(*iControlEffectData, visual);
+ }
+ else
+ {
+ __ALFFXLOGSTRING2("CAlfBridge::HandleGfxControlEffectsL - Control not found. iClientHandle %d, iClientGroupHandle %d",
+ fxData->iClientHandle,
+ fxData->iClientGroupHandle);
+ return;
+ }
+ delete iControlEffectData;
+ iControlEffectData = NULL;
+ }
void CAlfBridge::HandleRegisterEffectL( TAlfBridgerData data )
{
TInt action = data.iInt1;
@@ -5280,6 +5349,32 @@
void CAlfBridge::HandleGfxControlEventL(CControlEffectState& aEvent,
CHuiCanvasVisual* aCanvasVisual)
{
+
+ if (aEvent.iSetDistractionWindow)
+ {
+ // marks the background clear window that comes as courtesy of the framework.
+ __ALFFXLOGSTRING2("CAlfBridge::HandleGfxControlEventL - setting distraction window 0x%x to state %d", aCanvasVisual, aEvent.iSetDistractionWindow);
+ switch(aEvent.iSetDistractionWindow)
+ {
+ case CControlEffectState::ESetDistractionWindow:
+ {
+ aCanvasVisual->SetCanvasFlags(EHuiCanvasFlagDistractionWindow);
+ break;
+ }
+ case CControlEffectState::ERemoveDistractionWindow:
+ {
+ aCanvasVisual->ClearCanvasFlags(EHuiCanvasFlagDistractionWindow);
+ break;
+ }
+ }
+ return;
+ }
+
+ if ( aCanvasVisual && aCanvasVisual->Owner().ControlGroup() && aCanvasVisual->Owner().ControlGroup()->SecureId() == 0x101f857A ) // Camera id
+ {
+ __ALFFXLOGSTRING("CAlfBridge::HandleGfxControlEventL - Returning because inside camera app");
+ return;
+ }
TInt err = KErrNone;
// Check if there is an effects engine in HuiEnv
CHuiFxEffect* effect = NULL;
@@ -6361,7 +6456,6 @@
TRect fullscreen = TRect(TPoint(0,0), screen->Size());
__ALFFXLOGSTRING3("CAlfBridge::IsFullScreenDrawn - new orientation %d, screen size: (%d,%d)", aOrientation, fullscreen.iBr.iX, fullscreen.iBr.iY );
TBool fullscreenCovered = EFalse;
- CAlfAppSrvSessionBase* topMostAlfSrvSession = NULL;
// Check if effect group has an effect with opaque hint.
CHuiControlGroup& fxcontrolgroup = *(iAlfScreens[0]->iFullscreenEffectControlGroup);
@@ -6377,9 +6471,9 @@
{
fullscreenCovered = ETrue;
}
+
+ TBool alfClientWindowGroupVisible = EFalse;
- TBool alfWindowGroupFoundVisible = EFalse;
-
AMT_SET_VALUE( iVisibleVisualCount, 0 );
// skip the topmost (effect) layer, start from floating sprite group
@@ -6402,7 +6496,10 @@
if (!fullscreenCovered)
{
fullscreenCovered = IsRectCoveredByRegion(fullscreen, iTempRegion);
-
+ if(fullscreenCovered)
+ {
+ return ETrue;
+ }
for(TInt ii=0;ii< iTempRegion.Count(); ii++)
{
__ALFFXLOGSTRING4("CAlfBridge::IsFullScreenDrawn (%d,%d)-(%d,%d)", iTempRegion[ii].iTl.iX, iTempRegion[ii].iTl.iY , iTempRegion[ii].iBr.iX, iTempRegion[ii].iBr.iY );
@@ -6412,7 +6509,29 @@
// Dont mess with alf control group visuals, alf session handling does it for us
if (control.Role() == EAlfSessionContainer)
{
- // Skip alf session containers until we have better heuristic implement for them
+ CHuiLayout* hostContainer = control.ContainerLayout( NULL );
+ TInt flags = hostContainer->Flags();
+ if (alfClientWindowGroupVisible)
+ {
+ // check visual sizes if client has not made this control group hidden
+ if(!(flags&EHuiVisualFlagUnderOpaqueHint))
+ {
+ if(iAppUi)
+ {
+ CAlfAppSrvSessionBase* alfSrvSession = iAppUi->SrvSessionForControlGroup(controlgroup);
+
+ TInt clientWindowGroupId = alfSrvSession->ClientWindowGroup();
+ // checking the case if there are multiple alf application openend.
+ if (clientWindowGroupId == iAppUi->GetLastActiveClient())
+ {
+ if(IsFullScreenDrawnRecursiveAlfContent(hostContainer, fullscreen) )
+ {
+ return ETrue;
+ }
+ }
+ }
+ }
+ }
continue;
}
@@ -6428,6 +6547,11 @@
}
*/
+ if(controlgroup.iAlfApp && layout->iOpacity.Now() > 0.0f )
+ {
+ alfClientWindowGroupVisible = ETrue;
+ }
+
if (fullscreenCovered)
{
return ETrue;
@@ -6436,6 +6560,40 @@
return fullscreenCovered;
}
+TBool CAlfBridge::IsFullScreenDrawnRecursiveAlfContent(CHuiVisual* aVisual, TRect& aFullScreen)
+ {
+ if(aVisual)
+ {
+ TInt flags = aVisual->Flags();
+ if(!(flags && EHuiVisualFlagInactive) && aVisual->iOpacity.Now() > 0 ) // don't take inactive or invisible visual into account
+ {
+ TPoint point = aVisual->Pos().Now();
+ TPoint size = aVisual->Size().Now();
+ TRect visualRect(point, TSize(size.iX, size.iY));
+ iTempRegion.AddRect(visualRect);
+ iTempRegion.Tidy();
+
+ if( IsRectCoveredByRegion(aFullScreen, iTempRegion) )
+ {
+ return ETrue;
+ }
+ }
+ TInt count = aVisual->Count();
+ if(count)
+ {
+ for(TInt i = 0 ; i < count ; i++)
+ {
+ if( IsFullScreenDrawnRecursiveAlfContent( &aVisual->Visual(i), aFullScreen ) )
+ {
+ return ETrue;
+ }
+ }
+ }
+ }
+ return EFalse;
+ }
+
+
TBool CAlfBridge::IsFullScreenDrawnRecursive(
CHuiLayout* aLayout,
CHuiControlGroup& aControlGroup,
@@ -6515,7 +6673,9 @@
visualIsOpaque = EFalse;
}
- if (visualIsActive && visualIsOpaque && !visualRectIsCovered)
+ if (visualIsActive && visualIsOpaque && !visualRectIsCovered
+ && !(canvasVisual->CanvasFlags() & EHuiCanvasFlagDistractionWindow) // exclude the akn clearer window from heuristics
+ )
{
// New visibility system takes only window shape into account.
if ( canvasVisual->CanvasFlags() & EHuiCanvasFlagIncludeToVisibilityCalculation )