X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fadaptor%2Fcommon%2Fapplication-impl.cpp;h=97a23e0e5e85726c15d42948841327eb4e79913f;hb=4f13abefdf41f84b8f367bbdb0fa299c66b7113d;hp=94196b7d5a26bf200e1582002b7e0a8bf8a78255;hpb=0f4675a0315595a0ca60a1f6103834165c1791d3;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/adaptor/common/application-impl.cpp b/dali/internal/adaptor/common/application-impl.cpp old mode 100755 new mode 100644 index 94196b7..97a23e0 --- a/dali/internal/adaptor/common/application-impl.cpp +++ b/dali/internal/adaptor/common/application-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -19,26 +19,30 @@ #include // EXTERNAL INCLUDES +#include #include +#include +#include // INTERNAL INCLUDES +#include #include +#include #include #include -#include #include -#include #include +#include +#include #include #include -#include +#include // To disable a macro with the same name from one of OpenGL headers #undef Status namespace Dali { - namespace TizenPlatform { class TizenPlatformAbstraction; @@ -51,96 +55,82 @@ class Core; namespace Internal { - namespace Adaptor { +DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_APPLICATION, true); -namespace -{ - -const float DEFAULT_STEREO_BASE( 65.0f ); - -} // unnamed namespace - -ApplicationPtr Application::gPreInitializedApplication( NULL ); +ApplicationPtr Application::gPreInitializedApplication(NULL); ApplicationPtr Application::New( - int* argc, - char **argv[], - const std::string& stylesheet, + int* argc, + char** argv[], + const std::string& stylesheet, Dali::Application::WINDOW_MODE windowMode, - const PositionSize& positionSize, - Framework::Type applicationType) + const PositionSize& positionSize, + Framework::Type applicationType, + WindowType type) { - ApplicationPtr application ( new Application (argc, argv, stylesheet, windowMode, positionSize, applicationType ) ); + ApplicationPtr application(new Application(argc, argv, stylesheet, windowMode, positionSize, applicationType, type)); return application; } -void Application::PreInitialize( int* argc, char** argv[] ) +void Application::PreInitialize(int* argc, char** argv[]) { - if( !gPreInitializedApplication ) + if(!gPreInitializedApplication) { - gPreInitializedApplication = new Application ( argc, argv, "", Dali::Application::OPAQUE, PositionSize(), Framework::NORMAL ); - - gPreInitializedApplication->CreateWindow(); // Only create window + Dali::TextAbstraction::FontClientPreInitialize(); + gPreInitializedApplication = new Application(argc, argv, "", Dali::Application::OPAQUE, PositionSize(), Framework::NORMAL, WindowType::NORMAL); + gPreInitializedApplication->CreateWindow(); // Only create window gPreInitializedApplication->mLaunchpadState = Launchpad::PRE_INITIALIZED; - - //Make DefaultFontDescription cached - Dali::TextAbstraction::FontClient fontClient = Dali::TextAbstraction::FontClient::Get(); - Dali::TextAbstraction::FontDescription defaultFontDescription; - fontClient.GetDefaultPlatformFontDescription( defaultFontDescription ); } } -Application::Application( int* argc, char** argv[], const std::string& stylesheet, - Dali::Application::WINDOW_MODE windowMode, const PositionSize& positionSize, Framework::Type applicationType ) +Application::Application(int* argc, char** argv[], const std::string& stylesheet, Dali::Application::WINDOW_MODE windowMode, const PositionSize& positionSize, Framework::Type applicationType, WindowType type) : mInitSignal(), mTerminateSignal(), mPauseSignal(), mResumeSignal(), mResetSignal(), - mResizeSignal(), mAppControlSignal(), mLanguageChangedSignal(), mRegionChangedSignal(), - mBatteryLowSignal(), - mMemoryLowSignal(), - mEventLoop( nullptr ), - mFramework( nullptr ), - mContextLossConfiguration( Configuration::APPLICATION_DOES_NOT_HANDLE_CONTEXT_LOSS ), - mCommandLineOptions( nullptr ), - mSingletonService( SingletonService::New() ), - mAdaptorBuilder( nullptr ), - mAdaptor( nullptr ), + mEventLoop(nullptr), + mFramework(nullptr), + mCommandLineOptions(nullptr), + mAdaptorBuilder(nullptr), + mAdaptor(nullptr), mMainWindow(), - mMainWindowMode( windowMode ), + mMainWindowMode(windowMode), mMainWindowName(), - mMainWindowReplaced( false ), - mStylesheet( stylesheet ), + mStylesheet(stylesheet), mEnvironmentOptions(), - mWindowPositionSize( positionSize ), - mLaunchpadState( Launchpad::NONE ), - mSlotDelegate( this ), - mViewMode( MONO ), - mStereoBase( DEFAULT_STEREO_BASE ) + mWindowPositionSize(positionSize), + mLaunchpadState(Launchpad::NONE), + mDefaultWindowType(type), + mSlotDelegate(this) { // Get mName from environment options mMainWindowName = mEnvironmentOptions.GetWindowName(); - if( mMainWindowName.empty() && argc && ( *argc > 0 ) ) + if(mMainWindowName.empty() && argc && (*argc > 0)) { // Set mName from command-line args if environment option not set mMainWindowName = (*argv)[0]; } mCommandLineOptions = new CommandLineOptions(argc, argv); - mFramework = new Framework( *this, argc, argv, applicationType ); - mUseRemoteSurface = (applicationType == Framework::WATCH); + mFramework = new Framework(*this, argc, argv, applicationType); + mUseRemoteSurface = (applicationType == Framework::WATCH); } Application::~Application() { - mSingletonService.UnregisterAll(); + SingletonService service = SingletonService::Get(); + // Note this can be false i.e. if Application has never created a Core instance + if(service) + { + service.UnregisterAll(); + } mMainWindow.Reset(); delete mAdaptor; @@ -149,57 +139,90 @@ Application::~Application() delete mFramework; } +void Application::StoreWindowPositionSize(PositionSize positionSize) +{ + mWindowPositionSize = positionSize; +} + +void Application::ChangePreInitializedWindowSize() +{ + int screenWidth, screenHeight; + Dali::Internal::Adaptor::WindowSystem::GetScreenSize(screenWidth, screenHeight); + + if(mWindowPositionSize != PositionSize(0, 0, 0, 0)) + { + Dali::DevelWindow::SetPositionSize(mMainWindow, mWindowPositionSize); + } + else if(mCommandLineOptions->stageWidth > 0 && mCommandLineOptions->stageHeight > 0) + { + // Command line options override environment options and full screen + mWindowPositionSize.width = mCommandLineOptions->stageWidth; + mWindowPositionSize.height = mCommandLineOptions->stageHeight; + mMainWindow.SetSize(Dali::Window::WindowSize(mWindowPositionSize.width, mWindowPositionSize.height)); + } + else if(mEnvironmentOptions.GetWindowWidth() && mEnvironmentOptions.GetWindowHeight()) + { + // Environment options override full screen functionality if command line arguments not provided + mWindowPositionSize.width = mEnvironmentOptions.GetWindowWidth(); + mWindowPositionSize.height = mEnvironmentOptions.GetWindowHeight(); + mMainWindow.SetSize(Dali::Window::WindowSize(mWindowPositionSize.width, mWindowPositionSize.height)); + } + else if(screenWidth != mWindowPositionSize.width || screenHeight != mWindowPositionSize.height) + { + //Some apps can receive screen size differently after launching by specifying size in manifest. + mWindowPositionSize.width = screenWidth; + mWindowPositionSize.height = screenHeight; + mMainWindow.SetSize(Dali::Window::WindowSize(mWindowPositionSize.width, mWindowPositionSize.height)); + } +} + void Application::CreateWindow() { - if( mWindowPositionSize.width == 0 && mWindowPositionSize.height == 0 ) + if(mWindowPositionSize.width == 0 && mWindowPositionSize.height == 0) { - if( mCommandLineOptions->stageWidth > 0 && mCommandLineOptions->stageHeight > 0 ) + if(mCommandLineOptions->stageWidth > 0 && mCommandLineOptions->stageHeight > 0) { // Command line options override environment options and full screen - mWindowPositionSize.width = mCommandLineOptions->stageWidth; + mWindowPositionSize.width = mCommandLineOptions->stageWidth; mWindowPositionSize.height = mCommandLineOptions->stageHeight; } - else if( mEnvironmentOptions.GetWindowWidth() && mEnvironmentOptions.GetWindowHeight() ) + else if(mEnvironmentOptions.GetWindowWidth() && mEnvironmentOptions.GetWindowHeight()) { // Environment options override full screen functionality if command line arguments not provided - mWindowPositionSize.width = mEnvironmentOptions.GetWindowWidth(); + mWindowPositionSize.width = mEnvironmentOptions.GetWindowWidth(); mWindowPositionSize.height = mEnvironmentOptions.GetWindowHeight(); } } const std::string& windowClassName = mEnvironmentOptions.GetWindowClassName(); - Internal::Adaptor::Window* window = Internal::Adaptor::Window::New( mWindowPositionSize, mMainWindowName, windowClassName, mMainWindowMode == Dali::Application::TRANSPARENT ); - mMainWindow = Dali::Window( window ); + Internal::Adaptor::Window* window = Internal::Adaptor::Window::New(mWindowPositionSize, mMainWindowName, windowClassName, mDefaultWindowType, mMainWindowMode == Dali::Application::TRANSPARENT); + mMainWindow = Dali::Window(window); // Quit the application when the window is closed - GetImplementation( mMainWindow ).DeleteRequestSignal().Connect( mSlotDelegate, &Application::Quit ); + GetImplementation(mMainWindow).DeleteRequestSignal().Connect(mSlotDelegate, &Application::Quit); } void Application::CreateAdaptor() { - DALI_ASSERT_ALWAYS( mMainWindow && "Window required to create adaptor" ); + DALI_ASSERT_ALWAYS(mMainWindow && "Window required to create adaptor"); auto graphicsFactory = mAdaptorBuilder->GetGraphicsFactory(); - Integration::SceneHolder sceneHolder = Integration::SceneHolder( &Dali::GetImplementation( mMainWindow ) ); - - mAdaptor = Adaptor::New( graphicsFactory, sceneHolder, mContextLossConfiguration, &mEnvironmentOptions ); + Integration::SceneHolder sceneHolder = Integration::SceneHolder(&Dali::GetImplementation(mMainWindow)); - mAdaptor->ResizedSignal().Connect( mSlotDelegate, &Application::OnResize ); + mAdaptor = Adaptor::New(graphicsFactory, sceneHolder, &mEnvironmentOptions); - Adaptor::GetImplementation( *mAdaptor ).SetUseRemoteSurface( mUseRemoteSurface ); + Adaptor::GetImplementation(*mAdaptor).SetUseRemoteSurface(mUseRemoteSurface); } void Application::CreateAdaptorBuilder() { - mAdaptorBuilder = new AdaptorBuilder(); + mAdaptorBuilder = new AdaptorBuilder(mEnvironmentOptions); } -void Application::MainLoop(Dali::Configuration::ContextLoss configuration) +void Application::MainLoop() { - mContextLossConfiguration = configuration; - // Run the application mFramework->Run(); } @@ -214,11 +237,13 @@ 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, true); } void Application::QuitFromMainLoop() { + Accessibility::Bridge::GetCurrentBridge()->Terminate(); + mAdaptor->Stop(); mFramework->Quit(); @@ -227,39 +252,48 @@ void Application::QuitFromMainLoop() void Application::OnInit() { - mFramework->AddAbortCallback( MakeCallback( this, &Application::QuitFromMainLoop ) ); + mFramework->AddAbortCallback(MakeCallback(this, &Application::QuitFromMainLoop)); CreateAdaptorBuilder(); - // If an application was pre-initialized, a window was made in advance - if( mLaunchpadState == Launchpad::NONE ) + if(mLaunchpadState == Launchpad::NONE) { CreateWindow(); } CreateAdaptor(); + if(mLaunchpadState == Launchpad::PRE_INITIALIZED) + { + ChangePreInitializedWindowSize(); + } + // Run the adaptor + 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() ) + if(!mStylesheet.empty()) { - Dali::StyleMonitor::Get().SetTheme( mStylesheet ); + Dali::StyleMonitor::Get().SetTheme(mStylesheet); } // Wire up the LifecycleController Dali::LifecycleController lifecycleController = Dali::LifecycleController::Get(); - InitSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnInit ); - TerminateSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnTerminate ); - PauseSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnPause ); - ResumeSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnResume ); - ResetSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnReset ); - ResizeSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnResize ); - LanguageChangedSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnLanguageChanged ); + InitSignal().Connect(&GetImplementation(lifecycleController), &LifecycleController::OnInit); + TerminateSignal().Connect(&GetImplementation(lifecycleController), &LifecycleController::OnTerminate); + PauseSignal().Connect(&GetImplementation(lifecycleController), &LifecycleController::OnPause); + ResumeSignal().Connect(&GetImplementation(lifecycleController), &LifecycleController::OnResume); + ResetSignal().Connect(&GetImplementation(lifecycleController), &LifecycleController::OnReset); + LanguageChangedSignal().Connect(&GetImplementation(lifecycleController), &LifecycleController::OnLanguageChanged); Dali::Application application(this); - mInitSignal.Emit( application ); + + DALI_TRACE_BEGIN(gTraceFilter, "DALI_APP_EMIT_INIT_SIGNAL"); + mInitSignal.Emit(application); + DALI_TRACE_END(gTraceFilter, "DALI_APP_EMIT_INIT_SIGNAL"); mAdaptor->NotifySceneCreated(); } @@ -270,9 +304,9 @@ void Application::OnTerminate() // delete the window as ecore_x has been destroyed by AppCore Dali::Application application(this); - mTerminateSignal.Emit( application ); + mTerminateSignal.Emit(application); - if( mAdaptor ) + if(mAdaptor) { // Ensure that the render-thread is not using the surface(window) after we delete it mAdaptor->Stop(); @@ -287,7 +321,7 @@ void Application::OnPause() // 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 Dali::Application application(this); - mPauseSignal.Emit( application ); + mPauseSignal.Emit(application); } void Application::OnResume() @@ -295,13 +329,13 @@ void Application::OnResume() // 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); - mResumeSignal.Emit( application ); + mResumeSignal.Emit(application); // DALi just delivers the framework Resume event to the application. // Resuming DALi core only occurs on the Window Show framework event // Trigger processing of events queued up while paused - CoreEventInterface& coreEventInterface = Internal::Adaptor::Adaptor::GetImplementation( GetAdaptor() ); + CoreEventInterface& coreEventInterface = Internal::Adaptor::Adaptor::GetImplementation(GetAdaptor()); coreEventInterface.ProcessCoreEvents(); } @@ -312,53 +346,60 @@ void Application::OnReset() * because Application class already handled initialization in OnInit(), OnReset do nothing. */ Dali::Application application(this); - mResetSignal.Emit( application ); + mResetSignal.Emit(application); } -void Application::OnAppControl(void *data) +void Application::OnAppControl(void* data) { Dali::Application application(this); - mAppControlSignal.Emit( application , data ); + mAppControlSignal.Emit(application, data); } void Application::OnLanguageChanged() { mAdaptor->NotifyLanguageChanged(); Dali::Application application(this); - mLanguageChangedSignal.Emit( application ); + mLanguageChangedSignal.Emit(application); } void Application::OnRegionChanged() { Dali::Application application(this); - mRegionChangedSignal.Emit( application ); + mRegionChangedSignal.Emit(application); } -void Application::OnBatteryLow( Dali::DeviceStatus::Battery::Status status ) +void Application::OnBatteryLow(Dali::DeviceStatus::Battery::Status status) { Dali::Application application(this); - mBatteryLowSignal.Emit( application ); - - mLowBatterySignal.Emit( status ); + mLowBatterySignal.Emit(status); } -void Application::OnMemoryLow( Dali::DeviceStatus::Memory::Status status ) +void Application::OnMemoryLow(Dali::DeviceStatus::Memory::Status status) { Dali::Application application(this); - mMemoryLowSignal.Emit( application ); + mLowMemorySignal.Emit(status); +} - mLowMemorySignal.Emit( status ); +void Application::OnSurfaceCreated(Any newSurface) +{ + void* newWindow = AnyCast(newSurface); + void* oldWindow = AnyCast(mMainWindow.GetNativeHandle()); + if(oldWindow != newWindow) + { + auto renderSurfaceFactory = Dali::Internal::Adaptor::GetRenderSurfaceFactory(); + std::unique_ptr newSurfacePtr = renderSurfaceFactory->CreateWindowRenderSurface(PositionSize(), newSurface, true); + + mAdaptor->ReplaceSurface(mMainWindow, *newSurfacePtr.release()); + } } -void Application::OnResize(Dali::Adaptor& adaptor) +void Application::OnSurfaceDestroyed(Any surface) { - Dali::Application application(this); - mResizeSignal.Emit( application ); } -bool Application::AddIdle( CallbackBase* callback, bool hasReturnValue ) +bool Application::AddIdle(CallbackBase* callback, bool hasReturnValue) { - return mAdaptor->AddIdle( callback, hasReturnValue ); + return mAdaptor->AddIdle(callback, hasReturnValue); } std::string Application::GetRegion() const @@ -371,54 +412,24 @@ std::string Application::GetLanguage() const return mFramework->GetLanguage(); } -Dali::Adaptor& Application::GetAdaptor() -{ - return *mAdaptor; -} - -Dali::Window Application::GetWindow() +Dali::ObjectRegistry Application::GetObjectRegistry() const { - // Changed to return a different window handle after ReplaceWindow is called - // just for backward compatibility to make the test case pass - if ( mMainWindowReplaced ) + Dali::ObjectRegistry objectRegistry; + if(mAdaptor) { - Internal::Adaptor::Window* window = Internal::Adaptor::Window::New( PositionSize(), "ReplacedWindow", "", false ); - return Dali::Window( window ); + objectRegistry = mAdaptor->GetObjectRegistry(); } - else - { - return mMainWindow; - } -} - -// Stereoscopy - -void Application::SetViewMode( ViewMode viewMode ) -{ - mViewMode = viewMode; -} - -ViewMode Application::GetViewMode() const -{ - return mViewMode; + return objectRegistry; } -void Application::SetStereoBase( float stereoBase ) -{ - mStereoBase = stereoBase; -} - -float Application::GetStereoBase() const +Dali::Adaptor& Application::GetAdaptor() { - return mStereoBase; + return *mAdaptor; } -void Application::ReplaceWindow( const PositionSize& positionSize, const std::string& name ) +Dali::Window Application::GetWindow() { - // This API is kept just for backward compatibility to make the test case pass. - - mMainWindowReplaced = true; - OnResize( *mAdaptor ); + return mMainWindow; } std::string Application::GetResourcePath() @@ -431,23 +442,33 @@ std::string Application::GetDataPath() return Internal::Adaptor::Framework::GetDataPath(); } -void Application::SetStyleSheet( const std::string& stylesheet ) +void Application::SetStyleSheet(const std::string& stylesheet) { mStylesheet = stylesheet; } -void Application::SetCommandLineOptions( int* argc, char **argv[] ) +void Application::SetCommandLineOptions(int* argc, char** argv[]) { delete mCommandLineOptions; - mCommandLineOptions = new CommandLineOptions( argc, argv ); + mCommandLineOptions = new CommandLineOptions(argc, argv); - mFramework->SetCommandLineOptions( argc, argv ); + mFramework->SetCommandLineOptions(argc, argv); +} + +void Application::SetDefaultWindowType(WindowType type) +{ + mDefaultWindowType = type; + mMainWindow.SetType(type); } ApplicationPtr Application::GetPreInitializedApplication() { - return gPreInitializedApplication; + // Reset the handle to decrease the reference count + ApplicationPtr application = gPreInitializedApplication; + gPreInitializedApplication.Reset(); + + return application; } } // namespace Adaptor