Fix another systemCachePath check
[platform/core/uifw/dali-adaptor.git] / dali / internal / adaptor / common / adaptor-impl.cpp
index 05b60f9..2c297e0 100755 (executable)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include <dali/integration-api/context-notifier.h>
 #include <dali/integration-api/profiling.h>
 #include <dali/integration-api/input-options.h>
+#include <dali/integration-api/events/key-event-integ.h>
 #include <dali/integration-api/events/touch-event-integ.h>
+#include <dali/integration-api/events/wheel-event-integ.h>
+#include <dali/integration-api/processor-interface.h>
+
+#include <fstream>
 
 // INTERNAL INCLUDES
 #include <dali/public-api/dali-adaptor-common.h>
 #include <dali/internal/system/common/callback-manager.h>
 #include <dali/internal/accessibility/common/tts-player-impl.h>
 #include <dali/internal/accessibility/common/accessibility-adaptor-impl.h>
-#include <dali/internal/input/common/gesture-manager.h>
 #include <dali/internal/window-system/common/event-handler.h>
 #include <dali/internal/graphics/gles/gl-proxy-implementation.h>
 #include <dali/internal/graphics/gles/gl-implementation.h>
 #include <dali/internal/graphics/gles/egl-sync-implementation.h>
 #include <dali/internal/graphics/common/egl-image-extensions.h>
 #include <dali/internal/clipboard/common/clipboard-impl.h>
-#include <dali/internal/graphics/common/vsync-monitor.h>
 #include <dali/internal/system/common/object-profiler.h>
 #include <dali/internal/window-system/common/display-connection.h>
 #include <dali/internal/window-system/common/window-impl.h>
 #include <dali/internal/imaging/common/image-loader-plugin-proxy.h>
 #include <dali/internal/imaging/common/image-loader.h>
 
+#include <dali/devel-api/adaptor-framework/file-stream.h>
 
 using Dali::TextAbstraction::FontClient;
 
+extern std::string GetSystemCachePath();
+
 namespace Dali
 {
 
@@ -81,11 +87,10 @@ namespace
 thread_local Adaptor* gThreadLocalAdaptor = NULL; // raw thread specific pointer to allow Adaptor::Get
 } // unnamed namespace
 
-
-Dali::Adaptor* Adaptor::New( Any nativeWindow, RenderSurface *surface, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions )
+Dali::Adaptor* Adaptor::New( Dali::Integration::SceneHolder window, Dali::RenderSurfaceInterface *surface, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions )
 {
   Dali::Adaptor* adaptor = new Dali::Adaptor;
-  Adaptor* impl = new Adaptor( nativeWindow, *adaptor, surface, environmentOptions );
+  Adaptor* impl = new Adaptor( window, *adaptor, surface, environmentOptions );
   adaptor->mImpl = impl;
 
   Dali::Internal::Adaptor::AdaptorBuilder* mAdaptorBuilder = new AdaptorBuilder();
@@ -97,20 +102,18 @@ Dali::Adaptor* Adaptor::New( Any nativeWindow, RenderSurface *surface, Dali::Con
   return adaptor;
 }
 
-Dali::Adaptor* Adaptor::New( Dali::Window window, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions )
+Dali::Adaptor* Adaptor::New( Dali::Integration::SceneHolder window, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions )
 {
-  Any winId = window.GetNativeHandle();
-
-  Window& windowImpl = Dali::GetImplementation( window );
-  Dali::Adaptor* adaptor = New( winId, windowImpl.GetSurface(), configuration, environmentOptions );
+  Internal::Adaptor::SceneHolder& windowImpl = Dali::GetImplementation( window );
+  Dali::Adaptor* adaptor = New( window, windowImpl.GetSurface(), configuration, environmentOptions );
   windowImpl.SetAdaptor( *adaptor );
   return adaptor;
 }
 
-Dali::Adaptor* Adaptor::New( GraphicsFactory& graphicsFactory, Any nativeWindow, RenderSurface *surface, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions )
+Dali::Adaptor* Adaptor::New( GraphicsFactory& graphicsFactory, Dali::Integration::SceneHolder window, Dali::RenderSurfaceInterface *surface, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions )
 {
   Dali::Adaptor* adaptor = new Dali::Adaptor; // Public adaptor
-  Adaptor* impl = new Adaptor( nativeWindow, *adaptor, surface, environmentOptions ); // Impl adaptor
+  Adaptor* impl = new Adaptor( window, *adaptor, surface, environmentOptions ); // Impl adaptor
   adaptor->mImpl = impl;
 
   impl->Initialize( graphicsFactory, configuration );
@@ -118,12 +121,10 @@ Dali::Adaptor* Adaptor::New( GraphicsFactory& graphicsFactory, Any nativeWindow,
   return adaptor;
 } // Called second
 
-Dali::Adaptor* Adaptor::New( GraphicsFactory& graphicsFactory, Dali::Window window, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions )
+Dali::Adaptor* Adaptor::New( GraphicsFactory& graphicsFactory, Dali::Integration::SceneHolder window, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions )
 {
-  Any winId = window.GetNativeHandle();
-
-  Window& windowImpl = Dali::GetImplementation( window );
-  Dali::Adaptor* adaptor = New( graphicsFactory, winId, windowImpl.GetSurface(), configuration, environmentOptions );
+  Internal::Adaptor::SceneHolder& windowImpl = Dali::GetImplementation( window );
+  Dali::Adaptor* adaptor = New( graphicsFactory, window, windowImpl.GetSurface(), configuration, environmentOptions );
   windowImpl.SetAdaptor( *adaptor );
   return adaptor;
 } // Called first
@@ -159,32 +160,38 @@ void Adaptor::Initialize( GraphicsFactory& graphicsFactory, Dali::Configuration:
 
   mCallbackManager = CallbackManager::New();
 
-  WindowPane defaultWindow = mWindowFrame.front();
-
-  DALI_ASSERT_DEBUG( defaultWindow.surface && "Surface not initialized" );
+  Dali::Internal::Adaptor::SceneHolder* defaultWindow = mWindows.front();
 
-  PositionSize size = defaultWindow.surface->GetPositionSize();
-
-  mGestureManager = new GestureManager(*this, Vector2(size.width, size.height), mCallbackManager, *mEnvironmentOptions);
+  DALI_ASSERT_DEBUG( defaultWindow->GetSurface() && "Surface not initialized" );
 
   mGraphics = &( graphicsFactory.Create() );
   mGraphics->Initialize( mEnvironmentOptions );
 
   auto eglGraphics = static_cast<EglGraphics *>( mGraphics ); // This interface is temporary until Core has been updated to match
 
+  // This will only be created once
+  eglGraphics->Create();
+
   GlImplementation& mGLES = eglGraphics->GetGlesInterface();
   EglSyncImplementation& eglSyncImpl = eglGraphics->GetSyncImplementation();
+  EglContextHelperImplementation& eglContextHelperImpl = eglGraphics->GetContextHelperImplementation();
 
   mCore = Integration::Core::New( *this,
                                   *mPlatformAbstraction,
                                   mGLES,
                                   eglSyncImpl,
-                                  *mGestureManager,
+                                  eglContextHelperImpl,
                                   dataRetentionPolicy ,
                                   ( 0u != mEnvironmentOptions->GetRenderToFboInterval() ) ? Integration::RenderToFrameBuffer::TRUE : Integration::RenderToFrameBuffer::FALSE,
                                   mGraphics->GetDepthBufferRequired(),
                                   mGraphics->GetStencilBufferRequired() );
 
+  defaultWindow->SetAdaptor( Get() );
+
+  Dali::Integration::SceneHolder defaultSceneHolder( defaultWindow );
+
+  mWindowCreatedSignal.Emit( defaultSceneHolder );
+
   const unsigned int timeInterval = mEnvironmentOptions->GetObjectProfilerInterval();
   if( 0u < timeInterval )
   {
@@ -193,9 +200,7 @@ void Adaptor::Initialize( GraphicsFactory& graphicsFactory, Dali::Configuration:
 
   mNotificationTrigger = mTriggerEventFactory.CreateTriggerEvent( MakeCallback( this, &Adaptor::ProcessCoreEvents ), TriggerEventInterface::KEEP_ALIVE_AFTER_TRIGGER);
 
-  mVSyncMonitor = new VSyncMonitor;
-
-  mDisplayConnection = Dali::DisplayConnection::New( *mGraphics, defaultWindow.surface->GetSurfaceType() );
+  mDisplayConnection = Dali::DisplayConnection::New( *mGraphics, defaultWindow->GetSurface()->GetSurfaceType() );
 
   mThreadController = new ThreadController( *this, *mEnvironmentOptions );
 
@@ -264,6 +269,18 @@ void Adaptor::Initialize( GraphicsFactory& graphicsFactory, Dali::Configuration:
   {
     Integration::SetPanGestureMultitapSmoothingRange( mEnvironmentOptions->GetPanGestureMultitapSmoothingRange() );
   }
+  if( mEnvironmentOptions->GetMinimumPanDistance() >= 0 )
+  {
+    Integration::SetPanGestureMinimumDistance( mEnvironmentOptions->GetMinimumPanDistance() );
+  }
+  if( mEnvironmentOptions->GetMinimumPanEvents() >= 0 )
+  {
+    Integration::SetPanGestureMinimumPanEvents( mEnvironmentOptions->GetMinimumPanEvents() );
+  }
+  if( mEnvironmentOptions->GetMinimumPinchDistance() >= 0 )
+  {
+    Integration::SetPinchGestureMinimumDistance( mEnvironmentOptions->GetMinimumPinchDistance() );
+  }
 
   // Set max texture size
   if( mEnvironmentOptions->GetMaxTextureSize() > 0 )
@@ -271,7 +288,39 @@ void Adaptor::Initialize( GraphicsFactory& graphicsFactory, Dali::Configuration:
     Dali::TizenPlatform::ImageLoader::SetMaxTextureSize( mEnvironmentOptions->GetMaxTextureSize() );
   }
 
-  SetupSystemInformation();
+  std::string systemCachePath = GetSystemCachePath();
+  if ( ! systemCachePath.empty() )
+  {
+    Dali::FileStream fileStream( systemCachePath + "gpu-environment.conf", Dali::FileStream::READ | Dali::FileStream::TEXT );
+    std::fstream& stream = dynamic_cast<std::fstream&>( fileStream.GetStream() );
+    if( stream.is_open() )
+    {
+      std::string line;
+      while( std::getline( stream, line ) )
+      {
+        line.erase( line.find_last_not_of( " \t\r\n" ) + 1 );
+        line.erase( 0, line.find_first_not_of( " \t\r\n" ) );
+        if( '#' == *( line.cbegin() ) || line == "" )
+        {
+          continue;
+        }
+
+        std::istringstream stream( line );
+        std::string environmentVariableName, environmentVariableValue;
+        std::getline(stream, environmentVariableName, ' ');
+        if( environmentVariableName == "DALI_ENV_MAX_TEXTURE_SIZE" && mEnvironmentOptions->GetMaxTextureSize() == 0 )
+        {
+          std::getline(stream, environmentVariableValue);
+          setenv( environmentVariableName.c_str() , environmentVariableValue.c_str(), 1 );
+          Dali::TizenPlatform::ImageLoader::SetMaxTextureSize( std::atoi( environmentVariableValue.c_str() ) );
+        }
+      }
+    }
+    else
+    {
+      DALI_LOG_ERROR( "Fail to open file : %s\n", ( systemCachePath + "gpu-environment.conf" ).c_str() );
+    }
+  }
 }
 
 Adaptor::~Adaptor()
@@ -287,14 +336,14 @@ Adaptor::~Adaptor()
     (*iter)->OnDestroy();
   }
 
+  // Clear out all the handles to Windows
+  mWindows.clear();
+
   delete mThreadController; // this will shutdown render thread, which will call Core::ContextDestroyed before exit
-  delete mVSyncMonitor;
-  delete mEventHandler;
   delete mObjectProfiler;
 
   delete mCore;
 
-  delete mGestureManager;
   delete mDisplayConnection;
   delete mPlatformAbstraction;
   delete mCallbackManager;
@@ -320,40 +369,52 @@ void Adaptor::Start()
     return;
   }
 
-  // Start the callback manager
-  mCallbackManager->Start();
+  mCore->Initialize();
 
-  WindowPane defaultWindow = mWindowFrame.front();
+  SetupSystemInformation();
 
-  // Create event handler
-  mEventHandler = new EventHandler( defaultWindow.surface, *this, *mGestureManager, *this, mDragAndDropDetector );
+  // Start the callback manager
+  mCallbackManager->Start();
 
-  if( mDeferredRotationObserver != NULL )
-  {
-    mEventHandler->SetRotationObserver(mDeferredRotationObserver);
-    mDeferredRotationObserver = NULL;
-  }
+  Dali::Internal::Adaptor::SceneHolder* defaultWindow = mWindows.front();
 
   unsigned int dpiHor, dpiVer;
   dpiHor = dpiVer = 0;
 
-  defaultWindow.surface->GetDpi( dpiHor, dpiVer );
-
-  // tell core about the DPI value
-  mCore->SetDpi(dpiHor, dpiVer);
+  defaultWindow->GetSurface()->GetDpi( dpiHor, dpiVer );
 
   // set the DPI value for font rendering
   FontClient fontClient = FontClient::Get();
   fontClient.SetDpi( dpiHor, dpiVer );
 
-  // Tell the core the size of the surface just before we start the render-thread
-  PositionSize size = defaultWindow.surface->GetPositionSize();
-
-  mCore->SurfaceResized( size.width, size.height );
-
   // Initialize the thread controller
   mThreadController->Initialize();
 
+  if( !Dali::TizenPlatform::ImageLoader::MaxTextureSizeUpdated() )
+  {
+    auto eglGraphics = static_cast<EglGraphics *>( mGraphics );
+    GlImplementation& mGLES = eglGraphics->GetGlesInterface();
+    Dali::TizenPlatform::ImageLoader::SetMaxTextureSize( mGLES.GetMaxTextureSize() );
+
+    std::string systemCachePath = GetSystemCachePath();
+    if( ! systemCachePath.empty() )
+    {
+      const int dir_err = system( std::string( "mkdir " + systemCachePath ).c_str() );
+      if (-1 == dir_err)
+      {
+          printf("Error creating directory!n");
+          exit(1);
+      }
+
+      Dali::FileStream fileStream( systemCachePath + "gpu-environment.conf", Dali::FileStream::WRITE | Dali::FileStream::TEXT );
+      std::fstream& configFile = dynamic_cast<std::fstream&>( fileStream.GetStream() );
+      if( configFile.is_open() )
+      {
+        configFile << "DALI_ENV_MAX_TEXTURE_SIZE " << mGLES.GetMaxTextureSize() << std::endl;
+      }
+    }
+  }
+
   ProcessCoreEvents(); // Ensure any startup messages are processed.
 
   // Initialize the image loader plugin
@@ -377,10 +438,10 @@ void Adaptor::Pause()
       (*iter)->OnPause();
     }
 
-    // Reset the event handler when adaptor paused
-    if( mEventHandler )
+    // Pause all windows event handlers when adaptor paused
+    for( auto window : mWindows )
     {
-      mEventHandler->Pause();
+      window->Pause();
     }
 
     mThreadController->Pause();
@@ -388,6 +449,12 @@ void Adaptor::Pause()
 
     // Ensure any messages queued during pause callbacks are processed by doing another update.
     RequestUpdateOnce();
+
+    DALI_LOG_RELEASE_INFO( "Adaptor::Pause: Paused\n" );
+  }
+  else
+  {
+    DALI_LOG_RELEASE_INFO( "Adaptor::Pause: Not paused [%d]\n", mState );
   }
 }
 
@@ -399,10 +466,10 @@ void Adaptor::Resume()
   {
     mState = RUNNING;
 
-    // Reset the event handler when adaptor resumed
-    if( mEventHandler )
+    // Reset the event handlers when adaptor resumed
+    for( auto window : mWindows )
     {
-      mEventHandler->Resume();
+      window->Resume();
     }
 
     // Inform observers that we have resumed.
@@ -416,6 +483,12 @@ void Adaptor::Resume()
 
     // Do at end to ensure our first update/render after resumption includes the processed messages as well
     mThreadController->Resume();
+
+    DALI_LOG_RELEASE_INFO( "Adaptor::Resume: Resumed\n");
+  }
+  else
+  {
+    DALI_LOG_RELEASE_INFO( "Adaptor::Resume: Not resumed [%d]\n", mState );
   }
 }
 
@@ -432,13 +505,10 @@ void Adaptor::Stop()
 
     mThreadController->Stop();
 
-    // Clear out all the handles to Windows
-    mWindowFrame.clear();
-
     // Delete the TTS player
-    for(int i =0; i < Dali::TtsPlayer::MODE_NUM; i++)
+    for( int i =0; i < Dali::TtsPlayer::MODE_NUM; i++ )
     {
-      if(mTtsPlayers[i])
+      if( mTtsPlayers[i] )
       {
         mTtsPlayers[i].Reset();
       }
@@ -447,15 +517,14 @@ void Adaptor::Stop()
     // Destroy the image loader plugin
     Internal::Adaptor::ImageLoaderPluginProxy::Destroy();
 
-    delete mEventHandler;
-    mEventHandler = NULL;
-
     delete mNotificationTrigger;
     mNotificationTrigger = NULL;
 
     mCallbackManager->Stop();
 
     mState = STOPPED;
+
+    DALI_LOG_RELEASE_INFO( "Adaptor::Stop\n" );
   }
 }
 
@@ -474,63 +543,67 @@ void Adaptor::ContextRegained()
 
 void Adaptor::FeedTouchPoint( TouchPoint& point, int timeStamp )
 {
-  mEventHandler->FeedTouchPoint( point, timeStamp );
+  Integration::Point convertedPoint( point );
+  mWindows.front()->FeedTouchPoint( convertedPoint, timeStamp );
 }
 
 void Adaptor::FeedWheelEvent( WheelEvent& wheelEvent )
 {
-  mEventHandler->FeedWheelEvent( wheelEvent );
+  Integration::WheelEvent event( static_cast< Integration::WheelEvent::Type >(wheelEvent.type), wheelEvent.direction, wheelEvent.modifiers, wheelEvent.point, wheelEvent.z, wheelEvent.timeStamp );
+  mWindows.front()->FeedWheelEvent( event );
 }
 
 void Adaptor::FeedKeyEvent( KeyEvent& keyEvent )
 {
-  mEventHandler->FeedKeyEvent( keyEvent );
+  Integration::KeyEvent convertedEvent( keyEvent );
+  mWindows.front()->FeedKeyEvent( convertedEvent );
 }
 
-void Adaptor::ReplaceSurface( Any nativeWindow, RenderSurface& newSurface )
+void Adaptor::ReplaceSurface( Dali::Integration::SceneHolder window, Dali::RenderSurfaceInterface& newSurface )
 {
-  PositionSize positionSize = newSurface.GetPositionSize();
-
-  // Let the core know the surface size has changed
-  mCore->SurfaceResized( positionSize.width, positionSize.height );
-
-  mResizedSignal.Emit( mAdaptor );
+  Internal::Adaptor::SceneHolder* windowImpl = &Dali::GetImplementation( window );
+  for( auto windowPtr : mWindows )
+  {
+    if( windowPtr == windowImpl ) // the window is not deleted
+    {
+      mResizedSignal.Emit( mAdaptor );
 
-  WindowPane newDefaultWindow;
-  newDefaultWindow.nativeWindow = nativeWindow;
-  newDefaultWindow.surface = &newSurface;
+      windowImpl->SetSurface( &newSurface );
 
-  // Must delete the old Window first before replacing it with the new one
-  WindowPane oldDefaultWindow = mWindowFrame.front();
-  oldDefaultWindow.surface->DestroySurface();
+      // Flush the event queue to give the update-render thread chance
+      // to start processing messages for new camera setup etc as soon as possible
+      ProcessCoreEvents();
 
-  // Update WindowFrame
-  std::vector<WindowPane>::iterator iter = mWindowFrame.begin();
-  iter = mWindowFrame.insert( iter, newDefaultWindow );
+      // This method blocks until the render thread has completed the replace.
+      mThreadController->ReplaceSurface( &newSurface );
+      break;
+    }
+  }
+}
 
+void Adaptor::DeleteSurface( Dali::RenderSurfaceInterface& surface )
+{
   // Flush the event queue to give the update-render thread chance
   // to start processing messages for new camera setup etc as soon as possible
   ProcessCoreEvents();
 
-  // This method blocks until the render thread has completed the replace.
-  mThreadController->ReplaceSurface( newDefaultWindow.surface );
+  // This method blocks until the render thread has finished rendering the current surface.
+  mThreadController->DeleteSurface( &surface );
 }
 
-RenderSurface& Adaptor::GetSurface() const
+Dali::RenderSurfaceInterface& Adaptor::GetSurface() const
 {
-  WindowPane defaultWindow = mWindowFrame.front();
-  return *(defaultWindow.surface);
+  return *mWindows.front()->GetSurface();
 }
 
 void Adaptor::ReleaseSurfaceLock()
 {
-  WindowPane defaultWindow = mWindowFrame.front();
-  defaultWindow.surface->ReleaseLock();
+  mWindows.front()->GetSurface()->ReleaseLock();
 }
 
 Dali::TtsPlayer Adaptor::GetTtsPlayer(Dali::TtsPlayer::Mode mode)
 {
-  if(!mTtsPlayers[mode])
+  if( !mTtsPlayers[mode] )
   {
     // Create the TTS player when it needed, because it can reduce launching time.
     mTtsPlayers[mode] = TtsPlayer::New(mode);
@@ -562,31 +635,27 @@ void Adaptor::SetPreRenderCallback( CallbackBase* callback )
   mThreadController->SetPreRenderCallback( callback );
 }
 
-bool Adaptor::AddWindow( Dali::Window* childWindow, const std::string& childWindowName, const std::string& childWindowClassName, const bool& childWindowMode )
+bool Adaptor::AddWindow( Dali::Integration::SceneHolder childWindow, const std::string& childWindowName, const std::string& childWindowClassName, bool childWindowMode )
 {
-  // This is any Window that is not the main (default) one
-  WindowPane additionalWindow;
-  additionalWindow.instance = childWindow;
-  additionalWindow.window_name = childWindowName;
-  additionalWindow.class_name = childWindowClassName;
-  additionalWindow.window_mode = childWindowMode;
+  Internal::Adaptor::SceneHolder& windowImpl = Dali::GetImplementation( childWindow );
+  windowImpl.SetAdaptor( Get() );
 
-  // Add the new Window to the Frame - the order is not important
-  mWindowFrame.push_back( additionalWindow );
+  // Add the new Window to the container - the order is not important
+  mWindows.push_back( &windowImpl );
 
-  Window& windowImpl = Dali::GetImplementation( *childWindow );
-  windowImpl.SetAdaptor( Get() );
+  mWindowCreatedSignal.Emit( childWindow );
 
   return true;
 }
 
-bool Adaptor::RemoveWindow( Dali::Window* childWindow )
+bool Adaptor::RemoveWindow( Dali::Integration::SceneHolder* childWindow )
 {
-  for ( WindowFrames::iterator iter = mWindowFrame.begin(); iter != mWindowFrame.end(); ++iter )
+  Internal::Adaptor::SceneHolder& windowImpl = Dali::GetImplementation( *childWindow );
+  for ( WindowContainer::iterator iter = mWindows.begin(); iter != mWindows.end(); ++iter )
   {
-    if( iter->instance == childWindow )
+    if( *iter == &windowImpl )
     {
-      mWindowFrame.erase( iter );
+      mWindows.erase( iter );
       return true;
     }
   }
@@ -596,11 +665,25 @@ bool Adaptor::RemoveWindow( Dali::Window* childWindow )
 
 bool Adaptor::RemoveWindow( std::string childWindowName )
 {
-  for ( WindowFrames::iterator iter = mWindowFrame.begin(); iter != mWindowFrame.end(); ++iter )
+  for ( WindowContainer::iterator iter = mWindows.begin(); iter != mWindows.end(); ++iter )
   {
-    if( iter->window_name == childWindowName )
+    if( ( *iter )->GetName() == childWindowName )
     {
-      mWindowFrame.erase( iter );
+      mWindows.erase( iter );
+      return true;
+    }
+  }
+
+  return false;
+}
+
+bool Adaptor::RemoveWindow( Internal::Adaptor::SceneHolder* childWindow )
+{
+  for ( WindowContainer::iterator iter = mWindows.begin(); iter != mWindows.end(); ++iter )
+  {
+    if( ( *iter )->GetId() == childWindow->GetId() )
+    {
+      mWindows.erase( iter );
       return true;
     }
   }
@@ -634,11 +717,6 @@ void Adaptor::SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender )
   mThreadController->SetRenderRefreshRate( numberOfVSyncsPerRender );
 }
 
-void Adaptor::SetUseHardwareVSync( bool useHardware )
-{
-  mVSyncMonitor->SetUseHardwareVSync( useHardware );
-}
-
 Dali::DisplayConnection& Adaptor::GetDisplayConnectionInterface()
 {
   DALI_ASSERT_DEBUG( mDisplayConnection && "Display connection not created" );
@@ -671,22 +749,14 @@ SocketFactoryInterface& Adaptor::GetSocketFactoryInterface()
   return mSocketFactory;
 }
 
-RenderSurface* Adaptor::GetRenderSurfaceInterface()
+Dali::RenderSurfaceInterface* Adaptor::GetRenderSurfaceInterface()
 {
-  if( !mWindowFrame.empty())
-  {
-    WindowPane defaultWindow = mWindowFrame.front();
-    return defaultWindow.surface;
-  }
-  else
+  if( !mWindows.empty() )
   {
-    return nullptr;
+    return mWindows.front()->GetSurface();
   }
-}
 
-VSyncMonitorInterface* Adaptor::GetVSyncMonitorInterface()
-{
-  return mVSyncMonitor;
+  return nullptr;
 }
 
 TraceInterface& Adaptor::GetKernelTraceInterface()
@@ -710,49 +780,35 @@ Integration::PlatformAbstraction& Adaptor::GetPlatformAbstraction() const
   return *mPlatformAbstraction;
 }
 
-void Adaptor::SetDragAndDropDetector( DragAndDropDetectorPtr detector )
+void Adaptor::DestroyTtsPlayer(Dali::TtsPlayer::Mode mode)
 {
-  mDragAndDropDetector = detector;
-
-  if ( mEventHandler )
+  if( mTtsPlayers[mode] )
   {
-    mEventHandler->SetDragAndDropDetector( detector );
+    mTtsPlayers[mode].Reset();
   }
 }
 
-void Adaptor::SetRotationObserver( RotationObserver* observer )
+Any Adaptor::GetNativeWindowHandle()
 {
-  if( mEventHandler )
-  {
-    mEventHandler->SetRotationObserver( observer );
-  }
-  else if( mState == READY )
-  {
-    // Set once event handler exists
-    mDeferredRotationObserver = observer;
-  }
+  return mWindows.front()->GetNativeHandle();
 }
 
-void Adaptor::DestroyTtsPlayer(Dali::TtsPlayer::Mode mode)
+Any Adaptor::GetNativeWindowHandle( Dali::Actor actor )
 {
-  if(mTtsPlayers[mode])
-  {
-    mTtsPlayers[mode].Reset();
-  }
-}
+  Any nativeWindowHandle;
 
-void Adaptor::SetMinimumPinchDistance(float distance)
-{
-  if( mGestureManager )
+  Dali::Integration::Scene scene = Dali::Integration::Scene::Get( actor );
+
+  for( auto sceneHolder : mWindows )
   {
-    mGestureManager->SetMinimumPinchDistance(distance);
+    if ( scene == sceneHolder->GetScene() )
+    {
+      nativeWindowHandle = sceneHolder->GetNativeHandle();
+      break;
+    }
   }
-}
 
-Any Adaptor::GetNativeWindowHandle()
-{
-  WindowPane defaultWindow = mWindowFrame.front();
-  return defaultWindow.nativeWindow;
+  return nativeWindowHandle;
 }
 
 Any Adaptor::GetGraphicsDisplay()
@@ -861,7 +917,7 @@ void Adaptor::RequestProcessEventsOnIdle( bool forceProcess )
 
 void Adaptor::OnWindowShown()
 {
-  if ( PAUSED_WHILE_HIDDEN == mState )
+  if( PAUSED_WHILE_HIDDEN == mState )
   {
     // Adaptor can now be resumed
     mState = PAUSED;
@@ -871,16 +927,58 @@ void Adaptor::OnWindowShown()
     // Force a render task
     RequestUpdateOnce();
   }
+  else if( RUNNING == mState )
+  {
+    // Force a render task
+    RequestUpdateOnce();
+
+    DALI_LOG_RELEASE_INFO( "Adaptor::OnWindowShown: Update requested.\n" );
+  }
+  else
+  {
+    DALI_LOG_RELEASE_INFO( "Adaptor::OnWindowShown: Adaptor is not paused state.[%d]\n", mState );
+  }
 }
 
 void Adaptor::OnWindowHidden()
 {
-  if ( RUNNING == mState )
+  if( RUNNING == mState || READY == mState )
   {
-    Pause();
+    bool allWindowsHidden = true;
 
-    // Adaptor cannot be resumed until the window is shown
-    mState = PAUSED_WHILE_HIDDEN;
+    for( auto window : mWindows )
+    {
+      if ( window->IsVisible() )
+      {
+        allWindowsHidden = false;
+        break;
+      }
+    }
+
+    // Only pause the adaptor when all the windows are hidden
+    if( allWindowsHidden )
+    {
+      if( mState == RUNNING )
+      {
+        Pause();
+
+        // Adaptor cannot be resumed until any window is shown
+        mState = PAUSED_WHILE_HIDDEN;
+      }
+      else  // mState is READY
+      {
+        // Pause the adaptor after the state gets RUNNING
+        mState = PAUSED_WHILE_INITIALIZING;
+      }
+    }
+    else
+    {
+      DALI_LOG_RELEASE_INFO( "Adaptor::OnWindowHidden: Some windows are shown. Don't pause adaptor.\n" );
+    }
+  }
+  else
+  {
+    DALI_LOG_RELEASE_INFO( "Adaptor::OnWindowHidden: Adaptor is not running state.[%d]\n", mState );
   }
 }
 
@@ -891,15 +989,12 @@ void Adaptor::OnDamaged( const DamageArea& area )
   RequestUpdate( false );
 }
 
-void Adaptor::SurfaceResizePrepare( SurfaceSize surfaceSize )
+void Adaptor::SurfaceResizePrepare( Dali::RenderSurfaceInterface* surface, SurfaceSize surfaceSize )
 {
-  // Let the core know the surface size has changed
-  mCore->SurfaceResized( surfaceSize.GetWidth(), surfaceSize.GetHeight() );
-
   mResizedSignal.Emit( mAdaptor );
 }
 
-void Adaptor::SurfaceResizeComplete( SurfaceSize surfaceSize )
+void Adaptor::SurfaceResizeComplete( Dali::RenderSurfaceInterface* surface, SurfaceSize surfaceSize )
 {
   // Flush the event queue to give the update-render thread chance
   // to start processing messages for new camera setup etc as soon as possible
@@ -912,13 +1007,32 @@ void Adaptor::NotifySceneCreated()
 {
   GetCore().SceneCreated();
 
+  // Flush the event queue to give the update-render thread chance
+  // to start processing messages for new camera setup etc as soon as possible
+  ProcessCoreEvents();
+
   // Start thread controller after the scene has been created
   mThreadController->Start();
 
   // Process after surface is created (registering to remote surface provider if required)
   SurfaceInitialized();
 
-  mState = RUNNING;
+  if( mState != PAUSED_WHILE_INITIALIZING )
+  {
+    mState = RUNNING;
+
+    DALI_LOG_RELEASE_INFO( "Adaptor::NotifySceneCreated: Adaptor is running\n" );
+  }
+  else
+  {
+    mState = RUNNING;
+
+    Pause();
+
+    mState = PAUSED_WHILE_HIDDEN;
+
+    DALI_LOG_RELEASE_INFO( "Adaptor::NotifySceneCreated: Adaptor is paused\n" );
+  }
 }
 
 void Adaptor::NotifyLanguageChanged()
@@ -936,6 +1050,16 @@ const LogFactoryInterface& Adaptor::GetLogFactory()
   return *mEnvironmentOptions;
 }
 
+void Adaptor::RegisterProcessor( Integration::Processor& processor )
+{
+  GetCore().RegisterProcessor(processor);
+}
+
+void Adaptor::UnregisterProcessor( Integration::Processor& processor )
+{
+  GetCore().UnregisterProcessor(processor);
+}
+
 void Adaptor::RequestUpdateOnce()
 {
   if( mThreadController )
@@ -944,12 +1068,6 @@ void Adaptor::RequestUpdateOnce()
   }
 }
 
-void Adaptor::IndicatorSizeChanged(int height)
-{
-  // Let the core know the indicator height is changed
-  mCore->SetTopMargin(height);
-}
-
 bool Adaptor::ProcessCoreEventsFromIdle()
 {
   ProcessCoreEvents();
@@ -960,29 +1078,69 @@ bool Adaptor::ProcessCoreEventsFromIdle()
   return false;
 }
 
-Adaptor::Adaptor(Any nativeWindow, Dali::Adaptor& adaptor, RenderSurface* surface, EnvironmentOptions* environmentOptions)
+Dali::Internal::Adaptor::SceneHolder* Adaptor::GetWindow( Dali::Actor& actor )
+{
+  Dali::Integration::Scene scene = Dali::Integration::Scene::Get( actor );
+
+  for( auto window : mWindows )
+  {
+    if ( scene == window->GetScene() )
+    {
+      return window;
+    }
+  }
+
+  return nullptr;
+}
+
+Dali::WindowContainer Adaptor::GetWindows() const
+{
+  Dali::WindowContainer windows;
+
+  for ( auto iter = mWindows.begin(); iter != mWindows.end(); ++iter )
+  {
+    // Downcast to Dali::Window
+    Dali::Window window( dynamic_cast<Dali::Internal::Adaptor::Window*>( *iter ) );
+    if ( window )
+    {
+      windows.push_back( window );
+    }
+  }
+
+  return windows;
+}
+
+Dali::SceneHolderList Adaptor::GetSceneHolders() const
+{
+  Dali::SceneHolderList sceneHolderList;
+
+  for( auto iter = mWindows.begin(); iter != mWindows.end(); ++iter )
+  {
+    sceneHolderList.push_back( Dali::Integration::SceneHolder( *iter ) );
+  }
+
+  return sceneHolderList;
+}
+
+Adaptor::Adaptor(Dali::Integration::SceneHolder window, Dali::Adaptor& adaptor, Dali::RenderSurfaceInterface* surface, EnvironmentOptions* environmentOptions)
 : mResizedSignal(),
   mLanguageChangedSignal(),
+  mWindowCreatedSignal(),
   mAdaptor( adaptor ),
   mState( READY ),
   mCore( nullptr ),
   mThreadController( nullptr ),
-  mVSyncMonitor( nullptr ),
   mGraphics( nullptr ),
   mDisplayConnection( nullptr ),
-  mWindowFrame(),
+  mWindows(),
   mPlatformAbstraction( nullptr ),
-  mEventHandler( nullptr ),
   mCallbackManager( nullptr ),
   mNotificationOnIdleInstalled( false ),
   mNotificationTrigger( nullptr ),
-  mGestureManager( nullptr ),
   mDaliFeedbackPlugin(),
   mFeedbackController( nullptr ),
   mTtsPlayers(),
   mObservers(),
-  mDragAndDropDetector(),
-  mDeferredRotationObserver( nullptr ),
   mEnvironmentOptions( environmentOptions ? environmentOptions : new EnvironmentOptions /* Create the options if not provided */),
   mPerformanceInterface( nullptr ),
   mKernelTracer(),
@@ -994,13 +1152,7 @@ Adaptor::Adaptor(Any nativeWindow, Dali::Adaptor& adaptor, RenderSurface* surfac
   mUseRemoteSurface( false )
 {
   DALI_ASSERT_ALWAYS( !IsAvailable() && "Cannot create more than one Adaptor per thread" );
-
-  WindowPane defaultWindow;
-  defaultWindow.nativeWindow = nativeWindow;
-  defaultWindow.surface = surface;
-
-  std::vector<WindowPane>::iterator iter = mWindowFrame.begin();
-  iter = mWindowFrame.insert( iter, defaultWindow );
+  mWindows.insert( mWindows.begin(), &Dali::GetImplementation( window ) );
 
   gThreadLocalAdaptor = this;
 }