--- 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<CScreensaverEngine*>( 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.