diff -r cd0ae4656946 -r c9d868f1e20c uiacceltk/hitchcock/ServerCore/Src/alfbridge.cpp --- a/uiacceltk/hitchcock/ServerCore/Src/alfbridge.cpp Mon Jun 21 16:41:52 2010 +0300 +++ b/uiacceltk/hitchcock/ServerCore/Src/alfbridge.cpp Thu Jul 15 19:40:07 2010 +0300 @@ -196,6 +196,7 @@ delete iEffectEndTimer; iDeadControlGroups.Close(); iEffectWindowGroups.Close(); + iWindowChainsArray.Close(); delete iFSFxData; delete iFSFXDataPart2; @@ -269,7 +270,11 @@ void CAlfBridge::RegisterFadeEffectL() { // TODO: RND, REMOVE MMC DRIVE-F, WHEN NOT REQUIRED FOR TESTING +#ifdef USE_ALTERNATIVE_EFFECTS_FROM_MMC _LIT(KDrivePrefence,"FZC"); +#else + _LIT(KDrivePrefence,"Z"); +#endif // Force register fade effect. Try first MMC, then ROM. CHuiFxEngine* engine = iHuiEnv->EffectsEngine(); RFs& fs = CHuiStatic::FsSession(); @@ -460,7 +465,57 @@ while(node); return NULL; } - + +// --------------------------------------------------------------------------- +// FindChainedGroup +// --------------------------------------------------------------------------- +// +TUint32 CAlfBridge::FindChainedGroup( + TUint32 aTreeNodeId) + { + THashMapIter iter(iWindowChainsArray); + TChainData const * data = 0; + do + { + data = iter.NextValue(); + if (data && data->iParent == aTreeNodeId) + { + TUint32 chainedTo = FindChainedGroup(data->iChainee); + if (!chainedTo) + { + return data->iChainee; + } + else + { + return chainedTo; + } + } + } + while(data); + return NULL; + } + +// --------------------------------------------------------------------------- +// IsChainedGroup +// --------------------------------------------------------------------------- +// +TBool CAlfBridge::IsChainedGroup( + TUint32 aTreeNodeId) + { + THashMapIter iter(iWindowChainsArray); + TChainData const * data = 0; + do + { + data = iter.NextValue(); + if (data && data->iChainee == aTreeNodeId) + { + return ETrue; + } + } + while(data); + return EFalse; + } + // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- // @@ -480,13 +535,13 @@ // FindClientWindowGroupId // --------------------------------------------------------------------------- // -TInt CAlfBridge::FindClientWindowGroupId( TInt aScreenNumber, CHuiControlGroup& aControlGroup ) - { - for (TInt i=0; iiControlGroups.Count();i++) - { - if( iAlfScreens[aScreenNumber]->iControlGroups[i].iControlGroup == &aControlGroup ) - { - return iAlfScreens[aScreenNumber]->iControlGroups[i].iClientWindowGroupId; +TInt CAlfBridge::FindClientWindowGroupId(CHuiControlGroup& aControlGroup ) + { + for (TInt i=0; iiControlGroups.Count();i++) + { + if( iAlfScreens[0]->iControlGroups[i].iControlGroup == &aControlGroup ) + { + return iAlfScreens[0]->iControlGroups[i].iClientWindowGroupId; } } return KErrNotFound; @@ -496,13 +551,13 @@ // FindWindowGroupNodeId // --------------------------------------------------------------------------- // -TInt CAlfBridge::FindWindowGroupNodeId( TInt aScreenNumber, CHuiControlGroup& aControlGroup ) const - { - for (TInt i=0; iiControlGroups.Count();i++) - { - if( iAlfScreens[aScreenNumber]->iControlGroups[i].iControlGroup == &aControlGroup ) - { - return iAlfScreens[aScreenNumber]->iControlGroups[i].iWindowGroupNodeId; +TInt CAlfBridge::FindWindowGroupNodeId(CHuiControlGroup& aControlGroup ) const + { + for (TInt i=0; iiControlGroups.Count();i++) + { + if( iAlfScreens[0]->iControlGroups[i].iControlGroup == &aControlGroup ) + { + return iAlfScreens[0]->iControlGroups[i].iWindowGroupNodeId; } } return KErrNotFound; @@ -576,6 +631,28 @@ } // --------------------------------------------------------------------------- +// FindControlGroupBySecureId +// May return multiple groups +// --------------------------------------------------------------------------- +// +void CAlfBridge::FindControlGroupBySecureId( TInt aSecureId, RPointerArray& aGroupList) + { + if ( aSecureId == 0 ) + { + return; + } + + for ( TInt i = 0; i < iAlfScreens[0]->iControlGroups.Count(); i++ ) + { + TAlfControlGroupEntry& groupEntry = iAlfScreens[0]->iControlGroups[i]; + if ( groupEntry.iSecureId == aSecureId ) + { + aGroupList.Append(groupEntry.iControlGroup); + } + } + } + +// --------------------------------------------------------------------------- // FindControlGroupByFullScreenToEffect // --------------------------------------------------------------------------- // @@ -794,7 +871,7 @@ TInt aSecureId, TInt aScreenNumber ) { - CHuiControlGroup* group = FindControlGroup(aWindowGroupNodeId,aScreenNumber); + CHuiControlGroup* group = FindControlGroup(aWindowGroupNodeId); if (!group) { group = &iHuiEnv->NewControlGroupL(aWindowGroupNodeId); @@ -1089,14 +1166,14 @@ { lSyncDone = ETrue; CHuiControlGroup &lGroup = aRoster.ControlGroup(i+1); - TInt clientWindowGroupId = FindClientWindowGroupId( aScreenNumber, lGroup ); + TInt clientWindowGroupId = FindClientWindowGroupId(lGroup ); iAppUi->AdjustWindowGroupPositionL(clientWindowGroupId,CAlfAppServer::EBehindOfParent); } if(!lSyncDone && aGroup.iAlfApp && aRoster.ControlGroup(i-1).ResourceId() != iAlfWindowGroupNodeId ) { CHuiControlGroup &lGroup = aRoster.ControlGroup(i); - TInt clientWindowGroupId = FindClientWindowGroupId( aScreenNumber, lGroup ); + TInt clientWindowGroupId = FindClientWindowGroupId(lGroup ); iAppUi->AdjustWindowGroupPositionL(clientWindowGroupId,CAlfAppServer::EBehindOfParent); } break; @@ -1145,7 +1222,7 @@ { iAlfWindowGroupNodeId = iAlfScreens[0]->iControlGroups[i].iWindowGroupNodeId; - CHuiControlGroup* controlGroup = FindControlGroup(iAlfWindowGroupNodeId, 0); + CHuiControlGroup* controlGroup = FindControlGroup(iAlfWindowGroupNodeId); CHuiControl& control = controlGroup->Control(0); CHuiVisual* layout = &control.Visual(0); iAlfScreens[0]->iDisplay->Roster().SetAlfEventWindow(layout); @@ -1279,7 +1356,7 @@ numBuf.AppendNum(fps, TRealFormat(5,1)); TRAP_IGNORE( { - iAlfScreens[screenNumber]->iFPSText->SetTextL( numBuf ); + iAlfScreens[0]->iFPSText->SetTextL( numBuf ); }) } } @@ -1290,10 +1367,10 @@ iActivated = (err == KErrNone); } - if (iAlfScreens[screenNumber]->IsVisualTreeVisibilityChanged()) + if (iAlfScreens[0]->IsVisualTreeVisibilityChanged()) { HandleVisualVisibility( screenNumber ); - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(EFalse); + iAlfScreens[0]->SetVisualTreeVisibilityChanged(EFalse); } } } @@ -1356,7 +1433,10 @@ transparent |= (!((aVisual.Flags() & EHuiVisualFlagOpaqueHint) == EHuiVisualFlagOpaqueHint)); transparent |= (aVisual.iOpacity.Now() < KAlfVisualDefaultOpacity); transparent |= (aVisual.iOpacity.Target() < KAlfVisualDefaultOpacity); - + if(aVisual.Effect()) + { + transparent |= (aVisual.iEffectOpacity < KAlfVisualDefaultOpacity); + } return !transparent; } @@ -1487,6 +1567,7 @@ TBool alfWindowGroupFoundVisible = EFalse; TBool alfClientWindowGroupVisible = EFalse; + TBool firstAlfControlGroupFound = EFalse; AMT_SET_VALUE( iVisibleVisualCount, 0 ); @@ -1539,7 +1620,7 @@ } // !fullscreenCovered need to be checked because for fullscreen // alf applications alf event window group could be on top of alf client windowgroup - if ( (alfClientWindowGroupVisible || !fullscreenCovered) && activeSession) + if ( (!firstAlfControlGroupFound || !fullscreenCovered) && activeSession) { // clear inactive flag if client has not made this controlgroup hidden if(!(flags&EHuiVisualFlagUnderOpaqueHint)) @@ -1560,7 +1641,7 @@ iTempRegion.AddRect(fullscreen); iTempRegion.Tidy(); fullscreenCovered = ETrue; - alfClientWindowGroupVisible = EFalse; // change flag so that we don't go in this branch again + firstAlfControlGroupFound = ETrue; // change flag so that we don't go in this branch again } } } @@ -1630,9 +1711,56 @@ subTreeCovered, hasLayers, IsVisualOpaque(*layout) ); } - - TBool hasFadeEffectsInVisualTree = (layout->CanvasFlags() & EHuiCanvasFlagExternalFadeExistsInsideVisualTree); - + if ( hasLayers && iActivated ) + { + HandleLayerVisibility( layout, controlgroup, control, hasActiveVisualsInVisualTree ); + } + + TBool isLayoutActive = !(layout->Flags() & EHuiVisualFlagInactive); + + // we need to set /clear inactive flags before we evaluate the fade effect, + // otherwise the fade effect will be removed without a reason in + // some use cases + if (isLayoutActive && (fullscreenCovered || (!hasActiveVisualsInVisualTree && !IsOpaqueEffect(layout->Effect())))) + { + // don't inactivate alf event wg if alf client is visible + if( !( alfClientWindowGroupVisible && (controlgroup.ResourceId() == iAlfWindowGroupNodeId)) ) + // Setting also the root visual (layout) as inactive, if it had none + // active children. This is because otherwise the Inactive checks won't + // work correctly within RosterImpl ScanDirty & ClearChanged phases. + // If root visual is having an opaque effect, it must remain active + { + layout->SetFlag(EHuiVisualFlagInactive); + } + } + else if(!isLayoutActive && !fullscreenCovered && (hasActiveVisualsInVisualTree || IsOpaqueEffect(layout->Effect())) || + (alfClientWindowGroupVisible && (controlgroup.ResourceId() == iAlfWindowGroupNodeId)) ) + { + layout->ClearFlag(EHuiVisualFlagInactive); + layout->SetPos(fullscreen.iTl); + layout->SetSize(fullscreen.Size()); + + // New visible window group may have received effect just before appearing to the screen. + // start the effect if this is the case. + if(iFSFxData && iFSFxData->iToSecureId == controlgroup.SecureId() ) + { + TInt windowGroupId = FindClientWindowGroupId(controlgroup); + + if (iFSFxData->iToWg == windowGroupId && iFSFxData->State() == EWaitEndFullScreen && + iFSFxData->iTwoPhaseEffect <= CFullScreenEffectState::ESecondPartActive) + { + GfxTriggerEffectWhenFullScreenDrawn(&controlgroup); + } + } + } + + // If root visuals effect is marked as opaque, then add whole screen area as covered. + if (!fullscreenCovered) + { + fullscreenCovered = IsOpaqueEffect(layout->Effect()); + } + + // if native alf app is found visible and the client it self is not covering whole screen, we can assume that alf content // fills the rest. // this is for embedded native alf application cases. Otherwise chained window groups tend to @@ -1649,39 +1777,9 @@ alfClientWindowGroupVisible = ETrue; } } - - // If root visuals effect is marked as opaque, then add whole screen area as covered. - if (!fullscreenCovered) - { - fullscreenCovered = IsOpaqueEffect(layout->Effect()); - } - - if ( hasLayers && iActivated ) - { - HandleLayerVisibility( layout, controlgroup, control, hasActiveVisualsInVisualTree ); - } - - TBool isLayoutActive = !(layout->Flags() & EHuiVisualFlagInactive); - - // we need to set /clear inactive flags before we evaluate the fade effect, - // otherwise the fade effect will be removed without a reason in - // some use cases - if (isLayoutActive && !hasActiveVisualsInVisualTree && !IsOpaqueEffect(layout->Effect())) - { - // Setting also the root visual (layout) as inactive, if it had none - // active children. This is because otherwise the Inactive checks won't - // work correctly within RosterImpl ScanDirty & ClearChanged phases. - // If root visual is having an opaque effect, it must remain active - layout->SetFlag(EHuiVisualFlagInactive); - } - else if(!isLayoutActive && (hasActiveVisualsInVisualTree || IsOpaqueEffect(layout->Effect()))) - { - layout->ClearFlag(EHuiVisualFlagInactive); - layout->SetPos(fullscreen.iTl); - layout->SetSize(fullscreen.Size()); - } - + TBool hasFadeEffectsInVisualTree = (layout->CanvasFlags() & EHuiCanvasFlagExternalFadeExistsInsideVisualTree); + // If we layout is active setup the fade effects. Also if it is inactive, but has been // flagged as containing fade effect, then run the setup as well so that effects which // are no more needed get removed. @@ -2452,14 +2550,12 @@ } case EAlfDSGroupChained: { - __ALFLOGSTRING("CAlfBridge::DoDispatchL, EAlfDSGroupChained"); - // TODO, link groups + HandleGroupChained(data); break; } case EAlfDSGroupChainBroken: { - __ALFLOGSTRING("CAlfBridge::DoDispatchL, EAlfDSGroupChainBroken"); - // TODO, break link + HandleGroupChainBroken(data); break; } case EAlfDSMoveWindowToNewGroup: @@ -2668,7 +2764,6 @@ TInt windowGroupNodeId = aData.iInt1; TInt windowNodeId = aData.iInt2; TAlfWindowAttributes* windowAttributes = (TAlfWindowAttributes*) (*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = windowAttributes->iScreenNumber; __ALFLOGSTRING1("CAlfBridge::HandleNewWindowL: new window %d!",windowNodeId); switch (windowAttributes->iWindowNodeType) @@ -2679,7 +2774,8 @@ windowGroupNodeId, windowAttributes->iClientHandle, windowAttributes->iSecureId, - screenNumber); + 0 // Only one screen for avkon content supported + ); // We just received notification for our own window group creation, store its node id for doing // faster lookups later... @@ -2695,11 +2791,11 @@ case EAlfWinTreeNodeSprite: case EAlfWinTreeNodeTextCursor: { - CHuiControlGroup* controlGroup = FindControlGroup(windowGroupNodeId,screenNumber); + CHuiControlGroup* controlGroup = FindControlGroup(windowGroupNodeId); // Floating sprites only require own group. Normal sprites should behave as normal visuals. if (!controlGroup && windowAttributes->iWindowNodeType == EAlfWinTreeNodeSprite ) { - controlGroup = iAlfScreens[screenNumber]->iFloatingSpriteControlGroup; + controlGroup = iAlfScreens[0]->iFloatingSpriteControlGroup; } if (controlGroup) @@ -2718,7 +2814,7 @@ viz = CHuiCanvasVisual::AddNewL(control, layout); } - __ALFFXLOGSTRING2("CAlfBridge::HandleNewWindowL visual: 0x%x, id 0x%x", viz, windowNodeId); + __ALFFXLOGSTRING3("CAlfBridge::HandleNewWindowL visual: 0x%x, id 0x%x, Owner group Uid: 0x%x", viz, windowNodeId, viz->Owner().ControlGroup()->SecureId()); AddVisual( windowNodeId, windowAttributes->iClientHandle, @@ -2777,7 +2873,7 @@ __ALFLOGSTRING("CAlfBridge::HandleNewWindowL: Unknown window node type received !"); } } - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); } // --------------------------------------------------------------------------- @@ -2860,14 +2956,13 @@ TInt windowNodeId = aData.iInt2; TAlfWindowAttributes* windowAttributes = (TAlfWindowAttributes*) (*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = windowAttributes->iScreenNumber; - + switch (windowAttributes->iWindowNodeType) { case EAlfWinTreeNodeGroup: { HandleVisualVisibility(0); - DeleteControlGroupL(windowGroupNodeId, screenNumber); + DeleteControlGroupL(windowGroupNodeId); break; } case EAlfWinTreeNodeClient: @@ -2887,7 +2982,7 @@ CHuiCanvasVisual* viz; viz = (CHuiCanvasVisual*)FindVisual(windowNodeId); - CHuiControlGroup* controlGroup = FindControlGroup( windowGroupNodeId, screenNumber ); + CHuiControlGroup* controlGroup = FindControlGroup( windowGroupNodeId); // Sprite is in its own group, and can be deleted normally. if ( !controlGroup && windowAttributes->iWindowNodeType != EAlfWinTreeNodeSprite ) { @@ -2927,7 +3022,7 @@ } // TODO: Toolkit does not support recycling (of visuals), // this is not in line with Nokia environmental policy... - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); } // --------------------------------------------------------------------------- @@ -2938,7 +3033,6 @@ { TInt windowNodeId = aData.iInt2; TAlfWindowAttributes* windowAttributes = (TAlfWindowAttributes*) (*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = windowAttributes->iScreenNumber; // fetch visual CHuiVisual* viz = FindVisual(windowNodeId); if (viz) @@ -2950,8 +3044,8 @@ } #endif - viz->SetPos(windowAttributes->iPosition, windowAttributes->iTransitionTime); - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed + viz->SetPos(windowAttributes->iPosition, windowAttributes->iTransitionTime); + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed } else { @@ -2973,7 +3067,6 @@ { TInt windowNodeId = aData.iInt2; TAlfWindowAttributes* windowAttributes = (TAlfWindowAttributes*) (*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = windowAttributes->iScreenNumber; // fetch visual CHuiVisual* viz = FindVisual(windowNodeId); if (viz) @@ -2990,7 +3083,7 @@ { __ALFLOGSTRING("CAlfBridge::HandleSetWindowSizeL, EAlfDSSetWindowSize: Visual not found!"); } - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); AMT_INC_COUNTER_IF(viz, iVisualSizeChangedCount ); AMT_SET_VALUE_IF(viz, iLatestVisualExtentRect, TRect( windowAttributes->iPosition, windowAttributes->iSize ) ); @@ -3036,7 +3129,6 @@ { TInt windowNodeId = aData.iInt2; TAlfWindowAttributes* windowAttributes = (TAlfWindowAttributes*) (*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = windowAttributes->iScreenNumber; // fetch visual CHuiVisual* viz = FindVisual(windowNodeId); if (viz) @@ -3047,9 +3139,9 @@ RDebug::Print(_L("CAlfBridge::HandleSetWindowOpacityL - Tracked visual")); } #endif - viz->iOpacity.Set(windowAttributes->iOpacity, windowAttributes->iTransitionTime); - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed - } + viz->iOpacity.Set(windowAttributes->iOpacity, windowAttributes->iTransitionTime); + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed + } else { __ALFLOGSTRING("CAlfBridge::HandleSetWindowOpacityL, EAlfDSSetWindowOpacity: Visual not found!"); @@ -3064,7 +3156,6 @@ { TInt windowNodeId = aData.iInt2; TAlfWindowAttributes* windowAttributes = (TAlfWindowAttributes*) (*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = windowAttributes->iScreenNumber; // fetch visual CHuiVisual* viz = FindVisual(windowNodeId); if (viz) @@ -3084,7 +3175,7 @@ viz->SetFlag( EHuiVisualFlagOpaqueHint ); } - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed } else { @@ -3100,7 +3191,6 @@ { TInt windowNodeId = aData.iInt2; TAlfWindowAttributes* windowAttributes = (TAlfWindowAttributes*) (*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = windowAttributes->iScreenNumber; // fetch visual CHuiVisual* viz = FindVisual(windowNodeId); if (viz) @@ -3125,7 +3215,7 @@ } } - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed } else { @@ -3142,7 +3232,6 @@ TInt windowNodeId = aData.iInt2; TAny* ptr = (TAny*)(*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = 0; TPoint origin; TInt count = 0; RRegion region; @@ -3150,7 +3239,7 @@ { RMemReadStream str(ptr, 4*sizeof(TInt32)); - screenNumber = str.ReadInt32L(); + str.ReadInt32L(); // screen number, obsolete origin.iX = str.ReadInt32L(); origin.iY = str.ReadInt32L(); count = str.ReadInt32L(); @@ -3188,7 +3277,7 @@ CHuiCanvasVisual* canvas = static_cast(viz); canvas->SetShape( origin, region ); - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); } else { @@ -3207,7 +3296,6 @@ TInt windowGroupNodeId = aData.iInt1; TInt windowNodeId = aData.iInt2; TAlfWindowAttributes* windowAttributes = (TAlfWindowAttributes*) (*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = windowAttributes->iScreenNumber; TInt ordinalPosition = windowAttributes->iOrdinalPosition; switch (windowAttributes->iWindowNodeType) @@ -3227,7 +3315,7 @@ } #endif - CHuiControlGroup* controlGroup = FindControlGroup(windowGroupNodeId,screenNumber); + CHuiControlGroup* controlGroup = FindControlGroup(windowGroupNodeId); if (!controlGroup) { @@ -3235,11 +3323,11 @@ } ResolveAfterEffectAppearingApplicationL(controlGroup); // does nothing, if effect is not active on this control group // Window server nodes are in inverted Z-order, we switch it here. - iAlfScreens[screenNumber]->iDisplay->Roster().Hide(*controlGroup); + iAlfScreens[0]->iDisplay->Roster().Hide(*controlGroup); TInt wsWindowGroupCount = 0; - for (TInt i=0; iiDisplay->Roster().Count();i++) + for (TInt i=0; iiDisplay->Roster().Count();i++) { - if (iAlfScreens[screenNumber]->iDisplay->Roster().ControlGroup(i).Control(0).Role()==EHuiWindowGroupContainer) + if (iAlfScreens[0]->iDisplay->Roster().ControlGroup(i).Control(0).Role()==EHuiWindowGroupContainer) { wsWindowGroupCount++; } @@ -3257,16 +3345,16 @@ ordinalPosition = -1; // show at top ? } - if (iAlfScreens[screenNumber]->iDisplay && controlGroup) + if (iAlfScreens[0]->iDisplay && controlGroup) { - ShowControlGroupL(iAlfScreens[screenNumber]->iDisplay->Roster(), *controlGroup, ordinalPosition, screenNumber); + ShowControlGroupL(iAlfScreens[0]->iDisplay->Roster(), *controlGroup, ordinalPosition); } else { - __ALFLOGSTRING2("CAlfBridge::HandleReorderWindowL, EAlfDSReorder: Control group not found! Screen: %d, Id: %d ", screenNumber, windowNodeId ); + __ALFLOGSTRING1("CAlfBridge::HandleReorderWindowL, EAlfDSReorder: Control group not found! Id: %d ", windowNodeId ); } - ReorderAlfControlGroupsL(screenNumber); + ReorderAlfControlGroupsL(); break; } case EAlfWinTreeNodeClient: @@ -3304,7 +3392,7 @@ } else { - __ALFLOGSTRING2("CAlfBridge::HandleReorderWindowL, EAlfDSReorder: Visual not found! Screen: %d, Id: %d ", screenNumber, windowNodeId ); + __ALFLOGSTRING1("CAlfBridge::HandleReorderWindowL, EAlfDSReorder: Visual not found! Id: %d ", windowNodeId ); } break; } @@ -3315,7 +3403,7 @@ } } - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed AMT_MAP_BRIDGE_SET_ORDINAL_POSITION(); } @@ -3329,7 +3417,6 @@ TInt windowGroupNodeId = aData.iInt1; TInt windowNodeId = aData.iInt2; TAlfWindowCommandBufferAttributes* bufferAttributes = (TAlfWindowCommandBufferAttributes*)(*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = bufferAttributes->iScreenNumber; CHuiCanvasVisual* viz = (CHuiCanvasVisual*)FindVisual(windowNodeId); @@ -3341,7 +3428,7 @@ #ifdef HUI_DEBUG_TRACK_DRAWING TBool tracking( EFalse ); CHuiControlGroup* controlGroup = FindControlGroup( windowGroupNodeId, screenNumber ); - CAlfScreen* screen = iAlfScreens[screenNumber]; + CAlfScreen* screen = iAlfScreens[0]; //TInt clientWindowGroupId = FindClientWindowGroupId( screenNumber, *controlGroup ); // NOTE, THE FOLLOWING WServClientFileName MAY CAUSE DEADLOCK. @@ -3364,7 +3451,7 @@ { // For performance resons, only set visual tree changed if this // was the first buffer for the window. - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); } TPtrC8 commands((TUint8*)bufferAttributes->iBuffer, bufferAttributes->iBufferLength); @@ -3425,12 +3512,14 @@ } else { - __ALFLOGSTRING3("CAlfBridge::HandlePostCanvasBufferL, EAlfDSPostCanvasBuffer: Visual not found! Screen: %d, Id: %d, GroupId: %d ", screenNumber, windowNodeId, windowGroupNodeId ); + __ALFLOGSTRING2("CAlfBridge::HandlePostCanvasBufferL, EAlfDSPostCanvasBuffer: Visual not found! Id: %d, GroupId: %d ", windowNodeId, windowGroupNodeId ); } + // Uncomment the following for tracking which application is doing drawing + //__ALFFXLOGSTRING1("CAlfBridge::HandlePostCanvasBufferL 0x%x", viz->Owner().ControlGroup()->SecureId()); #ifdef USE_APPLICATION_ENDFULLSCREEN_TIMEOUT if (iFSFxData && iFSFxData->iEffectType != CFullScreenEffectState::ENotDefinedEffect - && ((iFSFxData->State() == EWaitEndFullScreen && iFSFxData->iTwoPhaseEffect <= CFullScreenEffectState::EFirstPartRunning))) + && ((iFSFxData->State() == EWaitEndFullScreen && iFSFxData->iTwoPhaseEffect <= CFullScreenEffectState::ESecondPartActive))) { CHuiControlGroup *to_group = NULL; if (iFSFxData->iEffectType == CFullScreenEffectState::EExitEffect) @@ -3505,6 +3594,7 @@ TInt effectIndex; if (!HasActiveEffect(aVisual, effectIndex)) { + __ALFFXLOGSTRING2("CAlfBridge::SetWindowActiveL 0x%x - New state: %d", aVisual, aActive); // Does not have effect if (aActive) { @@ -3570,7 +3660,6 @@ TInt windowGroupNodeId = aData.iInt1; TInt windowNodeId = aData.iInt2; TAlfWindowAttributes* windowAttributes = (TAlfWindowAttributes*)(*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = windowAttributes->iScreenNumber; if (windowAttributes->iWindowNodeType == EAlfWinTreeNodeTextCursor && iCursorTimer) { @@ -3589,7 +3678,7 @@ { case EAlfWinTreeNodeGroup: { - CHuiControlGroup* controlGroup = FindControlGroup(windowGroupNodeId,screenNumber); + CHuiControlGroup* controlGroup = FindControlGroup(windowGroupNodeId); if (controlGroup) { CHuiControl& control = controlGroup->Control(0); @@ -3635,7 +3724,7 @@ break; } } - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed AMT_INC_COUNTER( iTotalVisualFlagChangedCount ); AMT_INC_COUNTER_IF( windowAttributes->iActive, iActiveVisualCount ); @@ -3657,7 +3746,6 @@ TInt windowGroupNodeId = aData.iInt1; TInt windowNodeId = aData.iInt2; TAlfWindowAttributes* windowAttributes = (TAlfWindowAttributes*)(*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = windowAttributes->iScreenNumber; TInt windowFlag = windowAttributes->iActive; THuiVisualFlags visualFlag = (THuiVisualFlags)0; switch(windowFlag) @@ -3679,7 +3767,7 @@ { case EAlfWinTreeNodeGroup: { - CHuiControlGroup* controlGroup = FindControlGroup(windowGroupNodeId,screenNumber); + CHuiControlGroup* controlGroup = FindControlGroup(windowGroupNodeId); if (controlGroup) { CHuiControl& control = controlGroup->Control(0); @@ -3740,7 +3828,7 @@ break; } } - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed } // --------------------------------------------------------------------------- @@ -3824,7 +3912,6 @@ TInt windowGroupNodeId = aData.iInt1; TInt windowNodeId = aData.iInt2; TAlfWindowAttributes* windowAttributes = (TAlfWindowAttributes*)(*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = windowAttributes->iScreenNumber; // fetch visual CHuiCanvasVisual* viz = FindVisual(windowNodeId); @@ -3860,7 +3947,7 @@ if (iAlfWindowGroupNodeId != windowGroupNodeId) __ALFLOGSTRING("CAlfBridge::HandleSetSurfaceExtentL, EAlfDSSetSurfaceExtent: Visual not found!"); } - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed } // --------------------------------------------------------------------------- @@ -3872,7 +3959,6 @@ TInt windowGroupNodeId = aData.iInt1; TInt windowNodeId = aData.iInt2; TAlfWindowAttributes* windowAttributes = (TAlfWindowAttributes*)(*iHost)->GetVarDataL( (TInt)aData.iPtr ); - TInt screenNumber = windowAttributes->iScreenNumber; // fetch visual CHuiCanvasVisual* viz = (CHuiCanvasVisual*)FindVisual(windowNodeId); @@ -3889,7 +3975,7 @@ if (iAlfWindowGroupNodeId != windowGroupNodeId) __ALFLOGSTRING("CAlfBridge::HandleLayerUsesAlphaFlagChanged: Visual not found!"); } - iAlfScreens[screenNumber]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed + iAlfScreens[0]->SetVisualTreeVisibilityChanged(ETrue); // TODO: Check if really changed } @@ -4334,6 +4420,45 @@ return (didFadeEffectLoad || alreadyFaded); } +// --------------------------------------------------------------------------- +// HandleGroupChained +// +// Chain information is used for redirecting effects to correct windowgroup +// --------------------------------------------------------------------------- +// +void CAlfBridge::HandleGroupChained( TAlfBridgerData& aData) + { + TInt parentId = aData.iInt1; + TInt chainedId = aData.iInt2; + + TChainData data(parentId, chainedId); + iWindowChainsArray.Insert(parentId,data); + __ALFFXLOGSTRING3("CAlfBridge::DoDispatchL, EAlfDSGroupChained %d chained to %d (host), iWindowChainsArray.Count() = %d", chainedId, parentId, iWindowChainsArray.Count()); +#ifdef _ALF_FXLOGGING + CHuiControlGroup* parent = FindControlGroup(parentId); + CHuiControlGroup* chained = FindControlGroup(chainedId); + + if (parent) + { + RDebug::Printf("CAlfBridge::DoDispatch - parent: 0x%x", parent->SecureId()); + } + if (chained) + { + RDebug::Printf("CAlfBridge::DoDispatch - chained: 0x%x", chained->SecureId()); + } +#endif + } + +// --------------------------------------------------------------------------- +// HandleGroupChainBroken +// --------------------------------------------------------------------------- +// +void CAlfBridge::HandleGroupChainBroken( TAlfBridgerData& aData) + { + TInt parentId = aData.iInt2; + iWindowChainsArray.Remove(parentId); + __ALFFXLOGSTRING2("CAlfBridge::DoDispatchL, EAlfDSGroupChainBroken - parent: %d, iWindowChainsArray.Count() = %d", parentId, iWindowChainsArray.Count()); + } // --------------------------------------------------------------------------- // HandleMoveWindowToNewGroupL @@ -4342,7 +4467,6 @@ void CAlfBridge::HandleMoveWindowToNewGroupL( TAlfBridgerData& aData ) { TInt windowNodeId = aData.iInt1; - TInt screenNumber = aData.iInt2; TInt newWindowGroupNodeId = (TInt)aData.iPtr; CHuiCanvasVisual* viz = (CHuiCanvasVisual*)FindVisual(windowNodeId); @@ -4352,7 +4476,7 @@ TInt oldWindowGroupId = 0; if ( oldControlGroup ) { - oldWindowGroupId = FindWindowGroupNodeId(screenNumber, *oldControlGroup ); + oldWindowGroupId = FindWindowGroupNodeId(*oldControlGroup ); } __ALFLOGSTRING3("CAlfBridge::HandleMoveWindowToNewGroupL moving nodeId 0x%x from group 0x%x to 0x%x ",windowNodeId, oldWindowGroupId, newWindowGroupNodeId ); #endif @@ -4386,7 +4510,7 @@ viz->Owner().Remove(viz); // #2 insert visual to the beginning of the new group - CHuiControlGroup* newControlGroup = FindControlGroup(newWindowGroupNodeId,screenNumber); + CHuiControlGroup* newControlGroup = FindControlGroup(newWindowGroupNodeId); if (newControlGroup) { CHuiControl& newControl = newControlGroup->Control(0); @@ -4432,7 +4556,7 @@ } else { - CHuiControlGroup* cg = FindControlGroup(windowNodeId, 0); // TODO: Screen + CHuiControlGroup* cg = FindControlGroup(windowNodeId); // TODO: Screen if (cg) { CHuiControl& control = cg->Control(0); @@ -4624,11 +4748,101 @@ } } -TBool CAlfBridge::HandleGfxEventL(CFullScreenEffectState& aEvent, CHuiLayout* aToLayout, CHuiLayout *aFromLayout) +// --------------------------------------------------------------------------- +// HandleGfxRedirection +// +// This effect might have been request for the host application, while the intent was to show it on the application started embedded. +// Embedded application has its _own_ windowgroup separate from the host application. Fullscreen effect are shown on a windowgroup level. +// e.g. Messaging -> New Message (editor), or Settings -> Themes (application) +// Wserv notifies us the window group chaining of applications. See HandleGroupChained and HandleGroupChainBroken for more details. This code +// will redirect the requested effect on correct windowgroup. +// +// NOTE! If embedded application effects are implemented, this will need revision +// --------------------------------------------------------------------------- + +void CAlfBridge::HandleGfxRedirection(CFullScreenEffectState& aEvent, CHuiLayout*& aToLayout) + { + TInt windowGroupNodeId = FindWindowGroupNodeId(*((*aToLayout).Owner().ControlGroup())); + CHuiControlGroup* chainedGroup = NULL; + + // check, if the effect is being asked for chained application. This propably indicates that there are two or more instances of it and + // effect was supposed to go to the single standalone instance + if (IsChainedGroup(windowGroupNodeId)) + { + RPointerArray groupList; + FindControlGroupBySecureId(aEvent.iToSecureId, groupList); + TInt i = groupList.Count(); + TInt standaloneGroups = 0; + while(--i >= 0) + { + windowGroupNodeId = FindWindowGroupNodeId(*groupList[i]); + + if (!IsChainedGroup(windowGroupNodeId)) + { + // This is an educated guess, which will make the standalone version to have effect. + // Currently (tm) standard appstart effect is never requested for embbedded instances. + chainedGroup = groupList[i]; + standaloneGroups++; + __ALFFXLOGSTRING2("CAlfBridge::HandleGfxRedirection - Wg id: %d is NOT chained. Index: %d",windowGroupNodeId, i); + } + else + { + __ALFFXLOGSTRING2("CAlfBridge::HandleGfxRedirection - Wg id: %d IS chained. Index: %d", windowGroupNodeId, i); + } + } + groupList.Close(); + // If there are multiple standalone app groups (e.g. single application having multiple groups), effecting anything would be a guess. + if (standaloneGroups>1) + { + chainedGroup = NULL; + aEvent.iIsRedirected = ETrue; + if (iFSFXDataPart2) + { + iFSFXDataPart2->iIsRedirected = ETrue; + } + } + } + else + { + // Which group is chained to this group? + TUint32 chainedId = FindChainedGroup(windowGroupNodeId); + chainedGroup = FindControlGroup(chainedId); + } + + if (chainedGroup) + { + __ALFFXLOGSTRING2("CAlfBridge::HandleGfxEffects - Chained app found for this application. Transferring effect from 0x%x to 0x%x.", aToLayout->Owner().ControlGroup()->SecureId(), chainedGroup->SecureId()); + aToLayout = (CHuiLayout*)&chainedGroup->Control(0).Visual(0); + // we'll change the original effect request to point to this new group. Thus, if effect is + // canceled, it will be removed from the right place. + aEvent.iIsRedirected = ETrue; + aEvent.iToSecureId = chainedGroup->SecureId(); // Update the effect + aEvent.iToWg = FindClientWindowGroupId(*chainedGroup); + + if (iFSFXDataPart2) + { + iFSFXDataPart2->iIsRedirected = ETrue; + iFSFXDataPart2->iToSecureId = aEvent.iToSecureId; + iFSFXDataPart2->iToWg = aEvent.iToWg; + } + } + } + +// --------------------------------------------------------------------------- +// HandleGfxEventL +// +// --------------------------------------------------------------------------- +// +TBool CAlfBridge::HandleGfxEventL(CFullScreenEffectState& aEvent, CHuiLayout* aToLayout, CHuiLayout* /*aFromLayout */) { __ALFFXLOGSTRING3("CAlfBridge::HandleGfxEventL - To SecureUid: 0x%x, From SecureUid: 0x%x, effect %S", aEvent.iToSecureId, aEvent.iFromSecureId, aEvent.iEffectName); - __ALFFXLOGSTRING4("CAlfBridge::HandleGfxEventL - To layout: 0x%x, From layout: 0x%x, Effect handle: %d, Action: %d", aToLayout, aFromLayout, aEvent.iHandle, aEvent.iAction); - + __ALFFXLOGSTRING3("CAlfBridge::HandleGfxEventL - To layout: 0x%x Effect handle: %d, Action: %d", aToLayout, aEvent.iHandle, aEvent.iAction); + + if (!aEvent.iIsRedirected) + { + HandleGfxRedirection(aEvent, aToLayout); + } + TInt err = KErrNone; TBool failed = EFalse; @@ -4680,8 +4894,6 @@ case AknTransEffect::EApplicationStartSwitchRect: case KAlfFSTaskSwapperAppStart: { - aToLayout->iOpacity.Set(0.0f); // these are meant for applications that are not yet ready to be drawn, but possible already on the foreground - FreezeLayoutUntilEffectDestroyedL(aFromLayout, aEvent.iHandle); aEvent.iEffectType = CFullScreenEffectState::EStartEffect; if (iFSFXDataPart2) { @@ -4764,10 +4976,12 @@ if (aToLayout) { - // if this was timeout appstart effect, we need to take screenshot at this point. - // It was not taken in the beginfullscreen - - if (aEvent.iLongAppStartTimeout) + + // However, if this is timeout, then we should be having update to date screenshot for the long app start effect usage + // For the second part of the effect, screenshot must be update. Thus the transition may continue smoothly, where app_start_long.fxml finished. + if ((aEvent.iLongAppStartTimeout && !aToLayout->StoredRenderBuffer()) + || aEvent.iTwoPhaseEffect == CFullScreenEffectState::ESecondPartActive // update the screenshot, that the app_start effect can use the end result of app_start_long.fxml as input + ) { __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - taking screenshot for the timeout appstart effect. Handle: %d", aEvent.iHandle ); aToLayout->SetStoredRenderBufferModificationsEnabled(ETrue); @@ -4824,8 +5038,7 @@ } __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - Active effect group: %d", activeEffectGroup); effectFlags = KHuiFxDelayRunUntilFirstFrameHasBeenDrawn; - if (FxmlHasOpaqueHint(iHuiEnv->EffectsEngine(), *aEvent.iEffectName) || - aEvent.iTwoPhaseEffect == CFullScreenEffectState::ESecondPartActive) + if (FxmlHasOpaqueHint(iHuiEnv->EffectsEngine(), *aEvent.iEffectName)) { effectFlags |= KHuiFxOpaqueHint; } @@ -4892,13 +5105,16 @@ if (aLayout) { TRAPD(err, StoreRenderBufferStartL(aLayout)); - __ALFFXLOGSTRING2("CAlfBridge::FreezeLayoutUntilEffectDestroyed - StoreRenderBufferStartL call returned: %d for layout 0x%x", err, aLayout); + __ALFFXLOGSTRING3("CAlfBridge::FreezeLayoutUntilEffectDestroyed - Storing SecureId x%x, StoreRenderBufferStartL call returned: %d for layout 0x%x", aLayout->Owner().ControlGroup()->SecureId(), err, aLayout); if (err == KErrNone) { // Freeze only, if buffer was reserved succesfully aLayout->SetFreezeState(ETrue); - TBool itemsDestroyed; - AddFxItemL(aHandle, aLayout, NULL, NULL, EFalse, itemsDestroyed, ETrue, EFalse); + if (!HasActiveEffect(aLayout)) + { + TBool itemsDestroyed; + AddFxItemL(aHandle, aLayout, NULL, NULL, EFalse, itemsDestroyed, ETrue, EFalse); + } iFSFxData->iAppStartScreenshotItemHandle = aHandle; } } @@ -5009,7 +5225,7 @@ // If we are in low memory state, we don't want to do any effects if(iHuiEnv->MemoryLevel() < EHuiMemoryLevelReduced) { - __ALFFXLOGSTRING("CAlfBridge::HandleGfxEffectsL - Returning because memory level below NORMAL"); + __ALFFXLOGSTRING("CAlfBridge::HandleGfxEffectsL - WARNING! - Returning because memory level below NORMAL - EFFECT IS NOT SHOWN!"); stream.Release(); return; } @@ -5247,6 +5463,7 @@ && fxData->iOperation == MAlfGfxEffectPlugin::EBeginFullscreen && fxData->iEffectType == CFullScreenEffectState::EStartEffect) { + __ALFFXLOGSTRING("CAlfBridge::HandleGfxEffectsL - Try triggering effect immediately"); GfxTriggerEffectWhenFullScreenDrawn(toGroup); } } @@ -5296,9 +5513,10 @@ CHuiControl& control = aToGroup->Control(0); CHuiLayout* toLayout = control.VisualCount() > 0 ? (CHuiLayout*)&control.Visual(0) : NULL; - if (!toLayout) + if (!toLayout || (toLayout->Flags() & EHuiVisualFlagInactive )) { // no point starting effect, if the layout is still inactive. + __ALFFXLOGSTRING1("CAlfBridge::GfxTriggerEffectWhenFullScreenDrawn - Do not trigger. Layout 0x%x inactive or not found.", toLayout); return EFalse; } TBool opaque = ETrue; // in app start case the layout is propably not opaque. Fake it. @@ -5307,7 +5525,7 @@ // alf content check is relavant only for alf apps if (!fullscreenCovered && aToGroup->iAlfApp) { - TInt clientGroupId = FindClientWindowGroupId(0, *aToGroup); + TInt clientGroupId = FindClientWindowGroupId(*aToGroup); if (clientGroupId != KErrNotFound) { fullscreenCovered = HasActiveAlfContent(clientGroupId);