X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git;a=blobdiff_plain;f=dali%2Finternal%2Fwindow-system%2Fcommon%2Fwindow-impl.cpp;h=a0fd8098f987ac3fb28bac57a4f5ce13aa5f5d08;hp=95f342b4a93ffa004efb5ce52083ddda4dcd44c4;hb=aecc2d4c642e0cdf360e56accd3e5b96622a707f;hpb=1f5c66d0dc2af7a70e44a92ffa1b2965ead59e57 diff --git a/dali/internal/window-system/common/window-impl.cpp b/dali/internal/window-system/common/window-impl.cpp index 95f342b..a0fd809 100644 --- a/dali/internal/window-system/common/window-impl.cpp +++ b/dali/internal/window-system/common/window-impl.cpp @@ -19,6 +19,7 @@ #include // EXTERNAL HEADERS +#include #include #include #include @@ -29,18 +30,14 @@ #include #include -#ifdef DALI_ADAPTOR_COMPILATION -#include -#else -#include -#endif - // INTERNAL HEADERS +#include #include #include #include #include #include +#include #include #include @@ -60,11 +57,17 @@ Debug::Filter* gWindowLogFilter = Debug::Filter::New( Debug::NoLogging, false, " } // unnamed namespace -Window* Window::New( const PositionSize& positionSize, const std::string& name, const std::string& className, bool isTransparent ) +Window* Window::New(const PositionSize& positionSize, const std::string& name, const std::string& className, bool isTransparent) +{ + Any surface; + return Window::New(surface, positionSize, name, className, isTransparent); +} + +Window* Window::New(Any surface, const PositionSize& positionSize, const std::string& name, const std::string& className, bool isTransparent) { Window* window = new Window(); window->mIsTransparent = isTransparent; - window->Initialize( positionSize, name, className ); + window->Initialize(surface, positionSize, name, className); return window; } @@ -77,28 +80,41 @@ Window::Window() mOpaqueState( false ), mResizeEnabled( false ), mType( Dali::Window::NORMAL ), - mPreferredOrientation( Dali::Window::PORTRAIT ), - mRotationAngle( 0 ), + mParentWindow( NULL ), + mPreferredAngle( Dali::Window::NO_ORIENTATION_PREFERENCE ), + mRotationAngle( -1 ), mWindowWidth( 0 ), mWindowHeight( 0 ), + mOrientationMode( Internal::Adaptor::Window::OrientationMode::PORTRAIT ), + mNativeWindowId( -1 ), mFocusChangedSignal(), mResizedSignal(), - mDeleteRequestSignal() + mDeleteRequestSignal(), + mFocusChangeSignal(), + mResizeSignal(), + mVisibilityChangedSignal(), + mTransitionEffectEventSignal() { } Window::~Window() { + mIsBeingDeleted = true; + + while ( mAdaptor && mAdaptor->IsRenderingWindows() ) + { + std::this_thread::yield(); // to allow other threads to run + } + if ( mEventHandler ) { mEventHandler->RemoveObserver( *this ); } } -void Window::Initialize(const PositionSize& positionSize, const std::string& name, const std::string& className) +void Window::Initialize(Any surface, const PositionSize& positionSize, const std::string& name, const std::string& className) { // Create a window render surface - Any surface; auto renderSurfaceFactory = Dali::Internal::Adaptor::GetRenderSurfaceFactory(); mSurface = renderSurfaceFactory->CreateWindowRenderSurface( positionSize, surface, mIsTransparent ); mWindowSurface = static_cast( mSurface.get() ); @@ -110,6 +126,7 @@ void Window::Initialize(const PositionSize& positionSize, const std::string& nam mWindowBase->IconifyChangedSignal().Connect( this, &Window::OnIconifyChanged ); mWindowBase->FocusChangedSignal().Connect( this, &Window::OnFocusChanged ); mWindowBase->DeleteRequestSignal().Connect( this, &Window::OnDeleteRequest ); + mWindowBase->TransitionEffectEventSignal().Connect( this, &Window::OnTransitionEffectEvent ); mWindowSurface->OutputTransformedSignal().Connect( this, &Window::OnOutputTransformed ); @@ -124,6 +141,20 @@ void Window::Initialize(const PositionSize& positionSize, const std::string& nam mWindowSurface->Map(); mOrientation = Orientation::New( this ); + + // Get OrientationMode + int screenWidth, screenHeight; + WindowSystem::GetScreenSize( screenWidth, screenHeight ); + if( screenWidth > screenHeight ) + { + mOrientationMode = Internal::Adaptor::Window::OrientationMode::LANDSCAPE; + } + else + { + mOrientationMode = Internal::Adaptor::Window::OrientationMode::PORTRAIT; + } + // For Debugging + mNativeWindowId = mWindowBase->GetNativeWindowId(); } void Window::OnAdaptorSet(Dali::Adaptor& adaptor) @@ -164,19 +195,19 @@ std::string Window::GetClassName() const void Window::Raise() { mWindowBase->Raise(); - DALI_LOG_RELEASE_INFO( "Window (%p) Raise() \n", this ); + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Raise() \n", this, mNativeWindowId ); } void Window::Lower() { mWindowBase->Lower(); - DALI_LOG_RELEASE_INFO( "Window (%p) Lower() \n", this ); + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Lower() \n", this, mNativeWindowId ); } void Window::Activate() { mWindowBase->Activate(); - DALI_LOG_RELEASE_INFO( "Window (%p) Activate() \n", this ); + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Activate() \n", this, mNativeWindowId ); } uint32_t Window::GetLayerCount() const @@ -196,69 +227,164 @@ Dali::RenderTaskList Window::GetRenderTaskList() const void Window::AddAvailableOrientation( Dali::Window::WindowOrientation orientation ) { - bool found = false; + if( IsOrientationAvailable( orientation ) == false ) + { + return; + } - if( orientation <= Dali::Window::LANDSCAPE_INVERSE ) + bool found = false; + int convertedAngle = ConvertToAngle( orientation ); + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), AddAvailableOrientation: %d\n", this, mNativeWindowId, convertedAngle ); + for( std::size_t i = 0; i < mAvailableAngles.size(); i++ ) { - for( std::size_t i = 0; i < mAvailableOrientations.size(); i++ ) + if( mAvailableAngles[i] == convertedAngle ) { - if( mAvailableOrientations[i] == orientation ) - { - found = true; - break; - } + found = true; + break; } + } - if( !found ) - { - mAvailableOrientations.push_back( orientation ); - SetAvailableOrientations( mAvailableOrientations ); - } + if( !found ) + { + mAvailableAngles.push_back( convertedAngle ); + SetAvailableAnlges( mAvailableAngles ); } } void Window::RemoveAvailableOrientation( Dali::Window::WindowOrientation orientation ) { - for( std::vector::iterator iter = mAvailableOrientations.begin(); - iter != mAvailableOrientations.end(); ++iter ) + if( IsOrientationAvailable( orientation ) == false ) + { + return; + } + + int convertedAngle = ConvertToAngle( orientation ); + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), RemoveAvailableOrientation: %d\n", this, mNativeWindowId, convertedAngle ); + for( std::vector< int >::iterator iter = mAvailableAngles.begin(); + iter != mAvailableAngles.end(); ++iter ) { - if( *iter == orientation ) + if( *iter == convertedAngle ) { - mAvailableOrientations.erase( iter ); + mAvailableAngles.erase( iter ); break; } } - SetAvailableOrientations( mAvailableOrientations ); + + SetAvailableAnlges( mAvailableAngles ); } -void Window::SetAvailableOrientations( const std::vector< Dali::Window::WindowOrientation >& orientations ) +void Window::SetPreferredOrientation( Dali::Window::WindowOrientation orientation ) { - if( orientations.size() > 4 ) + if( orientation < Dali::Window::NO_ORIENTATION_PREFERENCE || orientation > Dali::Window::LANDSCAPE_INVERSE ) { - DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetAvailableOrientations: Invalid vector size! [%d]\n", orientations.size() ); + DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::CheckOrientation: Invalid input orientation [%d]\n", orientation ); return; } + mPreferredAngle = ConvertToAngle( orientation ); + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), SetPreferredOrientation: %d\n", this, mNativeWindowId, mPreferredAngle ); + mWindowBase->SetPreferredAngle( mPreferredAngle ); +} - mAvailableOrientations = orientations; - - mWindowBase->SetAvailableOrientations( mAvailableOrientations ); +Dali::Window::WindowOrientation Window::GetPreferredOrientation() +{ + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), GetPreferredOrientation: %d\n", this, mNativeWindowId, mPreferredAngle ); + Dali::Window::WindowOrientation preferredOrientation = ConvertToOrientation( mPreferredAngle ); + return preferredOrientation; } -const std::vector< Dali::Window::WindowOrientation >& Window::GetAvailableOrientations() +void Window::SetAvailableAnlges( const std::vector< int >& angles ) { - return mAvailableOrientations; + if( angles.size() > 4 ) + { + DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetAvailableAnlges: Invalid vector size! [%d]\n", angles.size() ); + return; + } + + mWindowBase->SetAvailableAnlges( angles ); } -void Window::SetPreferredOrientation( Dali::Window::WindowOrientation orientation ) +int Window::ConvertToAngle( Dali::Window::WindowOrientation orientation ) { - mPreferredOrientation = orientation; + int convertAngle = static_cast< int >( orientation ); + if( mOrientationMode == Internal::Adaptor::Window::OrientationMode::LANDSCAPE ) + { + switch( orientation ) + { + case Dali::Window::LANDSCAPE: + { + convertAngle = 0; + break; + } + case Dali::Window::PORTRAIT: + { + convertAngle = 90; + break; + } + case Dali::Window::LANDSCAPE_INVERSE: + { + convertAngle = 180; + break; + } + case Dali::Window::PORTRAIT_INVERSE: + { + convertAngle = 270; + break; + } + case Dali::Window::NO_ORIENTATION_PREFERENCE: + { + convertAngle = -1; + break; + } + } + } + return convertAngle; +} - mWindowBase->SetPreferredOrientation( mPreferredOrientation ); +Dali::Window::WindowOrientation Window::ConvertToOrientation( int angle ) const +{ + Dali::Window::WindowOrientation orientation = static_cast< Dali::Window::WindowOrientation >( angle ); + if( mOrientationMode == Internal::Adaptor::Window::OrientationMode::LANDSCAPE ) + { + switch( angle ) + { + case 0: + { + orientation = Dali::Window::LANDSCAPE; + break; + } + case 90: + { + orientation = Dali::Window::PORTRAIT; + break; + } + case 180: + { + orientation = Dali::Window::LANDSCAPE_INVERSE; + break; + } + case 270: + { + orientation = Dali::Window::PORTRAIT_INVERSE; + break; + } + case -1: + { + orientation = Dali::Window::NO_ORIENTATION_PREFERENCE; + break; + } + } + } + return orientation; } -Dali::Window::WindowOrientation Window::GetPreferredOrientation() +bool Window::IsOrientationAvailable( Dali::Window::WindowOrientation orientation ) const { - return mPreferredOrientation; + if( orientation <= Dali::Window::NO_ORIENTATION_PREFERENCE || orientation > Dali::Window::LANDSCAPE_INVERSE ) + { + DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::IsOrientationAvailable: Invalid input orientation [%d]\n", orientation ); + return false; + } + return true; } Dali::Any Window::GetNativeHandle() const @@ -288,9 +414,12 @@ void Window::Show() { WindowVisibilityObserver* observer( mAdaptor ); observer->OnWindowShown(); + + Dali::Window handle( this ); + mVisibilityChangedSignal.Emit( handle, true ); } - DALI_LOG_RELEASE_INFO( "Window (%p) Show(): iconified = %d\n", this, mIconified ); + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Show(): iconified = %d, visible = %d\n", this, mNativeWindowId, mIconified, mVisible ); } void Window::Hide() @@ -303,13 +432,17 @@ void Window::Hide() { WindowVisibilityObserver* observer( mAdaptor ); observer->OnWindowHidden(); + + Dali::Window handle( this ); + mVisibilityChangedSignal.Emit( handle, false ); } - DALI_LOG_RELEASE_INFO( "Window (%p) Hide(): iconified = %d\n", this, mIconified ); + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Hide(): iconified = %d, visible = %d\n", this, mNativeWindowId, mIconified, mVisible ); } bool Window::IsVisible() const { + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), IsVisible(): iconified = %d, visible = %d\n", this, mNativeWindowId, mIconified, mVisible ); return mVisible && !mIconified; } @@ -455,7 +588,11 @@ void Window::SetSize( Dali::Window::WindowSize size ) mAdaptor->SurfaceResizePrepare( mSurface.get(), newSize ); + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), SetSize(): resize signal [%d x %d]\n", this, mNativeWindowId, newRect.width, newRect.height ); + + Dali::Window handle( this ); mResizedSignal.Emit( newSize ); + mResizeSignal.Emit( handle, newSize ); mAdaptor->SurfaceResizeComplete( mSurface.get(), newSize ); } @@ -507,10 +644,14 @@ void Window::SetPositionSize( PositionSize positionSize ) { Uint16Pair newSize( newRect.width, newRect.height ); + SurfaceResized(); + mAdaptor->SurfaceResizePrepare( mSurface.get(), newSize ); + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), SetPositionSize():resize signal [%d x %d]\n", this, mNativeWindowId, newRect.width, newRect.height ); + Dali::Window handle( this ); mResizedSignal.Emit( newSize ); - + mResizeSignal.Emit( handle, newSize ); mAdaptor->SurfaceResizeComplete( mSurface.get(), newSize ); } } @@ -555,9 +696,12 @@ void Window::OnIconifyChanged( bool iconified ) { WindowVisibilityObserver* observer( mAdaptor ); observer->OnWindowHidden(); + + Dali::Window handle( this ); + mVisibilityChangedSignal.Emit( handle, false ); } - DALI_LOG_RELEASE_INFO( "Window (%p) Iconified: visible = %d\n", this, mVisible ); + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Iconified: visible = %d\n", this, mNativeWindowId, mVisible ); } else { @@ -567,20 +711,26 @@ void Window::OnIconifyChanged( bool iconified ) { WindowVisibilityObserver* observer( mAdaptor ); observer->OnWindowShown(); + + Dali::Window handle( this ); + mVisibilityChangedSignal.Emit( handle, true ); } - DALI_LOG_RELEASE_INFO( "Window (%p) Deiconified: visible = %d\n", this, mVisible ); + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Deiconified: visible = %d\n", this, mNativeWindowId, mVisible ); } } void Window::OnFocusChanged( bool focusIn ) { + Dali::Window handle( this ); mFocusChangedSignal.Emit( focusIn ); + mFocusChangeSignal.Emit( handle, focusIn ); } void Window::OnOutputTransformed() { PositionSize positionSize = mSurface->GetPositionSize(); + SurfaceResized(); mAdaptor->SurfaceResizePrepare( mSurface.get(), Adaptor::SurfaceSize( positionSize.width, positionSize.height ) ); mAdaptor->SurfaceResizeComplete( mSurface.get(), Adaptor::SurfaceSize( positionSize.width, positionSize.height ) ); } @@ -590,6 +740,12 @@ void Window::OnDeleteRequest() mDeleteRequestSignal.Emit(); } +void Window::OnTransitionEffectEvent( DevelWindow::EffectState state, DevelWindow::EffectType type ) +{ + Dali::Window handle( this ); + mTransitionEffectEventSignal.Emit( handle, state, type ); +} + void Window::OnTouchPoint( Dali::Integration::Point& point, int timeStamp ) { FeedTouchPoint( point, timeStamp ); @@ -616,12 +772,17 @@ void Window::OnRotation( const RotationEvent& rotation ) mWindowSurface->RequestRotation( mRotationAngle, mWindowWidth, mWindowHeight ); - mAdaptor->SurfaceResizePrepare( mSurface.get(), Adaptor::SurfaceSize( mRotationAngle, mWindowHeight ) ); + SurfaceResized(); + + mAdaptor->SurfaceResizePrepare( mSurface.get(), Adaptor::SurfaceSize( mWindowWidth, mWindowHeight ) ); + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), OnRotation(): resize signal emit [%d x %d]\n", this, mNativeWindowId, mWindowWidth, mWindowHeight ); // Emit signal - mResizedSignal.Emit( Dali::Window::WindowSize( mRotationAngle, mWindowHeight ) ); + Dali::Window handle( this ); + mResizedSignal.Emit( Dali::Window::WindowSize( mWindowWidth, mWindowHeight ) ); + mResizeSignal.Emit( handle, Dali::Window::WindowSize( mWindowWidth, mWindowHeight ) ); - mAdaptor->SurfaceResizeComplete( mSurface.get(), Adaptor::SurfaceSize( mRotationAngle, mWindowHeight ) ); + mAdaptor->SurfaceResizeComplete( mSurface.get(), Adaptor::SurfaceSize( mWindowWidth, mWindowHeight ) ); } void Window::OnPause() @@ -682,10 +843,78 @@ Dali::Window Window::Get( Dali::Actor actor ) if ( Internal::Adaptor::Adaptor::IsAvailable() ) { Dali::Internal::Adaptor::Adaptor& adaptor = Internal::Adaptor::Adaptor::GetImplementation( Internal::Adaptor::Adaptor::Get() ); - windowImpl = static_cast( adaptor.GetWindow( actor ) ); + windowImpl = dynamic_cast( adaptor.GetWindow( actor ) ); + if( windowImpl ) + { + return Dali::Window( windowImpl ); + } } - return Dali::Window( windowImpl ); + return Dali::Window(); +} + +void Window::SetParent( Dali::Window& parent ) +{ + if ( DALI_UNLIKELY( parent ) ) + { + mParentWindow = parent; + Dali::Window self = Dali::Window( this ); + // check circular parent window setting + if ( Dali::DevelWindow::GetParent( parent ) == self ) + { + Dali::DevelWindow::Unparent( parent ); + } + mWindowBase->SetParent( GetImplementation( mParentWindow ).mWindowBase ); + } +} + +void Window::Unparent() +{ + mWindowBase->SetParent( nullptr ); + mParentWindow.Reset(); +} + +Dali::Window Window::GetParent() +{ + return mParentWindow; +} + +Dali::Window::WindowOrientation Window::GetCurrentOrientation() const +{ + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), GetCurrentOrientation(): %d\n", this, mNativeWindowId, mRotationAngle ); + return ConvertToOrientation( mRotationAngle ); +} + +void Window::SetAvailableOrientations( const Dali::Vector& orientations ) +{ + Dali::Vector::SizeType count = orientations.Count(); + for( Dali::Vector::SizeType index = 0; index < count; ++index ) + { + if( IsOrientationAvailable( orientations[index] ) == false ) + { + DALI_LOG_ERROR("Window::SetAvailableOrientations, invalid orientation: %d\n", orientations[index]); + continue; + } + + bool found = false; + int convertedAngle = ConvertToAngle( orientations[index] ); + + for( std::size_t i = 0; i < mAvailableAngles.size(); i++ ) + { + if( mAvailableAngles[i] == convertedAngle ) + { + found = true; + break; + } + } + + if( !found ) + { + DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), SetAvailableOrientations: %d\n", this, mNativeWindowId, convertedAngle ); + mAvailableAngles.push_back( convertedAngle ); + } + } + SetAvailableAnlges( mAvailableAngles ); } } // Adaptor