From 9ad4ad53c2284e59346f28441bd327dcd02b73c6 Mon Sep 17 00:00:00 2001 From: "dongsug.song" Date: Mon, 23 Sep 2019 16:10:37 +0900 Subject: [PATCH 1/1] Support scene holder instead of window in keyinput/keyboard focus - This is not the cause of csfs exception issue. merged again. - It is reverted twice : Revert "[Tizen] Revert "Support scene holder instead of window in keyinput/keyboard focus"" This reverts commit bf663c68252f80cbf6066f9139e8f5c2430dd151. Change-Id: I28ed9b663fb83e12b30d04afee0c3c4a1c0c424f --- .../src/dali-toolkit-internal/CMakeLists.txt | 1 + .../src/dali-toolkit-styling/CMakeLists.txt | 1 + .../dali-toolkit-test-utils/toolkit-adaptor-impl.h | 3 +- .../dali-toolkit-test-utils/toolkit-adaptor.cpp | 59 ++++++++- .../toolkit-scene-holder.cpp | 133 ++++++++++++++++++++- .../dali-toolkit-test-utils/toolkit-window.cpp | 51 ++++---- .../focus-manager/keyboard-focus-manager-impl.cpp | 31 +++-- .../focus-manager/keyboard-focus-manager-impl.h | 13 +- .../focus-manager/keyinput-focus-manager-impl.cpp | 16 +-- .../focus-manager/keyinput-focus-manager-impl.h | 13 +- 10 files changed, 253 insertions(+), 68 deletions(-) diff --git a/automated-tests/src/dali-toolkit-internal/CMakeLists.txt b/automated-tests/src/dali-toolkit-internal/CMakeLists.txt index 4037aac..984e177 100755 --- a/automated-tests/src/dali-toolkit-internal/CMakeLists.txt +++ b/automated-tests/src/dali-toolkit-internal/CMakeLists.txt @@ -52,6 +52,7 @@ LIST(APPEND TC_SOURCES ../dali-toolkit/dali-toolkit-test-utils/toolkit-tts-player.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp + ../dali-toolkit/dali-toolkit-test-utils/toolkit-scene-holder.cpp ../dali-toolkit/dali-toolkit-test-utils/dali-test-suite-utils.cpp ../dali-toolkit/dali-toolkit-test-utils/dali-toolkit-test-suite-utils.cpp ../dali-toolkit/dali-toolkit-test-utils/dummy-control.cpp diff --git a/automated-tests/src/dali-toolkit-styling/CMakeLists.txt b/automated-tests/src/dali-toolkit-styling/CMakeLists.txt index 1c62f77..0b08ff4 100644 --- a/automated-tests/src/dali-toolkit-styling/CMakeLists.txt +++ b/automated-tests/src/dali-toolkit-styling/CMakeLists.txt @@ -38,6 +38,7 @@ LIST(APPEND TC_SOURCES ../dali-toolkit/dali-toolkit-test-utils/toolkit-video-player.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-virtual-keyboard.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp + ../dali-toolkit/dali-toolkit-test-utils/toolkit-scene-holder.cpp ../dali-toolkit/dali-toolkit-test-utils/dummy-control.cpp ../dali-toolkit/dali-toolkit-test-utils/dali-test-suite-utils.cpp ../dali-toolkit/dali-toolkit-test-utils/dali-toolkit-test-suite-utils.cpp diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-adaptor-impl.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-adaptor-impl.h index f9f12bf..2feb3e0 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-adaptor-impl.h +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-adaptor-impl.h @@ -77,6 +77,7 @@ public: Dali::RenderSurfaceInterface& GetSurface(); Dali::WindowContainer GetWindows(); + Dali::SceneHolderList GetSceneHolders(); Dali::Internal::Adaptor::SceneHolder* GetWindow( Dali::Actor& actor ); void AddWindow( Internal::Adaptor::SceneHolder* window ); @@ -92,7 +93,7 @@ public: private: Vector mCallbacks; - Dali::WindowContainer mWindows; + std::vector mWindows; Dali::Adaptor::AdaptorSignalType mResizedSignal; Dali::Adaptor::AdaptorSignalType mLanguageChangedSignal; Dali::Adaptor::WindowCreatedSignalType mWindowCreatedSignal; diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-adaptor.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-adaptor.cpp index 9b5d8cf..bfc2478 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-adaptor.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-adaptor.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -95,11 +96,7 @@ Adaptor::~Adaptor() void Adaptor::Start( Dali::Window window ) { - if ( window ) - { - mWindows.push_back( window ); - mWindowCreatedSignal.Emit( window ); - } + AddWindow( &GetImplementation( window ) ); } Integration::Scene Adaptor::GetScene( Dali::Window window ) @@ -153,6 +150,53 @@ Dali::WindowContainer Adaptor::GetWindows() return windows; } +Dali::SceneHolderList Adaptor::GetSceneHolders() +{ + Dali::SceneHolderList sceneHolderList; + + for( auto iter = mWindows.begin(); iter != mWindows.end(); ++iter ) + { + sceneHolderList.push_back( Dali::Integration::SceneHolder( *iter ) ); + } + + return sceneHolderList; +} + +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; +} + +void Adaptor::AddWindow( Internal::Adaptor::SceneHolder* window ) +{ + if ( window ) + { + mWindows.push_back( window ); + + Dali::Integration::SceneHolder newWindow( window ); + mWindowCreatedSignal.Emit( newWindow ); + } +} + +void Adaptor::RemoveWindow( Internal::Adaptor::SceneHolder* window ) +{ + auto iter = std::find( mWindows.begin(), mWindows.end(), window ); + if( iter != mWindows.end() ) + { + mWindows.erase( iter ); + } +} + Dali::Adaptor::AdaptorSignalType& Adaptor::ResizedSignal() { return mResizedSignal; @@ -247,6 +291,11 @@ Dali::WindowContainer Adaptor::GetWindows() const return mImpl->GetWindows(); } +Dali::SceneHolderList Adaptor::GetSceneHolders() const +{ + return mImpl->GetSceneHolders(); +} + Any Adaptor::GetNativeWindowHandle() { Any window; diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-scene-holder.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-scene-holder.cpp index 953db2c..bfc1315 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-scene-holder.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-scene-holder.cpp @@ -15,36 +15,133 @@ * */ +#include #include +#include + #include #include #include #include +#include +#include + +using AdaptorImpl = Dali::Internal::Adaptor::Adaptor; + namespace Dali { +/////////////////////////////////////////////////////////////////////////////// +// +// Dali::Internal::Adaptor::SceneHolder Stub +// +/////////////////////////////////////////////////////////////////////////////// + namespace Internal { namespace Adaptor { -class SceneHolder: public Dali::BaseObject +SceneHolder::SceneHolder( const Dali::Rect& positionSize ) +: mRenderSurface( positionSize ), + mScene( Dali::Integration::Scene::New( mRenderSurface ) ) +{ +} + +SceneHolder::~SceneHolder() +{ + if ( Dali::Adaptor::IsAvailable() ) + { + AdaptorImpl::GetImpl( AdaptorImpl::Get() ).RemoveWindow( this ); + } +} + +void SceneHolder::Add( Dali::Actor actor ) +{ + mScene.Add( actor ); +} + +void SceneHolder::Remove( Dali::Actor actor ) +{ + mScene.Remove( actor ); +} + +Dali::Layer SceneHolder::GetRootLayer() const { + return mScene.GetRootLayer(); +} -}; +void SceneHolder::SetBackgroundColor( Vector4 color ) +{ + return mScene.SetBackgroundColor( color ); +} + +Vector4 SceneHolder::GetBackgroundColor() const +{ + return mScene.GetBackgroundColor(); +} -} // Adaptor +void SceneHolder::FeedTouchPoint( Dali::TouchPoint& point, int timeStamp ) +{ +} -} // Internal +void SceneHolder::FeedWheelEvent( Dali::WheelEvent& wheelEvent ) +{ +} + +void SceneHolder::FeedKeyEvent( Dali::KeyEvent& keyEvent ) +{ +} + +Dali::Integration::SceneHolder::KeyEventSignalType& SceneHolder::KeyEventSignal() +{ + return mScene.KeyEventSignal(); +} + +Dali::Integration::SceneHolder::KeyEventGeneratedSignalType& SceneHolder::KeyEventGeneratedSignal() +{ + return mScene.KeyEventGeneratedSignal(); +} + +Dali::Integration::SceneHolder::TouchSignalType& SceneHolder::TouchSignal() +{ + return mScene.TouchSignal(); +} + +Dali::Integration::SceneHolder::WheelEventSignalType& SceneHolder::WheelEventSignal() +{ + return mScene.WheelEventSignal(); +} + +Integration::Scene SceneHolder::GetScene() +{ + return mScene; +} + +Integration::RenderSurface& SceneHolder::GetRenderSurface() +{ + return mRenderSurface; +} + +} // namespace Adaptor + +} // namespace Internal + +/////////////////////////////////////////////////////////////////////////////// +// +// Dali::Integration::SceneHolder Stub +// +/////////////////////////////////////////////////////////////////////////////// namespace Integration { SceneHolder::SceneHolder() { + // Dali::Internal::Adaptor::Adaptor::Get().WindowCreatedSignal().Emit( *this ); } SceneHolder::~SceneHolder() @@ -89,30 +186,54 @@ void SceneHolder::Remove( Actor actor ) GetImplementation( *this ).Remove( actor ); } -Layer SceneHolder::GetRootLayer() const +Dali::Layer SceneHolder::GetRootLayer() const { return GetImplementation( *this ).GetRootLayer(); } void SceneHolder::SetBackgroundColor( Vector4 color ) { + GetImplementation( *this ).SetBackgroundColor( color ); } Vector4 SceneHolder::GetBackgroundColor() const { - return Dali::Stage::GetCurrent().GetBackgroundColor(); + return GetImplementation( *this ).GetBackgroundColor(); } void SceneHolder::FeedTouchPoint( Dali::TouchPoint& point, int timeStamp ) { + GetImplementation( *this ).FeedTouchPoint( point, timeStamp ); } void SceneHolder::FeedWheelEvent( Dali::WheelEvent& wheelEvent ) { + GetImplementation( *this ).FeedWheelEvent( wheelEvent ); } void SceneHolder::FeedKeyEvent( Dali::KeyEvent& keyEvent ) { + GetImplementation( *this ).FeedKeyEvent( keyEvent ); +} + +SceneHolder::KeyEventSignalType& SceneHolder::KeyEventSignal() +{ + return GetImplementation( *this ).KeyEventSignal(); +} + +SceneHolder::KeyEventGeneratedSignalType& SceneHolder::KeyEventGeneratedSignal() +{ + return GetImplementation( *this ).KeyEventGeneratedSignal(); +} + +SceneHolder::TouchSignalType& SceneHolder::TouchSignal() +{ + return GetImplementation( *this ).TouchSignal(); +} + +SceneHolder::WheelEventSignalType& SceneHolder::WheelEventSignal() +{ + return GetImplementation( *this ).WheelEventSignal(); } } // Integration diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp index 3620bf9..9849f60 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp @@ -46,26 +46,16 @@ namespace Internal { namespace Adaptor { -class Window : public Dali::BaseObject -{ -public: - - Window( const PositionSize& positionSize ) - : mRenderSurface( positionSize ), - mScene( Dali::Integration::Scene::New( mRenderSurface ) ) - { - } - virtual ~Window() = default; - - static Window* New(const PositionSize& positionSize, const std::string& name, const std::string& className, bool isTransparent) - { - return new Window( positionSize ); - } +Window::Window( const PositionSize& positionSize ) +: SceneHolder( positionSize ) +{ +} - TestRenderSurface mRenderSurface; - Integration::Scene mScene; -}; +Window* Window::New(const PositionSize& positionSize, const std::string& name, const std::string& className, bool isTransparent) +{ + return new Window( positionSize ); +} } // Adaptor } // Internal @@ -111,10 +101,13 @@ Dali::Window Window::New( PositionSize windowPosition, const std::string& name, Dali::Window Window::New(PositionSize windowPosition, const std::string& name, const std::string& className, bool isTransparent ) { Internal::Adaptor::Window* window = Internal::Adaptor::Window::New( windowPosition, name, className, isTransparent ); - Dali::Window newWindow = Window( window ); - Dali::Adaptor::WindowCreatedSignalType& windowCreatedSignal = AdaptorImpl::Get().WindowCreatedSignal(); - windowCreatedSignal.Emit( newWindow ); - return Window( window ); + + Dali::Window result( window ); + + // This will also emit the window created signals + AdaptorImpl::GetImpl( AdaptorImpl::Get() ).AddWindow( window ); + + return result; } Window::Window( Internal::Adaptor::Window* window ) @@ -124,12 +117,12 @@ Window::Window( Internal::Adaptor::Window* window ) Integration::Scene Window::GetScene() { - return GetImplementation( *this ).mScene; + return GetImplementation( *this ).GetScene(); } Integration::RenderSurface& Window::GetRenderSurface() { - return GetImplementation( *this ).mRenderSurface; + return GetImplementation( *this ).GetRenderSurface(); } void Window::Add( Actor actor ) @@ -194,27 +187,27 @@ Window DownCast( BaseHandle handle ) EventProcessingFinishedSignalType& EventProcessingFinishedSignal( Window window ) { - return GetImplementation( window ).mScene.EventProcessingFinishedSignal(); + return GetImplementation( window ).GetScene().EventProcessingFinishedSignal(); } KeyEventSignalType& KeyEventSignal( Window window ) { - return GetImplementation( window ).mScene.KeyEventSignal(); + return GetImplementation( window ).KeyEventSignal(); } KeyEventGeneratedSignalType& KeyEventGeneratedSignal( Window window ) { - return GetImplementation( window ).mScene.KeyEventGeneratedSignal(); + return GetImplementation( window ).KeyEventGeneratedSignal(); } TouchSignalType& TouchSignal( Window window ) { - return GetImplementation( window ).mScene.TouchSignal(); + return GetImplementation( window ).TouchSignal(); } WheelEventSignalType& WheelEventSignal( Window window ) { - return GetImplementation( window ).mScene.WheelEventSignal(); + return GetImplementation( window ).WheelEventSignal(); } } // namespace DevelWindow diff --git a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp index 1a6e9b6..18bd7a0 100644 --- a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp +++ b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -143,23 +142,33 @@ void KeyboardFocusManager::OnAdaptorInit() { if( Adaptor::IsAvailable() ) { - // Retrieve all the existing widnows - Dali::WindowContainer windows = Adaptor::Get().GetWindows(); - for ( auto iter = windows.begin(); iter != windows.end(); ++iter ) + // Retrieve all the existing scene holders + Dali::SceneHolderList sceneHolders = Adaptor::Get().GetSceneHolders(); + for( auto iter = sceneHolders.begin(); iter != sceneHolders.end(); ++iter ) { - DevelWindow::KeyEventSignal( *iter ).Connect( mSlotDelegate, &KeyboardFocusManager::OnKeyEvent); - DevelWindow::TouchSignal( *iter ).Connect( mSlotDelegate, &KeyboardFocusManager::OnTouch); + ( *iter ).KeyEventSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnKeyEvent ); + ( *iter ).TouchSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnTouch ); + Dali::Window window = DevelWindow::DownCast( *iter ); + if( window ) + { + window.FocusChangeSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnWindowFocusChanged); + } } - // Get notified when any new window is created afterwards - Adaptor::Get().WindowCreatedSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnWindowCreated); + // Get notified when any new scene holder is created afterwards + Adaptor::Get().WindowCreatedSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnSceneHolderCreated ); } } -void KeyboardFocusManager::OnWindowCreated( Dali::Window& window ) +void KeyboardFocusManager::OnSceneHolderCreated( Dali::Integration::SceneHolder& sceneHolder ) { - DevelWindow::KeyEventSignal( window ).Connect( mSlotDelegate, &KeyboardFocusManager::OnKeyEvent); - DevelWindow::TouchSignal( window ).Connect( mSlotDelegate, &KeyboardFocusManager::OnTouch); + sceneHolder.KeyEventSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnKeyEvent ); + sceneHolder.TouchSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnTouch ); + Dali::Window window = DevelWindow::DownCast( sceneHolder ); + if( window ) + { + window.FocusChangeSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnWindowFocusChanged); + } } KeyboardFocusManager::~KeyboardFocusManager() diff --git a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.h b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.h index caa0ca9..176bfce 100644 --- a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.h +++ b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.h @@ -31,7 +31,12 @@ namespace Dali { -class Window; +namespace Integration +{ + +class SceneHolder; + +} // namespace Integration namespace Toolkit { @@ -203,10 +208,10 @@ private: void OnAdaptorInit(); /** - * This will be called when a new wndow is created - * @param window The new window + * This will be called when a new scene holder is created + * @param sceneHolder The new scene holder */ - void OnWindowCreated( Dali::Window& window ); + void OnSceneHolderCreated( Dali::Integration::SceneHolder& sceneHolder ); /** * Get configuration from StyleManager. diff --git a/dali-toolkit/internal/focus-manager/keyinput-focus-manager-impl.cpp b/dali-toolkit/internal/focus-manager/keyinput-focus-manager-impl.cpp index 71bc352..57e0d86 100644 --- a/dali-toolkit/internal/focus-manager/keyinput-focus-manager-impl.cpp +++ b/dali-toolkit/internal/focus-manager/keyinput-focus-manager-impl.cpp @@ -23,8 +23,8 @@ #include #include #include -#include #include +#include // INTERNAL INCLUDES #include @@ -53,23 +53,23 @@ KeyInputFocusManager::KeyInputFocusManager() mCurrentFocusControl() { // Retrieve all the existing widnows - Dali::WindowContainer windows = Adaptor::Get().GetWindows(); - for ( auto iter = windows.begin(); iter != windows.end(); ++iter ) + Dali::SceneHolderList sceneHolders = Adaptor::Get().GetSceneHolders(); + for( auto iter = sceneHolders.begin(); iter != sceneHolders.end(); ++iter ) { - DevelWindow::KeyEventGeneratedSignal( *iter ).Connect( mSlotDelegate, &KeyInputFocusManager::OnKeyEvent); + ( *iter ).KeyEventGeneratedSignal().Connect( mSlotDelegate, &KeyInputFocusManager::OnKeyEvent ); } - // Get notified when any new window is created afterwards - Adaptor::Get().WindowCreatedSignal().Connect( mSlotDelegate, &KeyInputFocusManager::OnWindowCreated); + // Get notified when any new scene holder is created afterwards + Adaptor::Get().WindowCreatedSignal().Connect( mSlotDelegate, &KeyInputFocusManager::OnSceneHolderCreated ); } KeyInputFocusManager::~KeyInputFocusManager() { } -void KeyInputFocusManager::OnWindowCreated( Dali::Window& window ) +void KeyInputFocusManager::OnSceneHolderCreated( Dali::Integration::SceneHolder& sceneHolder ) { - DevelWindow::KeyEventGeneratedSignal( window ).Connect( mSlotDelegate, &KeyInputFocusManager::OnKeyEvent); + sceneHolder.KeyEventGeneratedSignal().Connect( mSlotDelegate, &KeyInputFocusManager::OnKeyEvent ); } void KeyInputFocusManager::SetFocus( Toolkit::Control control ) diff --git a/dali-toolkit/internal/focus-manager/keyinput-focus-manager-impl.h b/dali-toolkit/internal/focus-manager/keyinput-focus-manager-impl.h index 0f066c5..ab83e37 100644 --- a/dali-toolkit/internal/focus-manager/keyinput-focus-manager-impl.h +++ b/dali-toolkit/internal/focus-manager/keyinput-focus-manager-impl.h @@ -30,7 +30,12 @@ namespace Dali { -class Window; +namespace Integration +{ + +class SceneHolder; + +} // namespace Integration namespace Toolkit { @@ -93,10 +98,10 @@ protected: private: /** - * This will be called when a new window is created - * @param window The new window + * This will be called when a new scene holder is created + * @param sceneHolder The new scene holder */ - void OnWindowCreated( Dali::Window& window ); + void OnSceneHolderCreated( Dali::Integration::SceneHolder& sceneHolder ); /** * Callback for the key event when no actor in the stage has gained the key input focus -- 2.7.4