From 0e4caa74f44f5aa507610f16243b1e6aaa4421a8 Mon Sep 17 00:00:00 2001 From: Jiyun Yang Date: Mon, 14 Oct 2019 15:19:45 +0900 Subject: [PATCH] Revert "[Tizen] Fix unParent Bug" This reverts commit 31f6d14ee31aef11403280f9d5ea5eadac933210. --- 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, 126 insertions(+), 29 deletions(-) diff --git a/dali/internal/window-system/common/window-base.h b/dali/internal/window-system/common/window-base.h index 2246d6c..a9e340f 100644 --- a/dali/internal/window-system/common/window-base.h +++ b/dali/internal/window-system/common/window-base.h @@ -342,7 +342,13 @@ public: /** * @copydoc Dali::Window::SetParent() */ - virtual void SetParent( WindowBase* parentWinBase ) = 0; + 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; // Signals diff --git a/dali/internal/window-system/common/window-impl.cpp b/dali/internal/window-system/common/window-impl.cpp index d5f8383..fdb01bd 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 self = Dali::Window( this ); + Dali::Window grandParent = Dali::DevelWindow::GetParent( parent ); // check circular parent window setting - if ( Dali::DevelWindow::GetParent( parent ) == self ) + if ( DALI_UNLIKELY( grandParent ) && mWindowBase->IsMatchedWindow( grandParent.GetNativeHandle() ) ) { Dali::DevelWindow::Unparent( parent ); } - mWindowBase->SetParent( GetImplementation( mParentWindow ).mWindowBase ); + mWindowBase->SetParent( parent.GetNativeHandle() ); } } void Window::Unparent() { - mWindowBase->SetParent( nullptr ); - mParentWindow.Reset(); + Any parent; + mWindowBase->SetParent( parent ); } 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 5495b17a..0eecbcc 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,15 +2153,35 @@ void WindowBaseEcoreWl::CreateWindow( PositionSize positionSize ) } } -void WindowBaseEcoreWl::SetParent( WindowBase* parentWinBase ) +void WindowBaseEcoreWl::SetParent( Any parent ) { - Ecore_Wl_Window* ecoreParent = NULL; - if( parentWinBase ) + Ecore_Wl_Window* mEcoreParent; + if( parent.Empty() == false ) { - WindowBaseEcoreWl* winBaseEcore = static_cast( parentWinBase ); - ecoreParent = winBaseEcore->mEcoreWindow; + // 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; + } } - ecore_wl_window_parent_set( mEcoreWindow, ecoreParent ); + return ret; } } // 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 de04a33..6965904 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,7 +428,12 @@ public: /** * @copydoc Dali::Internal::Adaptor::WindowBase::SetParent() */ - virtual void SetParent( WindowBase* parentWinBase ) override; + virtual void SetParent( Any parent ) override; + + /** + * @copydoc Dali::Internal::Adaptor::WindowBase::IsMatchedWindow() + */ + virtual bool IsMatchedWindow( Any window ) 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 1eee7a8..1c6a63b 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,15 +2207,35 @@ void WindowBaseEcoreWl2::CreateWindow( PositionSize positionSize ) ecore_wl2_window_type_set( mEcoreWindow, ECORE_WL2_WINDOW_TYPE_TOPLEVEL ); } -void WindowBaseEcoreWl2::SetParent( WindowBase* parentWinBase ) +void WindowBaseEcoreWl2::SetParent( Any parent ) { - Ecore_Wl2_Window* ecoreParent = NULL; - if( parentWinBase ) + Ecore_Wl2_Window* mEcoreParent; + if( parent.Empty() == false ) { - WindowBaseEcoreWl2* winBaseEcore2 = static_cast( parentWinBase ); - ecoreParent = winBaseEcore2->mEcoreWindow; + // 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; + } } - ecore_wl2_window_parent_set( mEcoreWindow, ecoreParent ); + return ret; } } // 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 a9edd4e..3d2186f 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,7 +433,12 @@ public: /** * @copydoc Dali::Internal::Adaptor::WindowBase::SetParent() */ - virtual void SetParent( WindowBase* parentWinBase ) override; + virtual void SetParent( Any parent ) override; + + /** + * @copydoc Dali::Internal::Adaptor::WindowBase::IsMatchedWindow() + */ + virtual bool IsMatchedWindow( Any window ) 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 be17bdf..a000b74 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,14 +898,25 @@ void WindowBaseEcoreX::CreateWindow( PositionSize positionSize, bool isTranspare } } -void WindowBaseEcoreX::SetParent( WindowBase* parentWinBase ) +void WindowBaseEcoreX::SetParent( Any parent ) { - Ecore_X_Window ecoreParent = 0; - if( parentWinBase ) + Ecore_X_Window mEcoreParent; + if ( parent.Empty() == false ) { - WindowBaseEcoreX* winBaseEcoreX = static_cast( parentWinBase ); - ecoreParent = winBaseEcoreX->mEcoreWindow; - ecore_x_icccm_transient_for_set( mEcoreWindow, ecoreParent ); + // 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 ); + } } else { @@ -914,6 +925,21 @@ void WindowBaseEcoreX::SetParent( WindowBase* parentWinBase ) } } +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 2d3346f..f6618e7 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,7 +362,12 @@ public: /** * @copydoc Dali::Internal::Adaptor::WindowBase::SetParent() */ - virtual void SetParent( WindowBase* parentWinBase ) override; + virtual void SetParent( Any parent ) override; + + /** + * @copydoc Dali::Internal::Adaptor::WindowBase::IsMatchedWindow() + */ + virtual bool IsMatchedWindow( Any window ) 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 f7b4e6d..7efa8b3 100755 --- a/dali/internal/window-system/windows/window-base-win.cpp +++ b/dali/internal/window-system/windows/window-base-win.cpp @@ -560,11 +560,16 @@ void WindowBaseWin::EventEntry( TWinEventInfo *event ) } } -void WindowBaseWin::SetParent( WindowBase* parentWinBase ) +void WindowBaseWin::SetParent( Any parent ) { } +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 9fdd599..ea08334 100755 --- a/dali/internal/window-system/windows/window-base-win.h +++ b/dali/internal/window-system/windows/window-base-win.h @@ -350,7 +350,12 @@ public: /** * @copydoc Dali::Internal::Adaptor::WindowBase::SetParent() */ - virtual void SetParent( WindowBase* parentWinBase ) override; + virtual void SetParent( Any parent ) override; + + /** + * @copydoc Dali::Internal::Adaptor::WindowBase::IsMatchedWindow() + */ + virtual bool IsMatchedWindow( Any window ) override; private: -- 2.7.4