Fix to destroy widget successful 03/241003/5 submit/tizen/20200819.010657
authorSunghyun Kim <scholb.kim@samsung.com>
Thu, 13 Aug 2020 11:34:37 +0000 (20:34 +0900)
committerSunghyun Kim <scholb.kim@samsung.com>
Tue, 18 Aug 2020 09:13:41 +0000 (18:13 +0900)
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

widget_viewer_dali/internal/widget_view/widget_view_impl.cpp
widget_viewer_dali/internal/widget_view/widget_view_impl.h

index f71feab676501ad6b18ac29bc23df6f47c64376a..ce0ce0dfa5db3c401685f738159b32382be8b2c6 100644 (file)
@@ -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 )
index 7f9e3975f1bedecea0b4f9fb0c8596967e7a01de..b8ba019c25d3cdb68806352a2c35791a7b652ae9 100644 (file)
@@ -328,6 +328,8 @@ private:
   tizen_remote_surface* mRemoteSurface;
   wl_buffer* mBuffer;
   bool mReloadFlag;
+  bool mCreated;
+  bool mResizeRequired;
 
   Dali::Property::Map mEffectPropertyMap;