[dali_2.3.42] Merge branch 'devel/master'
[platform/core/uifw/dali-adaptor.git] / dali / internal / adaptor / common / application-impl.cpp
index c5d0c23..41c8f64 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -34,6 +34,7 @@
 #include <dali/internal/adaptor/common/framework-factory.h>
 #include <dali/internal/adaptor/common/framework.h>
 #include <dali/internal/adaptor/common/lifecycle-controller-impl.h>
+#include <dali/internal/graphics/common/graphics-factory-interface.h>
 #include <dali/internal/system/common/command-line-options.h>
 #include <dali/internal/system/common/environment-variables.h>
 #include <dali/internal/system/common/system-settings.h>
@@ -61,7 +62,13 @@ namespace Internal
 {
 namespace Adaptor
 {
+namespace
+{
+#ifdef UI_THREAD_AVAILABLE
+const char* TIZEN_UI_THREAD_ENV = "TIZEN_UI_THREAD";
+#endif
 DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_APPLICATION, true);
+} // namespace
 
 ApplicationPtr Application::gPreInitializedApplication(NULL);
 
@@ -81,8 +88,10 @@ void Application::PreInitialize(int* argc, char** argv[])
 {
   if(!gPreInitializedApplication)
   {
-    char* retEnv        = std::getenv("TIZEN_UI_THREAD");
-    bool  isUseUIThread = false;
+    bool isUseUIThread = false;
+
+#ifdef UI_THREAD_AVAILABLE
+    const char* retEnv = Dali::EnvironmentVariable::GetEnvironmentVariable(TIZEN_UI_THREAD_ENV);
     if(retEnv)
     {
       std::string uiThreadEnv   = retEnv;
@@ -92,20 +101,24 @@ void Application::PreInitialize(int* argc, char** argv[])
         isUseUIThread = true;
       }
     }
+#endif
 
     Dali::TextAbstraction::FontClientPreInitialize();
     WindowData windowData;
     gPreInitializedApplication                  = new Application(argc, argv, "", Framework::NORMAL, isUseUIThread, windowData);
     gPreInitializedApplication->mLaunchpadState = Launchpad::PRE_INITIALIZED;
+
+#ifdef UI_THREAD_AVAILABLE
     if(isUseUIThread)
     {
-      DALI_LOG_RELEASE_INFO("PRE_INITIALIZED with UI Threading");
+      DALI_LOG_RELEASE_INFO("PRE_INITIALIZED with UI Threading\n");
       gPreInitializedApplication->mUIThreadLoader = new UIThreadLoader(argc, argv);
       gPreInitializedApplication->mUIThreadLoader->Run([&]() { gPreInitializedApplication->CreateWindow(); });
     }
     else
+#endif
     {
-      DALI_LOG_RELEASE_INFO("Only PRE_INITIALIZED");
+      DALI_LOG_RELEASE_INFO("Only PRE_INITIALIZED\n");
       gPreInitializedApplication->CreateWindow(); // Only create window
     }
   }
@@ -123,12 +136,12 @@ Application::Application(int* argc, char** argv[], const std::string& stylesheet
   mFramework(nullptr),
   mFrameworkFactory(nullptr),
   mCommandLineOptions(nullptr),
-  mAdaptorBuilder(nullptr),
   mAdaptor(nullptr),
   mEnvironmentOptions(nullptr),
   mMainWindow(),
   mMainWindowMode(windowData.GetTransparency() ? WINDOW_MODE::TRANSPARENT : WINDOW_MODE::OPAQUE),
   mMainWindowName(),
+  mIsMainWindowFrontBufferRendering(windowData.GetFrontBufferRendering()),
   mStylesheet(stylesheet),
   mWindowPositionSize(windowData.GetPositionSize()),
   mLaunchpadState(Launchpad::NONE),
@@ -177,7 +190,6 @@ Application::~Application()
   if(!mUseUiThread)
   {
     delete mAdaptor;
-    delete mAdaptorBuilder;
     if(mIsSystemInitialized)
     {
       WindowSystem::Shutdown();
@@ -197,6 +209,11 @@ void Application::StoreWindowPositionSize(PositionSize positionSize)
   mWindowPositionSize = positionSize;
 }
 
+void Application::StoreFrontBufferRendering(bool enable)
+{
+  mIsMainWindowFrontBufferRendering = enable;
+}
+
 void Application::ChangePreInitializedWindowInfo()
 {
   // Set window name
@@ -240,6 +257,9 @@ void Application::ChangePreInitializedWindowInfo()
     mWindowPositionSize.height = screenHeight;
     mMainWindow.SetSize(Dali::Window::WindowSize(mWindowPositionSize.width, mWindowPositionSize.height));
   }
+
+  // Set front buffer rendering
+  Dali::DevelWindow::SetFrontBufferRendering(mMainWindow, mIsMainWindowFrontBufferRendering);
 }
 
 void Application::CreateWindow()
@@ -248,8 +268,9 @@ void Application::CreateWindow()
   WindowData                 windowData;
   windowData.SetTransparency(mMainWindowMode);
   windowData.SetWindowType(mDefaultWindowType);
+  windowData.SetFrontBufferRendering(mIsMainWindowFrontBufferRendering);
 
-  DALI_LOG_RELEASE_INFO("Create Default Window");
+  DALI_LOG_RELEASE_INFO("Create Default Window\n");
 
   WindowSystem::Initialize();
   mIsSystemInitialized = true;
@@ -284,8 +305,8 @@ void Application::CreateWindow()
   }
   else
   {
-    // The position, size and the window name of the pre-initialized application will be updated in ChangePreInitializedWindowInfo()
-    // when the real application is launched.
+    // The position, size, window name, and frontbuffering of the pre-initialized application
+    // will be updated in ChangePreInitializedWindowInfo() when the real application is launched.
     windowData.SetPositionSize(mWindowPositionSize);
     window = Internal::Adaptor::Window::New("", "", windowData);
   }
@@ -296,11 +317,11 @@ void Application::CreateWindow()
   GetImplementation(mMainWindow).DeleteRequestSignal().Connect(mSlotDelegate, &Application::Quit);
 }
 
-void Application::CreateAdaptor()
+void Application::CreateAdaptor(AdaptorBuilder& adaptorBuilder)
 {
   DALI_ASSERT_ALWAYS(mMainWindow && "Window required to create adaptor");
 
-  auto graphicsFactory = mAdaptorBuilder->GetGraphicsFactory();
+  auto& graphicsFactory = adaptorBuilder.GetGraphicsFactory();
 
   Integration::SceneHolder sceneHolder = Integration::SceneHolder(&Dali::GetImplementation(mMainWindow));
 
@@ -309,11 +330,6 @@ void Application::CreateAdaptor()
   Adaptor::GetImplementation(*mAdaptor).SetUseRemoteSurface(mUseRemoteSurface);
 }
 
-void Application::CreateAdaptorBuilder()
-{
-  mAdaptorBuilder = new AdaptorBuilder(*mEnvironmentOptions);
-}
-
 void Application::MainLoop()
 {
   // Run the application
@@ -330,7 +346,7 @@ void Application::Quit()
 {
   // Actually quit the application.
   // Force a call to Quit even if adaptor is not running.
-  Internal::Adaptor::Adaptor::GetImplementation(*mAdaptor).AddIdle(MakeCallback(this, &Application::QuitFromMainLoop), false, true);
+  Internal::Adaptor::Adaptor::GetImplementation(*mAdaptor).AddIdle(MakeCallback(this, &Application::QuitFromMainLoop), false);
 }
 
 void Application::QuitFromMainLoop()
@@ -349,15 +365,18 @@ void Application::OnInit()
 
   mFramework->AddAbortCallback(MakeCallback(this, &Application::QuitFromMainLoop));
 
-  CreateAdaptorBuilder();
+  auto& adaptorBuilder = AdaptorBuilder::Get(*mEnvironmentOptions);
   // If an application was pre-initialized, a window was made in advance
   if(mLaunchpadState == Launchpad::NONE)
   {
-    DALI_LOG_RELEASE_INFO("default Window is created in standalone");
+    DALI_LOG_RELEASE_INFO("default Window is created in standalone\n");
     CreateWindow();
   }
 
-  CreateAdaptor();
+  CreateAdaptor(adaptorBuilder);
+
+  // adaptorBuilder invalidate after now.
+  AdaptorBuilder::Finalize();
 
   if(mLaunchpadState == Launchpad::PRE_INITIALIZED)
   {
@@ -368,7 +387,6 @@ void Application::OnInit()
   DALI_TRACE_BEGIN(gTraceFilter, "DALI_APP_ADAPTOR_START");
   mAdaptor->Start();
   DALI_TRACE_END(gTraceFilter, "DALI_APP_ADAPTOR_START");
-  Accessibility::Accessible::SetObjectRegistry(mAdaptor->GetObjectRegistry());
 
   if(!mStylesheet.empty())
   {
@@ -418,13 +436,14 @@ void Application::OnTerminate()
   if(mUseUiThread)
   {
     delete mAdaptor;
-    delete mAdaptorBuilder;
     WindowSystem::Shutdown();
   }
 }
 
 void Application::OnPause()
 {
+  Accessibility::Bridge::GetCurrentBridge()->ApplicationPaused();
+
   // A DALi app should handle Pause/Resume events.
   // DALi just delivers the framework Pause event to the application, but not actually pause DALi core.
   // Pausing DALi core only occurs on the Window Hidden framework event
@@ -434,6 +453,8 @@ void Application::OnPause()
 
 void Application::OnResume()
 {
+  Accessibility::Bridge::GetCurrentBridge()->ApplicationResumed();
+
   // Emit the signal first so the application can queue any messages before we do an update/render
   // This ensures we do not just redraw the last frame before pausing if that's not required
   Dali::Application application(this);