diff -r aecbbf00d063 -r d48ab3b357f1 uifw/EikStd/coctlsrc/AknClearer.cpp --- a/uifw/EikStd/coctlsrc/AknClearer.cpp Tue Aug 31 15:28:30 2010 +0300 +++ b/uifw/EikStd/coctlsrc/AknClearer.cpp Wed Sep 01 12:16:19 2010 +0100 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -20,7 +20,6 @@ #include #include "aknclearer.h" #include -#include #include #include #include @@ -36,6 +35,7 @@ #include #include #include +#include #ifdef SYMBIAN_ENABLE_SPLIT_HEADERS #include @@ -50,153 +50,95 @@ enum TAknScreenClearerBaseFlags { - EAknScreenClearerDrawNavi, - EAknScreenClearerBlankAppStatusPane, - EAknScreenClearerDrawNaviSolid, + EAknScreenClearerBlankAppStatusPane }; enum { - ELayerCbaBackground=0, - ELayerBackground = 1, - ELayerExtension = 2, - ELayerStripe = 3, - ELayerWallpaper = 4, - ELayerN = 5 + ELayerBackground = 0, + ELayerExtension = 1, + ELayerStripe = 2, + ELayerWallpaper = 3, + ELayerN = 4 }; - enum - { - ELayerStaconCbaBackground=0, - ELayerStaconTop = 1, - ELayerStaconBottom = 2, - ELayerStaconMain = 3, - ELayerStaconWallpaper = 4, - ELayerStaconN = 5 - }; - enum { - ELayerFlatCbaBackground=0, - ELayerFlatBackground = 1, - ELayerFlatTl = 2, - ELayerFlatTr = 3, - ELayerFlatBl = 4, - ELayerFlatBr = 5, - ELayerFlatT = 6, - ELayerFlatB = 7, - ELayerFlatR = 8, - ELayerFlatL = 9, - ELayerFlatCenter = 10, - ELayerFlatMain = 11, - ELayerFlatWallpaper = 12, - ELayerSCtrl1 = 13, - ELayerSCtrl2 = 14, - ELayerSCtrl3 = 15, - ELayerSCtrl4 = 16, - ELayerSCtrl5 = 17, - ELayerFlatN = 18 + ELayerStaconTop = 0, + ELayerStaconBottom = 1, + ELayerStaconMain = 2, + ELayerStaconWallpaper = 3, + ELayerStaconN = 4 + }; + +enum + { + ELayerFlatBackground = 0, + ELayerFlatTl = 1, + ELayerFlatTr = 2, + ELayerFlatBl = 3, + ELayerFlatBr = 4, + ELayerFlatT = 5, + ELayerFlatB = 6, + ELayerFlatR = 7, + ELayerFlatL = 8, + ELayerFlatCenter = 9, + ELayerFlatMain = 10, + ELayerFlatWallpaper = 11, + ELayerFlatN = 12 }; class CAknScreenClearerBaseExtension : public CBase { - public: - ~CAknScreenClearerBaseExtension() - { - delete iNaviWipe; - delete iNaviMask; - delete iBgContext; - } - public: - CFbsBitmap* iNaviWipe; - CFbsBitmap* iNaviMask; - CAknsLayeredBackgroundControlContext* iBgContext; - TInt iOrdinalPosition; +public: + ~CAknScreenClearerBaseExtension() + { + delete iBgContext; + } +public: + CAknsLayeredBackgroundControlContext* iBgContext; + TInt iOrdinalPosition; + TBool iTransparent; }; -/* THIS FUNCTION IS NOT USED - -static void LoadAndFlipBitmapL( - CFbsBitmap* aTrg, const TDesC& aFile, const TInt aIndex ) - { - User::LeaveIfNull(aTrg); - - CFbsBitmap* sourceBitmap = new (ELeave) CFbsBitmap(); - CleanupStack::PushL(sourceBitmap); - User::LeaveIfError(sourceBitmap->Load(aFile, aIndex, ETrue)); - TSize sourceBitmapSize = sourceBitmap->SizeInPixels(); - - User::LeaveIfError(aTrg->Create(sourceBitmapSize, sourceBitmap->DisplayMode())); - - CFbsBitmapDevice* destinationDevice = CFbsBitmapDevice::NewL( aTrg ); - CleanupStack::PushL(destinationDevice); - - CFbsBitGc* destinationGc; - User::LeaveIfError( destinationDevice->CreateContext( destinationGc ) ); - - TRect sourceBitmapBlittingRect( 0,0,1,sourceBitmapSize.iHeight ); - - for ( TInt xPos=sourceBitmapSize.iWidth-1; xPos >= 0; xPos-- ) - { - destinationGc->BitBlt( TPoint(xPos,0), sourceBitmap, sourceBitmapBlittingRect ); - sourceBitmapBlittingRect.iTl.iX++; - sourceBitmapBlittingRect.iBr.iX++; - } - - delete destinationGc; - CleanupStack::PopAndDestroy(2); // sourceBitmap, destinationDevice - } -*/ - -/* THIS FUNCTION IS NOT USED - -static CFbsBitmap* FlipBitmapL( CFbsBitmap* aBitmap ) - { - User::LeaveIfNull(aBitmap); - - TSize sourceBitmapSize = aBitmap->SizeInPixels(); - - // get a copy of wanted rect of source bitmap to tmpBitmap - CFbsBitmap* tmpBitmap = new (ELeave) CFbsBitmap(); - CleanupStack::PushL( tmpBitmap ); - - User::LeaveIfError( tmpBitmap->Create( sourceBitmapSize, aBitmap->DisplayMode() ) ); - - CFbsBitmapDevice* destinationDevice = CFbsBitmapDevice::NewL( tmpBitmap ); - CleanupStack::PushL( destinationDevice ); - - CFbsBitGc* destinationGc; - User::LeaveIfError( destinationDevice->CreateContext( destinationGc ) ); - - TRect sourceBitmapBlittingRect( 0,0,1,sourceBitmapSize.iHeight ); - - for ( TInt xPos=sourceBitmapSize.iWidth-1; xPos >= 0; xPos-- ) - { - destinationGc->BitBlt( TPoint(xPos,0), aBitmap, sourceBitmapBlittingRect ); - sourceBitmapBlittingRect.iTl.iX++; - sourceBitmapBlittingRect.iBr.iX++; - } - - delete destinationGc; - CleanupStack::PopAndDestroy(); // destinationDevice - CleanupStack::Pop(); // tmpBitmap - - return tmpBitmap; - } -*/ EXPORT_C CAknScreenClearerBase::~CAknScreenClearerBase() { delete iExtension; } + +void CAknScreenClearerBase::CreateExtensionL() + { + if ( !iExtension ) + { + iExtension = new (ELeave) CAknScreenClearerBaseExtension; + } + } + + +void CAknScreenClearerBase::SetTransparent( TBool aTransparent ) + { + iExtension->iTransparent = aTransparent; + } + + EXPORT_C void CAknScreenClearerBase::ConstructL(RWindowGroup& aParent, TInt aOrdinalPos, TBool aBlankAppStatusPane) { - iExtension = new (ELeave) CAknScreenClearerBaseExtension(); + CreateExtensionL(); CreateWindowL(&aParent); + if ( iExtension->iTransparent ) + { + EnableWindowTransparency(); + } + + CAlfEffectObserver* alfEffectObserver = CAlfEffectObserver::NewL(); + alfEffectObserver->SetDistractionWindow(*DrawableWindow()); + delete alfEffectObserver; + iFlags.Assign(EAknScreenClearerBlankAppStatusPane, aBlankAppStatusPane); SetShapeL(); @@ -226,66 +168,17 @@ { CWindowGc& gc = SystemGc(); MAknsSkinInstance* skin = AknsUtils::SkinInstance(); - AknsDrawUtils::Background( skin, iExtension->iBgContext, this, gc, Rect() ); - if (Layout_Meta_Data::IsPenEnabled() && Layout_Meta_Data::IsLandscapeOrientation()) - { -#if 0 - TRect application_window( KWholeScreen ); - TAknLayoutRect area_side_right_pane; - TInt variety = 0; - area_side_right_pane.LayoutRect(application_window, AknLayoutScalable_Avkon::area_side_right_pane(variety)); - - CFbsBitmap *mask1 = AknsUtils::GetCachedBitmap( skin, KAknsIIDQgnIndiSctrlSkMaskLsc ); - CFbsBitmap *mask5 = AknsUtils::GetCachedBitmap( skin, KAknsIIDQgnIndiSctrlSkMaskLsc ); - - CFbsBitmap *bitmap = new(ELeave)CFbsBitmap; - CleanupStack::PushL(bitmap); - bitmap->Create(area_side_right_pane.Rect().Size(), EColor16MA); - CFbsBitGc* bitmapContext = NULL; - CFbsBitmapDevice* bitmapDevice = - CFbsBitmapDevice::NewL( bitmap ); - CleanupStack::PushL( bitmapDevice ); - bitmapDevice->CreateContext( bitmapContext ); - CleanupStack::PushL( bitmapContext ); - - TRect area_side_right_pane_rect = area_side_right_pane.Rect(); - area_side_right_pane_rect.iTl = TPoint(0,0); - - TAknLayoutRect sctrl_sk_top_pane; - sctrl_sk_top_pane.LayoutRect(area_side_right_pane_rect, AknLayoutScalable_Avkon::sctrl_sk_top_pane(0)); - - TAknLayoutRect sctrl_sk_bottom_pane; - sctrl_sk_bottom_pane.LayoutRect(area_side_right_pane_rect, AknLayoutScalable_Avkon::sctrl_sk_bottom_pane(0)); - - TAknLayoutRect grid_sctrl_middle_pane; - grid_sctrl_middle_pane.LayoutRect(area_side_right_pane_rect, AknLayoutScalable_Avkon::grid_sctrl_middle_pane(0)); - - TAknLayoutRect cell_sctrl_middle_pane1; - cell_sctrl_middle_pane1.LayoutRect(grid_sctrl_middle_pane.Rect(), AknLayoutScalable_Avkon::cell_sctrl_middle_pane(0,0,0)); - TAknLayoutRect cell_sctrl_middle_pane2; - cell_sctrl_middle_pane2.LayoutRect(grid_sctrl_middle_pane.Rect(), AknLayoutScalable_Avkon::cell_sctrl_middle_pane(0,0,1)); - TAknLayoutRect cell_sctrl_middle_pane3; - cell_sctrl_middle_pane3.LayoutRect(grid_sctrl_middle_pane.Rect(), AknLayoutScalable_Avkon::cell_sctrl_middle_pane(0,0,2)); - - AknsDrawUtils::DrawFrame( skin, *bitmapContext, sctrl_sk_top_pane.Rect(), Convert(sctrl_sk_top_pane.Rect()), KAknsIIDQgnFrSctrlSkButton, KAknsIIDQgnFrSctrlSkButtonCenter); - AknsDrawUtils::DrawFrame( skin, *bitmapContext, cell_sctrl_middle_pane1.Rect(), Convert2(cell_sctrl_middle_pane1.Rect()), KAknsIIDQgnFrSctrlButton, KAknsIIDQgnFrSctrlButtonCenter); - AknsDrawUtils::DrawFrame( skin, *bitmapContext, cell_sctrl_middle_pane2.Rect(), Convert2(cell_sctrl_middle_pane2.Rect()), KAknsIIDQgnFrSctrlButton, KAknsIIDQgnFrSctrlButtonCenter); - AknsDrawUtils::DrawFrame( skin, *bitmapContext, cell_sctrl_middle_pane3.Rect(), Convert2(cell_sctrl_middle_pane3.Rect()), KAknsIIDQgnFrSctrlButton, KAknsIIDQgnFrSctrlButtonCenter); - AknsDrawUtils::DrawFrame( skin, *bitmapContext, sctrl_sk_bottom_pane.Rect(), Convert(sctrl_sk_bottom_pane.Rect()), KAknsIIDQgnFrSctrlSkButton, KAknsIIDQgnFrSctrlSkButtonCenter); - - TSize size1 = sctrl_sk_top_pane.Rect().Size(); - TSize size5 = sctrl_sk_bottom_pane.Rect().Size(); - AknIconUtils::SetSize(mask1, size1, EAspectRatioNotPreserved); - AknIconUtils::SetSize(mask5, size5, EAspectRatioNotPreserved); - - gc.BitBltMasked( area_side_right_pane.Rect().iTl+sctrl_sk_top_pane.Rect().iTl, bitmap, sctrl_sk_top_pane.Rect(), mask1, EFalse); - gc.BitBltMasked( area_side_right_pane.Rect().iTl+sctrl_sk_bottom_pane.Rect().iTl, bitmap, sctrl_sk_bottom_pane.Rect(), mask5, EFalse); - - CleanupStack::PopAndDestroy(3); // bitmap, bitmapdevice, bitmapcontext -#endif - } - + if ( !iExtension->iTransparent ) + { + AknsDrawUtils::Background( skin, iExtension->iBgContext, this, gc, Rect() ); + } + else + { + gc.SetDrawMode( CGraphicsContext::EDrawModeWriteAlpha ); + gc.Clear( Rect() ); + gc.Reset(); + } iEikonEnv->WsSession().Flush(); return; @@ -318,31 +211,51 @@ CEikStatusPaneBase* sp = CEikStatusPaneBase::Current(); - if (iFlags[EAknScreenClearerBlankAppStatusPane]) + // Set the clearer window's size so that it covers the screen in both + // portrait and landscape orientations simultaneously. + // This is done in order to prevent NGA from drawing control groups + // underneath the fullscreen foreground application in cases the clearer + // orientation can't be readily updated during the layout switch, due + // to e.g. application startup taking a long time. + // Note that only the clearer window's size is set to be larger, the + // skin background is still the screen size so that the skin background + // won't get stretched. + TRect screenRect( KWholeScreen ); + TRect squareScreenRect( screenRect ); + if ( squareScreenRect.Width() > squareScreenRect.Height() ) { - shape.AddRect(KWholeScreen); + squareScreenRect.SetHeight( squareScreenRect.Width() ); } else { - shape.AddRect(KWholeScreen); - sp->GetShapeL(appStatuspaneShape, !iFlags[EAknScreenClearerBlankAppStatusPane], ETrue); - shape.SubRegion(appStatuspaneShape); + squareScreenRect.SetWidth( squareScreenRect.Height() ); + } + + if ( iFlags[EAknScreenClearerBlankAppStatusPane] ) + { + shape.AddRect( squareScreenRect ); + } + else + { + // Square shape is used only if the clearer is used to clear the + // whole screen. + shape.AddRect( screenRect ); + sp->GetShapeL( appStatuspaneShape, + !iFlags[EAknScreenClearerBlankAppStatusPane], + ETrue ); + shape.SubRegion( appStatuspaneShape ); } - if (shape.CheckError()) - User::Leave(KErrNoMemory); - - SetRect(KWholeScreen); - DrawableWindow()->SetShape(shape); + if ( shape.CheckError() ) + { + User::Leave( KErrNoMemory ); + } - CleanupStack::PopAndDestroy(2); // close shapes + SetRect( iFlags[EAknScreenClearerBlankAppStatusPane] ? squareScreenRect : + screenRect ); + DrawableWindow()->SetShape( shape ); - TBool drawNavi = - iFlags[EAknScreenClearerBlankAppStatusPane] && - sp->IsVisible() && - sp->PaneCapabilities(TUid::Uid(EEikStatusPaneUidNavi)).IsInCurrentLayout(); - - iFlags.Assign(EAknScreenClearerDrawNavi, drawNavi); + CleanupStack::PopAndDestroy( 2, &shape ); // close shapes } @@ -354,27 +267,23 @@ iExtension->iBgContext->SetLayerImage( n, KAknsIIDNone ); } - TBool widescreenPaneUsed( - R_AVKON_WIDESCREEN_PANE_LAYOUT_USUAL == - AVKONENV->StatusPaneResIdForCurrentLayout( - R_AVKON_STATUS_PANE_LAYOUT_USUAL ) || - R_AVKON_WIDESCREEN_PANE_LAYOUT_IDLE == - AVKONENV->StatusPaneResIdForCurrentLayout( - R_AVKON_STATUS_PANE_LAYOUT_IDLE ) ); + CAknEnv* aknEnv = AVKONENV; + + TInt usualSpLayout = + aknEnv->StatusPaneResIdForCurrentLayout( + R_AVKON_STATUS_PANE_LAYOUT_USUAL ); - // Check that if in landscape mode statuspane is changed to stacon pane - TBool staconPaneUsedInLandscape = - ( ( R_AVKON_STATUS_PANE_LAYOUT_USUAL != - AVKONENV->StatusPaneResIdForCurrentLayout( - R_AVKON_STATUS_PANE_LAYOUT_USUAL ) ) && - ( R_AVKON_STATUS_PANE_LAYOUT_USUAL_MIRRORED != - AVKONENV->StatusPaneResIdForCurrentLayout( - R_AVKON_STATUS_PANE_LAYOUT_USUAL ) ) ); - + TInt idleSpLayout = + aknEnv->StatusPaneResIdForCurrentLayout( + R_AVKON_STATUS_PANE_LAYOUT_IDLE ); + + TBool widescreenPaneUsed = + ( usualSpLayout == R_AVKON_WIDESCREEN_PANE_LAYOUT_USUAL ) || + ( idleSpLayout == R_AVKON_WIDESCREEN_PANE_LAYOUT_IDLE ); + TBool flatStatuspaneusedInLandscape = - ( R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT == - AVKONENV->StatusPaneResIdForCurrentLayout( - R_AVKON_STATUS_PANE_LAYOUT_USUAL ) ); + ( usualSpLayout == R_AVKON_WIDESCREEN_PANE_LAYOUT_USUAL_FLAT ) || + ( usualSpLayout == R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT ); // TRect application_window = iAvkonAppUi->ApplicationRect(); @@ -541,7 +450,7 @@ CEikStatusPaneBase* statusPane = CEikStatusPaneBase::Current(); if (statusPane) { - TInt currentStatusPaneLayoutResId = AVKONENV->StatusPaneResIdForCurrentLayout(statusPane->CurrentLayoutResId()); + TInt currentStatusPaneLayoutResId = aknEnv->StatusPaneResIdForCurrentLayout(statusPane->CurrentLayoutResId()); staconPaneRight = ((currentStatusPaneLayoutResId == R_AVKON_STACON_PANE_LAYOUT_USUAL_SOFTKEYS_RIGHT) || (currentStatusPaneLayoutResId == R_AVKON_STACON_PANE_LAYOUT_EMPTY_SOFTKEYS_RIGHT) || @@ -566,41 +475,7 @@ iExtension->iBgContext->SetLayerRect( 0, main_pane.Rect() ); iExtension->iBgContext->SetLayerRect( 1, staconTop ); iExtension->iBgContext->SetLayerRect( 2, staconBottom ); - } - - if (Layout_Meta_Data::IsPenEnabled()) - { - TAknLayoutRect area_side_right_pane; - TInt variety = 0; - area_side_right_pane.LayoutRect(application_window, AknLayoutScalable_Avkon::area_side_right_pane(variety)); - - TAknLayoutRect sctrl_sk_top_pane; - sctrl_sk_top_pane.LayoutRect(area_side_right_pane.Rect(), AknLayoutScalable_Avkon::sctrl_sk_top_pane(0)); - - TAknLayoutRect sctrl_sk_bottom_pane; - sctrl_sk_bottom_pane.LayoutRect(area_side_right_pane.Rect(), AknLayoutScalable_Avkon::sctrl_sk_bottom_pane(0)); - - TAknLayoutRect grid_sctrl_middle_pane; - grid_sctrl_middle_pane.LayoutRect(area_side_right_pane.Rect(), AknLayoutScalable_Avkon::grid_sctrl_middle_pane(0)); - - TAknLayoutRect cell_sctrl_middle_pane1; - cell_sctrl_middle_pane1.LayoutRect(grid_sctrl_middle_pane.Rect(), AknLayoutScalable_Avkon::cell_sctrl_middle_pane(0,0,0)); - TAknLayoutRect cell_sctrl_middle_pane2; - cell_sctrl_middle_pane2.LayoutRect(grid_sctrl_middle_pane.Rect(), AknLayoutScalable_Avkon::cell_sctrl_middle_pane(0,0,1)); - TAknLayoutRect cell_sctrl_middle_pane3; - cell_sctrl_middle_pane3.LayoutRect(grid_sctrl_middle_pane.Rect(), AknLayoutScalable_Avkon::cell_sctrl_middle_pane(0,0,2)); - - - - iExtension->iBgContext->SetLayerImage( ELayerFlatCbaBackground, KAknsIIDQsnBgScreen ); - - - iExtension->iBgContext->SetLayerRect( ELayerFlatCbaBackground, application_window ); - } - - - - + } } else { @@ -742,19 +617,43 @@ return(self); } + +EXPORT_C CAknLocalScreenClearer* CAknLocalScreenClearer::NewLC(TBool aBlankAppStatusPane, TBool aTransparent) + { + CAknLocalScreenClearer* self=new(ELeave) CAknLocalScreenClearer; + CleanupStack::PushL(self); + self->CreateExtensionL(); + self->SetTransparent(aTransparent); + CEikonEnv& eikEnv = *static_cast(self->ControlEnv()); + self->ConstructL(eikEnv.RootWin(), 0, aBlankAppStatusPane); + return(self); + } + + EXPORT_C CAknLocalScreenClearer* CAknLocalScreenClearer::NewL(TBool aBlankAppStatusPane) { CAknLocalScreenClearer* self = CAknLocalScreenClearer::NewLC(aBlankAppStatusPane); CleanupStack::Pop(self); return(self); } - + + +EXPORT_C CAknLocalScreenClearer* CAknLocalScreenClearer::NewL(TBool aBlankAppStatusPane, TBool aTransparent) + { + CAknLocalScreenClearer* self = CAknLocalScreenClearer::NewLC(aBlankAppStatusPane, aTransparent); + CleanupStack::Pop(self); + return(self); + } + + EXPORT_C void CAknLocalScreenClearer::HandleResourceChange(TInt aType) { if (aType == KEikDynamicLayoutVariantSwitch) { - SetShapeL(); - SetSkinShapeL(); + TRAP_IGNORE( + SetShapeL(); + SetSkinShapeL(); + ); DrawDeferred(); } }