diff -r f966699dea19 -r ff572dfe6d86 taskswitcher/contextengine/tsfswpreviewprovider/wsplugin/src/previewprovidercrp.cpp --- a/taskswitcher/contextengine/tsfswpreviewprovider/wsplugin/src/previewprovidercrp.cpp Fri Feb 19 22:42:37 2010 +0200 +++ b/taskswitcher/contextengine/tsfswpreviewprovider/wsplugin/src/previewprovidercrp.cpp Fri Mar 12 15:41:49 2010 +0200 @@ -33,6 +33,7 @@ // CONSTANTS const TInt KImpId( 0x20016BEC ); +const TInt KMinTimeForOrientationSwitch = 1; // 1 second // -------------------------------------------------------------------------- // CPreviewProviderCRP::CreateL @@ -145,7 +146,9 @@ TSLOG_IN(); BaseConstructL( aEnv, aId, aOwner ); - aEnv.RegisterEventHandler( this, this, TWservCrEvent::EWindowGroupChanged ); + aEnv.RegisterEventHandler( this, this, TWservCrEvent::EWindowGroupChanged | + TWservCrEvent::EDeviceOrientationChanged ); + iScreenChangedTime = 0; TSLOG_OUT(); } @@ -165,11 +168,30 @@ if ( iWgIds.FindInOrder( iPrevId ) >= 0 || ( iPrevId == 0 && iPrevReg != 0 ) ) { - TRAP_IGNORE( ScreenshotL() ); + TTime currTime; + currTime.HomeTime(); + TTimeIntervalSeconds secondsFrom; + TInt err = currTime.SecondsFrom( iScreenChangedTime, secondsFrom ); + if ( err != KErrNone || secondsFrom.Int() > KMinTimeForOrientationSwitch ) + { + TRAP_IGNORE( ScreenshotL() ); + } + else + { + // Reset time to allow screenshot taking on next wg change + iScreenChangedTime = 0; + // Order screenshot rotation + BitmapRotationNeeded( iPrevId?iPrevId:iPrevReg, iClockwiseRot ); + } iPrevReg = 0; } iPrevId = wgId; } + else if ( aEvent.Type() == TWservCrEvent::EDeviceOrientationChanged ) + { + iScreenChangedTime.HomeTime(); + TRAP_IGNORE( ScreenshotL() ); + } TSLOG_OUT(); } @@ -217,6 +239,28 @@ TSLOG_OUT(); } + +// -------------------------------------------------------------------------- +// CPreviewProviderCRP::BitmapRotationNeeded +// -------------------------------------------------------------------------- +// +void CPreviewProviderCRP::BitmapRotationNeeded( TInt aWgId, TBool aClockwise ) + { + TSLOG_CONTEXT( BitmapRotationNeeded, TSLOG_LOCAL ); + TSLOG_IN(); + + const TInt msg[] = { + aClockwise ? NPreviewMsg::EBitmapRotationNeeded90 : NPreviewMsg::EBitmapRotationNeeded270, + aWgId, + 0 + }; + TPckgC buf(msg); + SendMessage(buf); + + TSLOG_OUT(); + } + + // -------------------------------------------------------------------------- // CPreviewProviderCRP::Register // -------------------------------------------------------------------------- @@ -300,6 +344,10 @@ { iScreenshotSize = sz; } + + // Mark direction for possible rotation + iClockwiseRot = iScreenshotSize.iWidth > iScreenshotSize.iHeight; + // Use the the same DisplayMode as for the source image // so override the display mode, ignoring any requests. iScreenshotMode = screenConfig->DisplayMode();