# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1279208394 -10800 # Node ID d1f14bc6a2ab5e3470968acf64e153ecd14f482b # Parent 98bf2adac59c6f062c6910036c0f92fbd8bb9aff Revision: 201025 Kit: 2010127 diff -r 98bf2adac59c -r d1f14bc6a2ab inc/screensaverengine.h --- a/inc/screensaverengine.h Mon Jun 21 15:41:25 2010 +0300 +++ b/inc/screensaverengine.h Thu Jul 15 18:39:54 2010 +0300 @@ -250,6 +250,11 @@ */ static TInt HandleExpiryTimerExpiry( TAny* aPtr ); + /** + * Callback to do the screensaver starting. + */ + static TInt StartSaverCb( TAny* aPtr ); + private: /** @@ -331,7 +336,12 @@ * Set if the pause timer was started when preview was stopped */ TBool iPauseTimerStartedAfterPreview; - + + /** + * Asynchronous callback to start screensaver. + */ + CAsyncCallBack iAsyncCb; + }; diff -r 98bf2adac59c -r d1f14bc6a2ab scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowPlugin.cpp --- a/scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowPlugin.cpp Mon Jun 21 15:41:25 2010 +0300 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowPlugin.cpp Thu Jul 15 18:39:54 2010 +0300 @@ -370,6 +370,7 @@ SSPLOGGER_WRITE("No slides selected - launching settings"); TRAP(ret, ConfigureL(aParam)); // Check if at least one file is selected + ReadSettings();// update the key value of KThemesScreenSaverSlideSetType TRAP(ret, LoadSlidesL()); if ( ret == KErrNone && iModel->NumberOfSlides() == 0) { diff -r 98bf2adac59c -r d1f14bc6a2ab src/screensaverengine.cpp --- a/src/screensaverengine.cpp Mon Jun 21 15:41:25 2010 +0300 +++ b/src/screensaverengine.cpp Thu Jul 15 18:39:54 2010 +0300 @@ -70,6 +70,7 @@ // CScreensaverEngine::~CScreensaverEngine( ) { + iAsyncCb.Cancel(); StopActivityMonitoring( iActivityManagerScreensaver ); DisableSharedDataAndMonitor(); delete iIndicatorArray; @@ -143,27 +144,10 @@ { if ( !iScreenSaverIsOn ) { - // connect in StartScreenSaver, intercept and capture application - // key event. It makes sure this event will not be received - // by other applictions when screensaver is activated. - iAknUiServer.ConnectAndSendAppsKeySuppress(ETrue); - iScreenSaverIsOn = ETrue; - - // Report whether started from Idle BEFORE bringing to foreground - iSharedDataI->SetSSStartedFromIdleStatus(); - - if ( !View()->IsContentlessScreensaver() ) - { - ScreensaverUtility::BringToForeground(); - } - - SCRLOGGER_WRITE("Model: SS is displaying (BringToForeground)"); - - // Compress heap while displaying. No longer possible to - // compress all heaps (User::CompressAllHeaps() is a no-op) - User::Heap().Compress(); - - DisplayObject(); + // Activating is done asynchronously to prevent screensaver from + // flashing quickly in some cases. This flashing happens e.g. when + // a call is missed and a note is showed about it. + iAsyncCb.CallBack(); } else { @@ -184,6 +168,7 @@ void CScreensaverEngine::StopScreenSaver() { SCRLOGGER_WRITE("Stopping Screensaver"); + iAsyncCb.Cancel(); if ( iSharedDataI->IsKeyguardOn() || iScreenSaverIsPreviewing ) { @@ -496,9 +481,10 @@ // CScreensaverEngine::CScreensaverEngine // ----------------------------------------------------------------------------- // -CScreensaverEngine::CScreensaverEngine() +CScreensaverEngine::CScreensaverEngine() : iAsyncCb( CActive::EPriorityLow ) { - + TCallBack callbackFunc( StartSaverCb, this ); + iAsyncCb.Set( callbackFunc ); } // ----------------------------------------------------------------------------- @@ -872,4 +858,36 @@ } +// --------------------------------------------------------------------------- +// Callback to do the screensaver starting. +// --------------------------------------------------------------------------- +// +TInt CScreensaverEngine::StartSaverCb( TAny* aPtr ) + { + CScreensaverEngine* self = static_cast( aPtr ); + // connect in StartScreenSaver, intercept and capture application + // key event. It makes sure this event will not be received + // by other applictions when screensaver is activated. + self->iAknUiServer.ConnectAndSendAppsKeySuppress(ETrue); + self->iScreenSaverIsOn = ETrue; + + // Report whether started from Idle BEFORE bringing to foreground + self->iSharedDataI->SetSSStartedFromIdleStatus(); + + if ( !self->View()->IsContentlessScreensaver() ) + { + ScreensaverUtility::BringToForeground(); + } + + SCRLOGGER_WRITE("Model: SS is displaying (BringToForeground)"); + + // Compress heap while displaying. No longer possible to + // compress all heaps (User::CompressAllHeaps() is a no-op) + User::Heap().Compress(); + + self->DisplayObject(); + return KErrNone; + } + + // End of file.