From 72c86ab9cedd7d397acca026e1e6b7e659c2a595 Mon Sep 17 00:00:00 2001 From: Wonsik Jung Date: Mon, 30 Sep 2019 19:24:49 +0900 Subject: [PATCH] [Tizen] Fix unParent Bug Fix unParent Bug. When SetParnt and unParent are called, internal Window value is not reset. To fix, the internal window value type is changed the pointer. Change-Id: Ia7db2d7a355ca77a3b05a564ff4c6f09b3e9d5f7 --- dali/internal/window-system/common/window-base.h | 8 +---- dali/internal/window-system/common/window-impl.cpp | 10 +++--- .../ecore-wl/window-base-ecore-wl.cpp | 32 ++++-------------- .../tizen-wayland/ecore-wl/window-base-ecore-wl.h | 7 +--- .../ecore-wl2/window-base-ecore-wl2.cpp | 32 ++++-------------- .../ecore-wl2/window-base-ecore-wl2.h | 7 +--- .../ubuntu-x11/window-base-ecore-x.cpp | 38 ++++------------------ .../window-system/ubuntu-x11/window-base-ecore-x.h | 7 +--- .../window-system/windows/window-base-win.cpp | 7 +--- .../window-system/windows/window-base-win.h | 7 +--- 10 files changed, 29 insertions(+), 126 deletions(-) diff --git a/dali/internal/window-system/common/window-base.h b/dali/internal/window-system/common/window-base.h index a9e340f..2246d6c 100644 --- a/dali/internal/window-system/common/window-base.h +++ b/dali/internal/window-system/common/window-base.h @@ -342,13 +342,7 @@ public: /** * @copydoc Dali::Window::SetParent() */ - virtual void SetParent( Any parent ) = 0; - - /** - * @brief Check whether the window is matched or not. - * @return The result of matched. - */ - virtual bool IsMatchedWindow( Any window ) = 0; + virtual void SetParent( WindowBase* parentWinBase ) = 0; // Signals diff --git a/dali/internal/window-system/common/window-impl.cpp b/dali/internal/window-system/common/window-impl.cpp index fdb01bd..d5f8383 100644 --- a/dali/internal/window-system/common/window-impl.cpp +++ b/dali/internal/window-system/common/window-impl.cpp @@ -731,20 +731,20 @@ void Window::SetParent( Dali::Window& parent ) if ( DALI_UNLIKELY( parent ) ) { mParentWindow = parent; - Dali::Window grandParent = Dali::DevelWindow::GetParent( parent ); + Dali::Window self = Dali::Window( this ); // check circular parent window setting - if ( DALI_UNLIKELY( grandParent ) && mWindowBase->IsMatchedWindow( grandParent.GetNativeHandle() ) ) + if ( Dali::DevelWindow::GetParent( parent ) == self ) { Dali::DevelWindow::Unparent( parent ); } - mWindowBase->SetParent( parent.GetNativeHandle() ); + mWindowBase->SetParent( GetImplementation( mParentWindow ).mWindowBase ); } } void Window::Unparent() { - Any parent; - mWindowBase->SetParent( parent ); + mWindowBase->SetParent( nullptr ); + mParentWindow.Reset(); } Dali::Window Window::GetParent() diff --git a/dali/internal/window-system/tizen-wayland/ecore-wl/window-base-ecore-wl.cpp b/dali/internal/window-system/tizen-wayland/ecore-wl/window-base-ecore-wl.cpp index 0eecbcc..5495b17a 100644 --- a/dali/internal/window-system/tizen-wayland/ecore-wl/window-base-ecore-wl.cpp +++ b/dali/internal/window-system/tizen-wayland/ecore-wl/window-base-ecore-wl.cpp @@ -2153,35 +2153,15 @@ void WindowBaseEcoreWl::CreateWindow( PositionSize positionSize ) } } -void WindowBaseEcoreWl::SetParent( Any parent ) +void WindowBaseEcoreWl::SetParent( WindowBase* parentWinBase ) { - Ecore_Wl_Window* mEcoreParent; - if( parent.Empty() == false ) + Ecore_Wl_Window* ecoreParent = NULL; + if( parentWinBase ) { - // check we have a valid type - DALI_ASSERT_ALWAYS( ( parent.GetType() == typeid (Ecore_Wl_Window *) ) && "Parent's surface type is invalid" ); - mEcoreParent = AnyCast< Ecore_Wl_Window* >( parent ); - } - else - { - mEcoreParent = NULL; - } - ecore_wl_window_parent_set( mEcoreWindow, mEcoreParent ); -} - -bool WindowBaseEcoreWl::IsMatchedWindow( Any window ) -{ - bool ret = false; - if ( window.Empty() == false ) - { - // check we have a valid type - DALI_ASSERT_ALWAYS( ( window.GetType() == typeid (Ecore_Wl_Window *) ) && "Window's surface type is invalid" ); - if ( AnyCast< Ecore_Wl_Window* >( window ) == mEcoreWindow ) - { - ret = true; - } + WindowBaseEcoreWl* winBaseEcore = static_cast( parentWinBase ); + ecoreParent = winBaseEcore->mEcoreWindow; } - return ret; + ecore_wl_window_parent_set( mEcoreWindow, ecoreParent ); } } // namespace Adaptor diff --git a/dali/internal/window-system/tizen-wayland/ecore-wl/window-base-ecore-wl.h b/dali/internal/window-system/tizen-wayland/ecore-wl/window-base-ecore-wl.h index 6965904..de04a33 100644 --- a/dali/internal/window-system/tizen-wayland/ecore-wl/window-base-ecore-wl.h +++ b/dali/internal/window-system/tizen-wayland/ecore-wl/window-base-ecore-wl.h @@ -428,12 +428,7 @@ public: /** * @copydoc Dali::Internal::Adaptor::WindowBase::SetParent() */ - virtual void SetParent( Any parent ) override; - - /** - * @copydoc Dali::Internal::Adaptor::WindowBase::IsMatchedWindow() - */ - virtual bool IsMatchedWindow( Any window ) override; + virtual void SetParent( WindowBase* parentWinBase ) override; private: diff --git a/dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.cpp b/dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.cpp index 1c6a63b..1eee7a8 100755 --- a/dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.cpp +++ b/dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.cpp @@ -2207,35 +2207,15 @@ void WindowBaseEcoreWl2::CreateWindow( PositionSize positionSize ) ecore_wl2_window_type_set( mEcoreWindow, ECORE_WL2_WINDOW_TYPE_TOPLEVEL ); } -void WindowBaseEcoreWl2::SetParent( Any parent ) +void WindowBaseEcoreWl2::SetParent( WindowBase* parentWinBase ) { - Ecore_Wl2_Window* mEcoreParent; - if( parent.Empty() == false ) + Ecore_Wl2_Window* ecoreParent = NULL; + if( parentWinBase ) { - // check we have a valid type - DALI_ASSERT_ALWAYS( ( parent.GetType() == typeid (Ecore_Wl2_Window *) ) && "Parent's surface type is invalid" ); - mEcoreParent = AnyCast< Ecore_Wl2_Window* >( parent ); - } - else - { - mEcoreParent = NULL; - } - ecore_wl2_window_parent_set( mEcoreWindow, mEcoreParent ); -} - -bool WindowBaseEcoreWl2::IsMatchedWindow( Any window ) -{ - bool ret = false; - if ( window.Empty() == false ) - { - // check we have a valid type - DALI_ASSERT_ALWAYS( ( window.GetType() == typeid (Ecore_Wl2_Window *) ) && "Window's surface type is invalid" ); - if ( AnyCast< Ecore_Wl2_Window*>( window ) == mEcoreWindow ) - { - ret = true; - } + WindowBaseEcoreWl2* winBaseEcore2 = static_cast( parentWinBase ); + ecoreParent = winBaseEcore2->mEcoreWindow; } - return ret; + ecore_wl2_window_parent_set( mEcoreWindow, ecoreParent ); } } // namespace Adaptor diff --git a/dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.h b/dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.h index 3d2186f..a9edd4e 100644 --- a/dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.h +++ b/dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.h @@ -433,12 +433,7 @@ public: /** * @copydoc Dali::Internal::Adaptor::WindowBase::SetParent() */ - virtual void SetParent( Any parent ) override; - - /** - * @copydoc Dali::Internal::Adaptor::WindowBase::IsMatchedWindow() - */ - virtual bool IsMatchedWindow( Any window ) override; + virtual void SetParent( WindowBase* parentWinBase ) override; private: diff --git a/dali/internal/window-system/ubuntu-x11/window-base-ecore-x.cpp b/dali/internal/window-system/ubuntu-x11/window-base-ecore-x.cpp index a000b74..be17bdf 100755 --- a/dali/internal/window-system/ubuntu-x11/window-base-ecore-x.cpp +++ b/dali/internal/window-system/ubuntu-x11/window-base-ecore-x.cpp @@ -898,25 +898,14 @@ void WindowBaseEcoreX::CreateWindow( PositionSize positionSize, bool isTranspare } } -void WindowBaseEcoreX::SetParent( Any parent ) +void WindowBaseEcoreX::SetParent( WindowBase* parentWinBase ) { - Ecore_X_Window mEcoreParent; - if ( parent.Empty() == false ) + Ecore_X_Window ecoreParent = 0; + if( parentWinBase ) { - // check we have a valid type - DALI_ASSERT_ALWAYS( ( (parent.GetType() == typeid (Ecore_X_Window) ) ) - && "Surface type is invalid" ); - - if ( parent.GetType() == typeid (Ecore_X_Window) ) - { - mEcoreParent = AnyCast< Ecore_X_Window >( parent ); - ecore_x_icccm_transient_for_set( mEcoreWindow, mEcoreParent ); - } - else - { - mEcoreParent = 0; - ecore_x_icccm_transient_for_unset( mEcoreWindow ); - } + WindowBaseEcoreX* winBaseEcoreX = static_cast( parentWinBase ); + ecoreParent = winBaseEcoreX->mEcoreWindow; + ecore_x_icccm_transient_for_set( mEcoreWindow, ecoreParent ); } else { @@ -925,21 +914,6 @@ void WindowBaseEcoreX::SetParent( Any parent ) } } -bool WindowBaseEcoreX::IsMatchedWindow( Any window ) -{ - bool ret = false; - if ( window.Empty() == false ) - { - // check we have a valid type - DALI_ASSERT_ALWAYS( ( (window.GetType() == typeid (Ecore_X_Window) ) ) && "Surface type is invalid" ); - if ( AnyCast< Ecore_X_Window >( window ) == mEcoreWindow ) - { - ret = true; - } - } - return ret; -} - } // namespace Adaptor } // namespace Internal diff --git a/dali/internal/window-system/ubuntu-x11/window-base-ecore-x.h b/dali/internal/window-system/ubuntu-x11/window-base-ecore-x.h index f6618e7..2d3346f 100644 --- a/dali/internal/window-system/ubuntu-x11/window-base-ecore-x.h +++ b/dali/internal/window-system/ubuntu-x11/window-base-ecore-x.h @@ -362,12 +362,7 @@ public: /** * @copydoc Dali::Internal::Adaptor::WindowBase::SetParent() */ - virtual void SetParent( Any parent ) override; - - /** - * @copydoc Dali::Internal::Adaptor::WindowBase::IsMatchedWindow() - */ - virtual bool IsMatchedWindow( Any window ) override; + virtual void SetParent( WindowBase* parentWinBase ) override; private: diff --git a/dali/internal/window-system/windows/window-base-win.cpp b/dali/internal/window-system/windows/window-base-win.cpp index 7efa8b3..f7b4e6d 100755 --- a/dali/internal/window-system/windows/window-base-win.cpp +++ b/dali/internal/window-system/windows/window-base-win.cpp @@ -560,16 +560,11 @@ void WindowBaseWin::EventEntry( TWinEventInfo *event ) } } -void WindowBaseWin::SetParent( Any parent ) +void WindowBaseWin::SetParent( WindowBase* parentWinBase ) { } -bool WindowBaseWin::IsMatchedWindow( Any window ) -{ - return false; -} - } // namespace Adaptor } // namespace Internal diff --git a/dali/internal/window-system/windows/window-base-win.h b/dali/internal/window-system/windows/window-base-win.h index ea08334..9fdd599 100755 --- a/dali/internal/window-system/windows/window-base-win.h +++ b/dali/internal/window-system/windows/window-base-win.h @@ -350,12 +350,7 @@ public: /** * @copydoc Dali::Internal::Adaptor::WindowBase::SetParent() */ - virtual void SetParent( Any parent ) override; - - /** - * @copydoc Dali::Internal::Adaptor::WindowBase::IsMatchedWindow() - */ - virtual bool IsMatchedWindow( Any window ) override; + virtual void SetParent( WindowBase* parentWinBase ) override; private: -- 2.7.4