src/screensaverengine.cpp
branchRCL_3
changeset 23 d1f14bc6a2ab
parent 21 98bf2adac59c
child 24 724d4ec22f0d
--- 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.