From: Sunghyun Kim Date: Thu, 13 Aug 2020 11:34:37 +0000 (+0900) Subject: Fix to destroy widget successful X-Git-Tag: submit/tizen/20200819.010657^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3398350352d2b18639d2e6d4b4ea130adac8280e;p=platform%2Fcore%2Fuifw%2Fwidget-viewer-dali.git Fix to destroy widget successful For destroy widget successful, we need to follow rules 1. Do not call widget_instance_terminate and widget_instance_destroy 2. Do not call widget_instance_resize before widget is created To follow this rules, i apply this patch Change-Id: I7a81da06db6caffe1a891ed616e2c6a1adfa3613 --- diff --git a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp index f71feab..ce0ce0d 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp @@ -307,7 +307,9 @@ WidgetView::WidgetView() mWatcherHandle( NULL ), mRemoteSurface( NULL ), mBuffer( NULL ), - mReloadFlag( false ) + mReloadFlag( false ), + mCreated( false ), + mResizeRequired( false ) { } @@ -331,7 +333,9 @@ WidgetView::WidgetView( const std::string& widgetId, const std::string& contentI mWatcherHandle( NULL ), mRemoteSurface( NULL ), mBuffer( NULL ), - mReloadFlag( false ) + mReloadFlag( false ), + mCreated( false ), + mResizeRequired( false ) { } @@ -588,18 +592,8 @@ bool WidgetView::TerminateWidget() if( !mWidgetId.empty() && !mInstanceId.empty() ) { int ret = 0; - ret = widget_instance_terminate( mInstanceId.c_str() ); - if( ret < 0 ) - { - DALI_LOG_ERROR("widget_instance_terminate() is failed."); - return false; - } - /* - After TerminateWidget() is called, widget will be not used. - so call widget_instance_destroy() is more appropriate. - only call widget_instance_terminate(), appFW consider this instance will be reuse. - */ + // Destroy widget instance because it will be not used anymore. ret = widget_instance_destroy( mInstanceId.c_str() ); if( ret < 0 ) { @@ -615,6 +609,9 @@ bool WidgetView::TerminateWidget() mInstanceId.clear(); CloseRemoteSurface(); + + mCreated = false; + mResizeRequired = false; return true; } @@ -632,6 +629,16 @@ void WidgetView::SendWidgetEvent( int event ) // Emit signal switch( event ) { + case WIDGET_INSTANCE_EVENT_CREATE: + { + mCreated = true; + if( mResizeRequired ) + { + widget_instance_resize(mInstanceId.c_str(), mWidth, mHeight); + mResizeRequired = false; + } + break; + } case WIDGET_INSTANCE_EVENT_UPDATE: case WIDGET_INSTANCE_EVENT_EXTRA_UPDATED: { @@ -1732,7 +1739,19 @@ bool WidgetView::GetStringFromProperty( const Dali::Property::Value& value, std: void WidgetView::OnRelayout( const Vector2& size, RelayoutContainer& container ) { Control::OnRelayout( size, container ); - widget_instance_resize(mInstanceId.c_str(), size.x, size.y); + + // When widget is not created, we can't call widget_instance_resize(). + // in this case, we just save the size and do resize when instance is created. + if( mCreated ) + { + widget_instance_resize(mInstanceId.c_str(), size.x, size.y); + } + else + { + mResizeRequired = true; + mWidth = size.x; + mHeight = size.y; + } } void WidgetView::OnSizeAnimation( Animation& animation, const Vector3& targetSize ) diff --git a/widget_viewer_dali/internal/widget_view/widget_view_impl.h b/widget_viewer_dali/internal/widget_view/widget_view_impl.h index 7f9e397..b8ba019 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.h +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.h @@ -328,6 +328,8 @@ private: tizen_remote_surface* mRemoteSurface; wl_buffer* mBuffer; bool mReloadFlag; + bool mCreated; + bool mResizeRequired; Dali::Property::Map mEffectPropertyMap;