diff -r 25957ccd51ab -r b3594157d381 src/screensaverengine.cpp --- a/src/screensaverengine.cpp Fri Mar 12 15:42:50 2010 +0200 +++ b/src/screensaverengine.cpp Mon Mar 15 12:40:37 2010 +0200 @@ -75,6 +75,7 @@ DisableSharedDataAndMonitor(); delete iIndicatorArray; KillTimer( iPreviewTimer ); + KillTimer( iExpiryTimer ); iAknUiServer.Close(); } @@ -153,6 +154,8 @@ // Report whether started from Idle BEFORE bringing to foreground iSharedDataI->SetSSStartedFromIdleStatus(); + + iSharedDataI->SetSSForcedLightsOn(1); ScreensaverUtility::BringToForeground(); @@ -194,6 +197,8 @@ iScreenSaverIsOn = EFalse ; + KillTimer( iExpiryTimer ); + View()->HideDisplayObject(); } @@ -260,6 +265,8 @@ UpdateIndicatorAttributes(); + SetExpiryTimerTimeout( KDefaultScreenSaverTimeout ); + View()->ShowDisplayObject(); iSharedDataI->SetScreensaverStatus( ETrue ); @@ -459,6 +466,27 @@ // ----------------------------------------------------------------------------- +// Start screensaver expiry timer. When the timer expires the screensaver will +// be stopped and hided. +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::SetExpiryTimerTimeout( TInt aTimeout ) + { + SCRLOGGER_WRITEF( _L( "SCR:CScreensaverEngine::SetExpiryTimerTimeout(%d) start" ), aTimeout ); + KillTimer( iExpiryTimer ); + + if ( 0 < aTimeout ) + { + TRAP_IGNORE( + iExpiryTimer = CPeriodic::NewL( CActive::EPriorityStandard ); + iExpiryTimer->Start( aTimeout , aTimeout , + TCallBack( HandleExpiryTimerExpiry, this ) ); + ) + } + } + + +// ----------------------------------------------------------------------------- // CScreensaverEngine::CScreensaverEngine // ----------------------------------------------------------------------------- // @@ -685,10 +713,12 @@ SCRLOGGER_WRITE("HandleInactiveEventL(), starting screensaver"); CScreensaverEngine* _this= STATIC_CAST(CScreensaverEngine*, aPtr); -/* + // Double-start is OK, it will be checked in StartScreenSaver() + // This will be trigged by keylock activation after keyguard + // timeout, or if keylock is disabled _this->StartScreenSaver( ); -*/ + return KErrNone; } @@ -712,6 +742,8 @@ SCRLOGGER_WRITE("HandleInactiveEventShortL()"); // Start, if keys are locked and short timeout in use CScreensaverEngine* _this= STATIC_CAST(CScreensaverEngine*, aPtr); + // Restore inactivity timeout if it was reset at keylock activation + _this->iActivityManagerScreensaverShort->SetInactivityTimeout(KTimeoutShort); if ( _this->iSharedDataI->IsKeyguardOn() ) { @@ -739,6 +771,24 @@ return KErrNone; } +// --------------------------------------------------------------------------- +// CScreensaverEngine::HandleKeyguardStateChanged +// --------------------------------------------------------------------------- +// +void CScreensaverEngine::HandleKeyguardStateChanged( TBool aEnabled ) + { + if ( aEnabled ) + { + // Keyguard switch generates an activity event still, let the inactivity + // handler start the screensaver after one second + iActivityManagerScreensaverShort->SetInactivityTimeout(1); + } + else + { + StopScreenSaver(); + } + } + // ----------------------------------------------------------------------------- // CScreensaverEngine::View // ----------------------------------------------------------------------------- @@ -765,4 +815,26 @@ { return iSharedDataI->IsScreenSaverAllowed(); } + + +// ----------------------------------------------------------------------------- +// Handles expire timer timeout +// ----------------------------------------------------------------------------- +// +TInt CScreensaverEngine::HandleExpiryTimerExpiry( TAny* aPtr ) + { + SCRLOGGER_WRITEF( _L( "SCR:CScreensaverEngine::HandleExpiryTimerExpiry(%d) start" ), aPtr ); + CScreensaverEngine *control = STATIC_CAST( CScreensaverEngine*, aPtr ); + + if ( control ) + { + control->KillTimer( control->iExpiryTimer ); + control->StopScreenSaver(); + control->iSharedDataI->SetSSForcedLightsOn( 0 ); + } + + return KErrNone; + } + + // End of file.