Keep the handle of SceneHolder before processing events in Core 88/211888/2
authorRichard Huang <r.huang@samsung.com>
Fri, 9 Aug 2019 15:04:55 +0000 (16:04 +0100)
committerRichard Huang <r.huang@samsung.com>
Fri, 9 Aug 2019 16:49:33 +0000 (17:49 +0100)
Change-Id: I042e3c27e5de8fc82f75170e34ebfbea0a79b933

dali/integration-api/scene-holder-impl.cpp

index d8d456fcbaeccb022a507dfa9b63aae6769a2a7e..3a7bc5aa74164e133cc1ecce5e918006c1c7372a 100644 (file)
@@ -287,6 +287,10 @@ void SceneHolder::FeedTouchPoint( Dali::Integration::Point& point, int timeStamp
   {
     DALI_LOG_INFO( gTouchEventLogFilter, Debug::General, "%d: Device %d: Button state %d (%.2f, %.2f)\n", timeStamp, point.GetDeviceId(), point.GetState(), point.GetScreenPosition().x, point.GetScreenPosition().y );
 
+    // Signals can be emitted while processing core events, and the scene holder could be deleted in the signal callback.
+    // Keep the handle alive until the core events are processed.
+    Dali::BaseHandle sceneHolder( this );
+
     // First the touch and/or hover event & related gesture events are queued
     if( type == Integration::TouchEventCombiner::DispatchTouch || type == Integration::TouchEventCombiner::DispatchBoth )
     {
@@ -305,6 +309,10 @@ void SceneHolder::FeedTouchPoint( Dali::Integration::Point& point, int timeStamp
 
 void SceneHolder::FeedWheelEvent( Dali::Integration::WheelEvent& wheelEvent )
 {
+  // Signals can be emitted while processing core events, and the scene holder could be deleted in the signal callback.
+  // Keep the handle alive until the core events are processed.
+  Dali::BaseHandle sceneHolder( this );
+
   mScene.QueueEvent( wheelEvent );
   mAdaptor->ProcessCoreEvents();
 }
@@ -320,6 +328,10 @@ void SceneHolder::FeedKeyEvent( Dali::Integration::KeyEvent& keyEvent )
     }
   }
 
+  // Signals can be emitted while processing core events, and the scene holder could be deleted in the signal callback.
+  // Keep the handle alive until the core events are processed.
+  Dali::BaseHandle sceneHolder( this );
+
   // Create send KeyEvent to Core.
   mScene.QueueEvent( keyEvent );
   mAdaptor->ProcessCoreEvents();