X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fadaptor%2Fcommon%2Fapplication-impl.cpp;h=d15756d89b5a21a479f6343ad9d0f0cccc755d0e;hb=1839c7401f2d5c26dee1be402837ea3539129ece;hp=f7286579cbc239080c1b3dc8b899dafa5cfa2b92;hpb=263ec21432f3d7c9f9be5b463748fdce8f6942e4;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 f728657..d15756d --- 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) 2021 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,22 +19,28 @@ #include // EXTERNAL INCLUDES +#include #include +#include // INTERNAL INCLUDES +#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; @@ -47,90 +53,78 @@ class Core; namespace Internal { - namespace Adaptor { - -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) { - ApplicationPtr application ( new Application (argc, argv, stylesheet, windowMode, positionSize, applicationType ) ); + ApplicationPtr application(new Application(argc, argv, stylesheet, windowMode, positionSize, applicationType)); 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); + gPreInitializedApplication->CreateWindow(); // Only create window gPreInitializedApplication->mLaunchpadState = Launchpad::PRE_INITIALIZED; } } -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) : 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(), - mStylesheet( stylesheet ), + mStylesheet(stylesheet), mEnvironmentOptions(), - mWindowPositionSize( positionSize ), - mLaunchpadState( Launchpad::NONE ), - mSlotDelegate( this ), - mViewMode( MONO ), - mStereoBase( DEFAULT_STEREO_BASE ) + mWindowPositionSize(positionSize), + mLaunchpadState(Launchpad::NONE), + 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; @@ -139,53 +133,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(); - mMainWindow = Dali::Window::New( mWindowPositionSize, mMainWindowName, windowClassName, mMainWindowMode == Dali::Application::TRANSPARENT ); + + Internal::Adaptor::Window* window = Internal::Adaptor::Window::New(mWindowPositionSize, mMainWindowName, windowClassName, 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(); - mAdaptor = Dali::Internal::Adaptor::Adaptor::New( graphicsFactory, mMainWindow, mContextLossConfiguration, &mEnvironmentOptions ); + Integration::SceneHolder sceneHolder = Integration::SceneHolder(&Dali::GetImplementation(mMainWindow)); - mAdaptor->ResizedSignal().Connect( mSlotDelegate, &Application::OnResize ); + mAdaptor = Adaptor::New(graphicsFactory, sceneHolder, &mEnvironmentOptions); - Internal::Adaptor::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(); } @@ -200,11 +231,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(); @@ -213,45 +246,43 @@ 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(); - // Run the adaptor - mAdaptor->Start(); - - // Check if user requires no vsyncing and set Adaptor - if (mCommandLineOptions->noVSyncOnRender) + if(mLaunchpadState == Launchpad::PRE_INITIALIZED) { - mAdaptor->SetUseHardwareVSync(false); + ChangePreInitializedWindowSize(); } - if( ! mStylesheet.empty() ) + // Run the adaptor + mAdaptor->Start(); + Accessibility::Accessible::SetObjectRegistry(mAdaptor->GetObjectRegistry()); + + 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 ); + mInitSignal.Emit(application); mAdaptor->NotifySceneCreated(); } @@ -262,9 +293,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(); @@ -279,7 +310,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() @@ -287,13 +318,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(); } @@ -304,52 +335,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 @@ -362,6 +401,16 @@ std::string Application::GetLanguage() const return mFramework->GetLanguage(); } +Dali::ObjectRegistry Application::GetObjectRegistry() const +{ + Dali::ObjectRegistry objectRegistry; + if(mAdaptor) + { + objectRegistry = mAdaptor->GetObjectRegistry(); + } + return objectRegistry; +} + Dali::Adaptor& Application::GetAdaptor() { return *mAdaptor; @@ -372,60 +421,39 @@ Dali::Window Application::GetWindow() return mMainWindow; } -// Stereoscopy - -void Application::SetViewMode( ViewMode viewMode ) -{ - mViewMode = viewMode; -} - -ViewMode Application::GetViewMode() const +std::string Application::GetResourcePath() { - return mViewMode; + return Internal::Adaptor::Framework::GetResourcePath(); } -void Application::SetStereoBase( float stereoBase ) +std::string Application::GetDataPath() { - mStereoBase = stereoBase; + return Internal::Adaptor::Framework::GetDataPath(); } -float Application::GetStereoBase() const +void Application::SetStyleSheet(const std::string& stylesheet) { - return mStereoBase; + mStylesheet = stylesheet; } -void Application::ReplaceWindow( const PositionSize& positionSize, const std::string& name ) +void Application::SetCommandLineOptions(int* argc, char** argv[]) { - Dali::Window newWindow = Dali::Window::New( positionSize, name, mMainWindowMode == Dali::Application::TRANSPARENT ); - Window& windowImpl = GetImplementation(newWindow); - windowImpl.SetAdaptor(*mAdaptor); - - Internal::Adaptor::WindowRenderSurface* renderSurface = windowImpl.GetSurface(); - - Any nativeWindow = newWindow.GetNativeHandle(); - Internal::Adaptor::Adaptor::GetImplementation( *mAdaptor ).ReplaceSurface(nativeWindow, *renderSurface); - mMainWindow = newWindow; - mWindowPositionSize = positionSize; -} + delete mCommandLineOptions; -std::string Application::GetResourcePath() -{ - return Internal::Adaptor::Framework::GetResourcePath(); -} + mCommandLineOptions = new CommandLineOptions(argc, argv); -std::string Application::GetDataPath() -{ - return Internal::Adaptor::Framework::GetDataPath(); + mFramework->SetCommandLineOptions(argc, argv); } -void Application::SetStyleSheet( const std::string& stylesheet ) +ApplicationPtr Application::GetPreInitializedApplication() { - mStylesheet = stylesheet; + return gPreInitializedApplication; } -ApplicationPtr Application::GetPreInitializedApplication() +Graphics::Controller& Application::GetController() { - return gPreInitializedApplication; + auto& adaptor = Internal::Adaptor::Adaptor::GetImplementation(*mAdaptor); + return adaptor.GetGraphicsInterface().GetController(); } } // namespace Adaptor