X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fwindow-system%2Fcommon%2Fwindow-impl.cpp;h=948316470aca1634d14f47d60b4b289d09d9ee34;hb=91206d4971cc0c9b486b4b29b7f3157326bbd7aa;hp=4e414ba6fb387b8c731944971977e90b1052f736;hpb=9a47e13e398225b2ca76a1958f7701e3b7662848;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/window-system/common/window-impl.cpp b/dali/internal/window-system/common/window-impl.cpp index 4e414ba6..9483164 100644 --- a/dali/internal/window-system/common/window-impl.cpp +++ b/dali/internal/window-system/common/window-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2019 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. @@ -20,19 +20,29 @@ // EXTERNAL HEADERS #include -#include +#include +#include +#include #include #include +#include #include +#include + +#ifdef DALI_ADAPTOR_COMPILATION +#include +#else +#include +#endif // INTERNAL HEADERS -#include -#include +#include #include #include #include #include #include +#include namespace Dali { @@ -59,27 +69,18 @@ Window* Window::New( const PositionSize& positionSize, const std::string& name, } Window::Window() -: mSurface( NULL ), +: mWindowSurface( nullptr ), mWindowBase(), - mIndicatorVisible( Dali::Window::INVISIBLE ), // TODO: Enable this after indicator implementation based on tizen 5. - mIndicatorIsShown( false ), - mShowRotatedIndicatorOnClose( false ), - mStarted( false ), mIsTransparent( false ), mIsFocusAcceptable( true ), - mVisible( true ), mIconified( false ), mOpaqueState( false ), mResizeEnabled( false ), - mIndicator(), - mIndicatorOrientation( Dali::Window::PORTRAIT ), - mNextIndicatorOrientation( Dali::Window::PORTRAIT ), - mIndicatorOpacityMode( Dali::Window::OPAQUE ), - mOverlay( NULL ), - mAdaptor( NULL ), mType( Dali::Window::NORMAL ), mPreferredOrientation( Dali::Window::PORTRAIT ), - mIndicatorVisibilityChangedSignal(), + mRotationAngle( 0 ), + mWindowWidth( 0 ), + mWindowHeight( 0 ), mFocusChangedSignal(), mResizedSignal(), mDeleteRequestSignal() @@ -88,23 +89,10 @@ Window::Window() Window::~Window() { - if( mIndicator ) - { - mOverlay->Remove( mIndicator->GetActor() ); - Dali::RenderTaskList taskList = mOverlay->GetOverlayRenderTasks(); - Dali::RenderTask indicatorTask = taskList.GetTask(0); - mOverlay->GetOverlayRenderTasks().RemoveTask(indicatorTask); - mIndicator->Close(); - } - - if ( mAdaptor ) + if ( mEventHandler ) { - mAdaptor->RemoveObserver( *this ); - mAdaptor->SetDragAndDropDetector( NULL ); - mAdaptor = NULL; + mEventHandler->RemoveObserver( *this ); } - - delete mSurface; } void Window::Initialize(const PositionSize& positionSize, const std::string& name, const std::string& className) @@ -112,19 +100,18 @@ void Window::Initialize(const PositionSize& positionSize, const std::string& nam // Create a window render surface Any surface; auto renderSurfaceFactory = Dali::Internal::Adaptor::GetRenderSurfaceFactory(); - auto windowRenderSurface = renderSurfaceFactory->CreateWindowRenderSurface( positionSize, surface, mIsTransparent ); - mSurface = windowRenderSurface.release(); + mSurface = renderSurfaceFactory->CreateWindowRenderSurface( positionSize, surface, mIsTransparent ); + mWindowSurface = static_cast( mSurface.get() ); // Get a window base - mWindowBase = mSurface->GetWindowBase(); + mWindowBase = mWindowSurface->GetWindowBase(); // Connect signals mWindowBase->IconifyChangedSignal().Connect( this, &Window::OnIconifyChanged ); mWindowBase->FocusChangedSignal().Connect( this, &Window::OnFocusChanged ); mWindowBase->DeleteRequestSignal().Connect( this, &Window::OnDeleteRequest ); - mWindowBase->IndicatorFlickedSignal().Connect( this, &Window::OnIndicatorFlicked ); - mSurface->OutputTransformedSignal().Connect( this, &Window::OnOutputTransformed ); + mWindowSurface->OutputTransformedSignal().Connect( this, &Window::OnOutputTransformed ); if( !positionSize.IsEmpty() ) { @@ -134,98 +121,77 @@ void Window::Initialize(const PositionSize& positionSize, const std::string& nam SetClass( name, className ); - mSurface->Map(); + mWindowSurface->Map(); mOrientation = Orientation::New( this ); } -void Window::SetAdaptor(Dali::Adaptor& adaptor) +void Window::OnAdaptorSet(Dali::Adaptor& adaptor) { - DALI_ASSERT_ALWAYS( !mStarted && "Adaptor already started" ); - mStarted = true; - - // Only create one overlay per window - Internal::Adaptor::Adaptor& adaptorImpl = Internal::Adaptor::Adaptor::GetImplementation(adaptor); - Integration::Core& core = adaptorImpl.GetCore(); - mOverlay = &core.GetSystemOverlay(); - - Dali::RenderTaskList taskList = mOverlay->GetOverlayRenderTasks(); - taskList.CreateTask(); - - mAdaptor = &adaptorImpl; - mAdaptor->AddObserver( *this ); - - // Can only create the detector when we know the Core has been instantiated. - mDragAndDropDetector = DragAndDropDetector::New(); - mAdaptor->SetDragAndDropDetector( &GetImplementation( mDragAndDropDetector ) ); - - if( mOrientation ) - { - mOrientation->SetAdaptor(adaptor); - } - - if( mIndicator != NULL ) - { - mIndicator->SetAdaptor(mAdaptor); - } + mEventHandler = EventHandlerPtr(new EventHandler( mWindowSurface, *mAdaptor ) ); + mEventHandler->AddObserver( *this ); } -WindowRenderSurface* Window::GetSurface() +void Window::OnSurfaceSet( Dali::RenderSurfaceInterface* surface ) { - return mSurface; + mWindowSurface = static_cast( surface ); } void Window::ShowIndicator( Dali::Window::IndicatorVisibleMode visibleMode ) { - // TODO: Enable this after indicator implementation based on tizen 5. -// mIndicatorVisible = visibleMode; - - mWindowBase->ShowIndicator( mIndicatorVisible, mIndicatorOpacityMode ); - - DoShowIndicator( mIndicatorOrientation ); } void Window::SetIndicatorBgOpacity( Dali::Window::IndicatorBgOpacity opacityMode ) { - mIndicatorOpacityMode = opacityMode; - - if( mIndicator != NULL ) - { - mIndicator->SetOpacityMode( opacityMode ); - } -} - -void Window::SetIndicatorVisibleMode( Dali::Window::IndicatorVisibleMode mode ) -{ - // TODO: Enable this after indicator implementation based on tizen 5. -// mIndicatorVisible = mode; } void Window::RotateIndicator( Dali::Window::WindowOrientation orientation ) { - DALI_LOG_TRACE_METHOD_FMT( gWindowLogFilter, "Orientation: %d\n", orientation ); - - DoRotateIndicator( orientation ); } void Window::SetClass( std::string name, std::string className ) { + mName = name; + mClassName = className; mWindowBase->SetClass( name, className ); } +std::string Window::GetClassName() const +{ + return mClassName; +} + void Window::Raise() { mWindowBase->Raise(); + DALI_LOG_RELEASE_INFO( "Window (%p) Raise() \n", this ); } void Window::Lower() { mWindowBase->Lower(); + DALI_LOG_RELEASE_INFO( "Window (%p) Lower() \n", this ); } void Window::Activate() { mWindowBase->Activate(); + DALI_LOG_RELEASE_INFO( "Window (%p) Activate() \n", this ); +} + +uint32_t Window::GetLayerCount() const +{ + return mScene.GetLayerCount(); +} + +Dali::Layer Window::GetLayer( uint32_t depth ) const +{ + return mScene.GetLayer( depth ); +} + +Dali::RenderTaskList Window::GetRenderTaskList() const +{ + return mScene.GetRenderTaskList(); } void Window::AddAvailableOrientation( Dali::Window::WindowOrientation orientation ) @@ -295,14 +261,9 @@ Dali::Window::WindowOrientation Window::GetPreferredOrientation() return mPreferredOrientation; } -Dali::DragAndDropDetector Window::GetDragAndDropDetector() const -{ - return mDragAndDropDetector; -} - Dali::Any Window::GetNativeHandle() const { - return mSurface->GetNativeWindow(); + return mWindowSurface->GetNativeWindow(); } void Window::SetAcceptFocus( bool accept ) @@ -327,8 +288,9 @@ void Window::Show() { WindowVisibilityObserver* observer( mAdaptor ); observer->OnWindowShown(); - DALI_LOG_RELEASE_INFO( "Window (%p) ::Show()\n", this ); } + + DALI_LOG_RELEASE_INFO( "Window (%p) Show(): iconified = %d\n", this, mIconified ); } void Window::Hide() @@ -341,13 +303,14 @@ void Window::Hide() { WindowVisibilityObserver* observer( mAdaptor ); observer->OnWindowHidden(); - DALI_LOG_RELEASE_INFO( "Window (%p) ::Hide() \n", this ); } + + DALI_LOG_RELEASE_INFO( "Window (%p) Hide(): iconified = %d\n", this, mIconified ); } bool Window::IsVisible() const { - return mVisible; + return mVisible && !mIconified; } unsigned int Window::GetSupportedAuxiliaryHintCount() const @@ -477,21 +440,24 @@ void Window::SetSize( Dali::Window::WindowSize size ) mResizeEnabled = true; } - PositionSize positionSize = mSurface->GetPositionSize(); + PositionSize oldRect = mSurface->GetPositionSize(); + + mWindowSurface->MoveResize( PositionSize( oldRect.x, oldRect.y, size.GetWidth(), size.GetHeight() ) ); + + PositionSize newRect = mSurface->GetPositionSize(); - if( positionSize.width != size.GetWidth() || positionSize.height != size.GetHeight() ) + // When surface size is updated, inform adaptor of resizing and emit ResizeSignal + if( ( oldRect.width != newRect.width ) || ( oldRect.height != newRect.height ) ) { - positionSize.width = size.GetWidth(); - positionSize.height = size.GetHeight(); + Uint16Pair newSize( newRect.width, newRect.height ); - mSurface->MoveResize( positionSize ); + SurfaceResized(); - mAdaptor->SurfaceResizePrepare( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) ); + mAdaptor->SurfaceResizePrepare( mSurface.get(), newSize ); - // Emit signal - mResizedSignal.Emit( Dali::Window::WindowSize( positionSize.width, positionSize.height ) ); + mResizedSignal.Emit( newSize ); - mAdaptor->SurfaceResizeComplete( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) ); + mAdaptor->SurfaceResizeComplete( mSurface.get(), newSize ); } } @@ -510,15 +476,9 @@ void Window::SetPosition( Dali::Window::WindowPosition position ) mResizeEnabled = true; } - PositionSize positionSize = mSurface->GetPositionSize(); - - if( positionSize.x != position.GetX() || positionSize.y != position.GetY() ) - { - positionSize.x = position.GetX(); - positionSize.y = position.GetY(); + PositionSize oldRect = mSurface->GetPositionSize(); - mSurface->MoveResize( positionSize ); - } + mWindowSurface->MoveResize( PositionSize( position.GetX(), position.GetY(), oldRect.width, oldRect.height ) ); } Dali::Window::WindowPosition Window::GetPosition() const @@ -528,141 +488,63 @@ Dali::Window::WindowPosition Window::GetPosition() const return Dali::Window::WindowPosition( positionSize.x, positionSize.y ); } -void Window::SetTransparency( bool transparent ) +void Window::SetPositionSize( PositionSize positionSize ) { - mSurface->SetTransparency( transparent ); -} + if( !mResizeEnabled ) + { + AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" ); + mResizeEnabled = true; + } -bool Window::GrabKey( Dali::KEY key, KeyGrab::KeyGrabMode grabMode ) -{ - return mWindowBase->GrabKey( key, grabMode ); -} + PositionSize oldRect = mSurface->GetPositionSize(); -bool Window::UngrabKey( Dali::KEY key ) -{ - return mWindowBase->UngrabKey( key ); -} + mWindowSurface->MoveResize( positionSize ); -bool Window::GrabKeyList( const Dali::Vector< Dali::KEY >& key, const Dali::Vector< KeyGrab::KeyGrabMode >& grabMode, Dali::Vector< bool >& result ) -{ - return mWindowBase->GrabKeyList( key, grabMode, result ); -} + PositionSize newRect = mSurface->GetPositionSize(); -bool Window::UngrabKeyList( const Dali::Vector< Dali::KEY >& key, Dali::Vector< bool >& result ) -{ - return mWindowBase->UngrabKeyList( key, result ); -} + // When surface size is updated, inform adaptor of resizing and emit ResizeSignal + if( ( oldRect.width != newRect.width ) || ( oldRect.height != newRect.height ) ) + { + Uint16Pair newSize( newRect.width, newRect.height ); -void Window::RotationDone( int orientation, int width, int height ) -{ - mSurface->RequestRotation( orientation, width, height ); + SurfaceResized(); - mAdaptor->SurfaceResizePrepare( Adaptor::SurfaceSize( width, height ) ); + mAdaptor->SurfaceResizePrepare( mSurface.get(), newSize ); - // Emit signal - mResizedSignal.Emit( Dali::Window::WindowSize( width, height ) ); + mResizedSignal.Emit( newSize ); - mAdaptor->SurfaceResizeComplete( Adaptor::SurfaceSize( width, height ) ); + mAdaptor->SurfaceResizeComplete( mSurface.get(), newSize ); + } } -void Window::DoShowIndicator( Dali::Window::WindowOrientation lastOrientation ) +Dali::Layer Window::GetRootLayer() const { - if( mIndicator == NULL ) - { - if( mIndicatorVisible != Dali::Window::INVISIBLE ) - { - auto windowFactory = Dali::Internal::Adaptor::GetWindowFactory(); - mIndicator = windowFactory->CreateIndicator( mAdaptor, mIndicatorOrientation, this ); - if( mIndicator ) - { - mIndicator->SetOpacityMode( mIndicatorOpacityMode ); - Dali::Actor actor = mIndicator->GetActor(); - SetIndicatorActorRotation(); - mOverlay->Add(actor); - } - } - // else don't create a hidden indicator - } - else // Already have indicator - { - if( mIndicatorVisible == Dali::Window::VISIBLE ) - { - // If we are resuming, and rotation has changed, - if( mIndicatorIsShown == false && mIndicatorOrientation != mNextIndicatorOrientation ) - { - // then close current indicator and open new one - mShowRotatedIndicatorOnClose = true; - mIndicator->Close(); // May synchronously call IndicatorClosed() callback & 1 level of recursion - // Don't show actor - will contain indicator for old orientation. - } - } - } + return mScene.GetRootLayer(); +} - // set indicator visible mode - if( mIndicator != NULL ) - { - mIndicator->SetVisible( mIndicatorVisible ); - } +void Window::SetTransparency( bool transparent ) +{ + mWindowSurface->SetTransparency( transparent ); +} - bool show = (mIndicatorVisible != Dali::Window::INVISIBLE ); - SetIndicatorProperties( show, lastOrientation ); - mIndicatorIsShown = show; +bool Window::GrabKey( Dali::KEY key, KeyGrab::KeyGrabMode grabMode ) +{ + return mWindowBase->GrabKey( key, grabMode ); } -void Window::DoRotateIndicator( Dali::Window::WindowOrientation orientation ) +bool Window::UngrabKey( Dali::KEY key ) { - if( mIndicatorIsShown ) - { - mShowRotatedIndicatorOnClose = true; - mNextIndicatorOrientation = orientation; - if( mIndicator ) - { - mIndicator->Close(); // May synchronously call IndicatorClosed() callback - } - } - else - { - // Save orientation for when the indicator is next shown - mShowRotatedIndicatorOnClose = false; - mNextIndicatorOrientation = orientation; - } + return mWindowBase->UngrabKey( key ); } -void Window::SetIndicatorActorRotation() +bool Window::GrabKeyList( const Dali::Vector< Dali::KEY >& key, const Dali::Vector< KeyGrab::KeyGrabMode >& grabMode, Dali::Vector< bool >& result ) { - DALI_LOG_TRACE_METHOD( gWindowLogFilter ); - if( mIndicator ) - { - Dali::Actor actor = mIndicator->GetActor(); - switch( mIndicatorOrientation ) - { - case Dali::Window::PORTRAIT: - actor.SetParentOrigin( ParentOrigin::TOP_CENTER ); - actor.SetAnchorPoint( AnchorPoint::TOP_CENTER ); - actor.SetOrientation( Degree(0), Vector3::ZAXIS ); - break; - case Dali::Window::PORTRAIT_INVERSE: - actor.SetParentOrigin( ParentOrigin::BOTTOM_CENTER ); - actor.SetAnchorPoint( AnchorPoint::TOP_CENTER ); - actor.SetOrientation( Degree(180), Vector3::ZAXIS ); - break; - case Dali::Window::LANDSCAPE: - actor.SetParentOrigin( ParentOrigin::CENTER_LEFT ); - actor.SetAnchorPoint( AnchorPoint::TOP_CENTER ); - actor.SetOrientation( Degree(270), Vector3::ZAXIS ); - break; - case Dali::Window::LANDSCAPE_INVERSE: - actor.SetParentOrigin( ParentOrigin::CENTER_RIGHT ); - actor.SetAnchorPoint( AnchorPoint::TOP_CENTER ); - actor.SetOrientation( Degree(90), Vector3::ZAXIS ); - break; - } - } + return mWindowBase->GrabKeyList( key, grabMode, result ); } -void Window::SetIndicatorProperties( bool isShow, Dali::Window::WindowOrientation lastOrientation ) +bool Window::UngrabKeyList( const Dali::Vector< Dali::KEY >& key, Dali::Vector< bool >& result ) { - mWindowBase->SetIndicatorProperties( isShow, lastOrientation ); + return mWindowBase->UngrabKeyList( key, result ); } void Window::OnIconifyChanged( bool iconified ) @@ -675,8 +557,9 @@ void Window::OnIconifyChanged( bool iconified ) { WindowVisibilityObserver* observer( mAdaptor ); observer->OnWindowHidden(); - DALI_LOG_RELEASE_INFO( "Window (%p) Iconified\n", this ); } + + DALI_LOG_RELEASE_INFO( "Window (%p) Iconified: visible = %d\n", this, mVisible ); } else { @@ -686,8 +569,9 @@ void Window::OnIconifyChanged( bool iconified ) { WindowVisibilityObserver* observer( mAdaptor ); observer->OnWindowShown(); - DALI_LOG_RELEASE_INFO( "Window (%p) Deiconified\n", this ); } + + DALI_LOG_RELEASE_INFO( "Window (%p) Deiconified: visible = %d\n", this, mVisible ); } } @@ -699,8 +583,9 @@ void Window::OnFocusChanged( bool focusIn ) void Window::OnOutputTransformed() { PositionSize positionSize = mSurface->GetPositionSize(); - mAdaptor->SurfaceResizePrepare( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) ); - mAdaptor->SurfaceResizeComplete( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) ); + SurfaceResized(); + mAdaptor->SurfaceResizePrepare( mSurface.get(), Adaptor::SurfaceSize( positionSize.width, positionSize.height ) ); + mAdaptor->SurfaceResizeComplete( mSurface.get(), Adaptor::SurfaceSize( positionSize.width, positionSize.height ) ); } void Window::OnDeleteRequest() @@ -708,74 +593,104 @@ void Window::OnDeleteRequest() mDeleteRequestSignal.Emit(); } -void Window::OnIndicatorFlicked() +void Window::OnTouchPoint( Dali::Integration::Point& point, int timeStamp ) { - if( mIndicator ) - { - mIndicator->Flicked(); - } + FeedTouchPoint( point, timeStamp ); } -void Window::IndicatorTypeChanged( IndicatorInterface::Type type ) +void Window::OnWheelEvent( Dali::Integration::WheelEvent& wheelEvent ) { - mWindowBase->IndicatorTypeChanged( type ); + FeedWheelEvent( wheelEvent ); } -void Window::IndicatorClosed( IndicatorInterface* indicator ) +void Window::OnKeyEvent( Dali::Integration::KeyEvent& keyEvent ) { - DALI_LOG_TRACE_METHOD( gWindowLogFilter ); - - if( mShowRotatedIndicatorOnClose ) - { - Dali::Window::WindowOrientation currentOrientation = mIndicatorOrientation; - if( mIndicator ) - { - mIndicator->Open( mNextIndicatorOrientation ); - } - mIndicatorOrientation = mNextIndicatorOrientation; - SetIndicatorActorRotation(); - DoShowIndicator( currentOrientation ); - } + FeedKeyEvent( keyEvent ); } -void Window::IndicatorVisibilityChanged( bool isVisible ) +void Window::OnRotation( const RotationEvent& rotation ) { - mIndicatorVisibilityChangedSignal.Emit( isVisible ); -} + mRotationAngle = rotation.angle; + mWindowWidth = rotation.width; + mWindowHeight = rotation.height; -void Window::OnStart() -{ - DoShowIndicator( mIndicatorOrientation ); + // Notify that the orientation is changed + mOrientation->OnOrientationChange( rotation ); + + mWindowSurface->RequestRotation( mRotationAngle, mWindowWidth, mWindowHeight ); + + SurfaceResized(); + + mAdaptor->SurfaceResizePrepare( mSurface.get(), Adaptor::SurfaceSize( mRotationAngle, mWindowHeight ) ); + + // Emit signal + mResizedSignal.Emit( Dali::Window::WindowSize( mRotationAngle, mWindowHeight ) ); + + mAdaptor->SurfaceResizeComplete( mSurface.get(), Adaptor::SurfaceSize( mRotationAngle, mWindowHeight ) ); } void Window::OnPause() { + if( mEventHandler ) + { + mEventHandler->Pause(); + } } void Window::OnResume() { - // resume indicator status - if( mIndicator != NULL ) + if( mEventHandler ) { - // Restore own indicator opacity - // Send opacity mode to indicator service when app resumed - mIndicator->SetOpacityMode( mIndicatorOpacityMode ); + mEventHandler->Resume(); } } -void Window::OnStop() +void Window::RecalculateTouchPosition( Integration::Point& point ) { - if( mIndicator ) + Vector2 position = point.GetScreenPosition(); + Vector2 convertedPosition; + + switch( mRotationAngle ) { - mIndicator->Close(); + case 90: + { + convertedPosition.x = static_cast( mWindowWidth ) - position.y; + convertedPosition.y = position.x; + break; + } + case 180: + { + convertedPosition.x = static_cast( mWindowWidth ) - position.x; + convertedPosition.y = static_cast( mWindowHeight ) - position.y; + break; + } + case 270: + { + convertedPosition.x = position.y; + convertedPosition.y = static_cast( mWindowHeight ) - position.x; + break; + } + default: + { + convertedPosition = position; + break; + } } - mIndicator.release(); + point.SetScreenPosition( convertedPosition ); } -void Window::OnDestroy() +Dali::Window Window::Get( Dali::Actor actor ) { - mAdaptor = NULL; + Internal::Adaptor::Window* windowImpl = nullptr; + + if ( Internal::Adaptor::Adaptor::IsAvailable() ) + { + Dali::Internal::Adaptor::Adaptor& adaptor = Internal::Adaptor::Adaptor::GetImplementation( Internal::Adaptor::Adaptor::Get() ); + windowImpl = static_cast( adaptor.GetWindow( actor ) ); + } + + return Dali::Window( windowImpl ); } } // Adaptor