[Tizen] Temporarily modified so that window is no null
[platform/core/uifw/dali-adaptor.git] / dali / internal / system / tizen-wayland / widget-application-impl-tizen.cpp
index 7c12ef9..2b4b480 100644 (file)
 // INTERNAL INCLUDE
 #include <dali/public-api/adaptor-framework/widget.h>
 #include <dali/public-api/adaptor-framework/widget-impl.h>
+#include <dali/internal/adaptor/common/adaptor-impl.h>
+#include <dali/internal/system/common/environment-variables.h>
 #include <dali/internal/system/tizen-wayland/widget-controller-tizen.h>
 
-#ifdef WIDGET_SUPPOERTED
+// EXTERNAL INCLUDES
 #include <bundle.h>
 #include <widget_base.h>
-#endif
 
 namespace Dali
 {
@@ -34,7 +35,6 @@ namespace Dali
 namespace Internal
 {
 
-#ifdef WIDGET_SUPPOERTED
 namespace
 {
 
@@ -47,9 +47,26 @@ int OnInstanceInit(widget_base_instance_h instanceHandle, bundle *content, int w
 
   Dali::Internal::Adaptor::WidgetApplicationTizen* application = static_cast<Dali::Internal::Adaptor::WidgetApplicationTizen*>(classData);
 
-  // After DALi can support multi window, this part should be changed.
-  Dali::Window window = application->GetWindow();
-  window.ShowIndicator(Dali::Window::INVISIBLE);
+  Dali::Window window;
+  if( application->GetWidgetCount() == 0)
+  {
+    window = application->GetWindow();
+    DALI_LOG_RELEASE_INFO("Widget Instance use default Window(win:%p), so it need to bind widget (%dx%d) (id:%s) \n",window, w, h, std::string(id).c_str());
+  }
+  else
+  {
+    if(Internal::Adaptor::Adaptor::GetImplementation(application->GetAdaptor()).IsMultipleWindowSupported())
+    {
+      window = Dali::Window::New(PositionSize(0,0,w,h) ,"", false);
+      DALI_LOG_RELEASE_INFO("Widget Instance create new Window  (win:%p, cnt:%d) (%dx%d) (id:%s )\n", window, application->GetWidgetCount(), w, h, std::string(id).c_str());
+    }
+    else
+    {
+      DALI_LOG_ERROR("This device can't support Multi Widget. it means UI may not be properly drawn.");
+      window = application->GetWindow();
+    }
+  }
+
   Any nativeHandle = window.GetNativeHandle();
 
 #ifdef ECORE_WAYLAND2
@@ -65,7 +82,7 @@ int OnInstanceInit(widget_base_instance_h instanceHandle, bundle *content, int w
   Dali::WidgetApplication::CreateWidgetFunction createFunction = pair.second;
 
   Dali::Widget widgetInstance = createFunction( pair.first );
-  application->AddWidget( instanceHandle, widgetInstance );
+  application->AddWidget( instanceHandle, widgetInstance , window );
 
   Dali::Internal::Adaptor::Widget::Impl *widgetImpl = new Dali::Internal::Adaptor::WidgetImplTizen(instanceHandle);
   Internal::Adaptor::GetImplementation(widgetInstance).SetImpl( widgetImpl );
@@ -158,8 +175,7 @@ int OnInstanceResize(widget_base_instance_h instanceHandle, int w, int h, void *
 
   // Get Dali::Widget instance.
   Dali::Widget widgetInstance = application->GetWidget( instanceHandle );
-
-  Dali::Window window = application->GetWindow();
+  Dali::Window window = application->GetWindowFromWidget( instanceHandle );
   window.SetSize( Dali::Window::WindowSize(w, h) );
   Internal::Adaptor::GetImplementation(widgetInstance).OnResize(window);
 
@@ -192,15 +208,18 @@ int OnInstanceUpdate(widget_base_instance_h instanceHandle, bundle *content, int
   return 0;
 }
 
-} // anonymous namespace
+unsigned int GetEnvWidgetRenderRefreshRate()
+{
+  const char* envVariable = std::getenv( DALI_WIDGET_REFRESH_RATE );
 
-#endif
+  return envVariable ? std::atoi( envVariable ) : 1u; // Default 60 fps
+}
+
+} // anonymous namespace
 
 namespace Adaptor
 {
 
-#ifdef WIDGET_SUPPOERTED
-
 WidgetApplicationPtr WidgetApplicationTizen::New(
   int* argc,
   char **argv[],
@@ -242,9 +261,11 @@ void WidgetApplicationTizen::AddWidgetCreatingFunctionPair( CreateWidgetFunction
 
 WidgetApplicationTizen::CreateWidgetFunctionPair WidgetApplicationTizen::GetWidgetCreatingFunctionPair( const std::string& widgetName )
 {
+  int idx = widgetName.find(":");
+  std::string widgetID = widgetName.substr( idx + 1 );
   for( CreateWidgetFunctionContainer::const_iterator iter = mCreateWidgetFunctionContainer.begin(); iter != mCreateWidgetFunctionContainer.end(); ++iter )
   {
-    if( widgetName.find((*iter).first) != std::string::npos  )
+    if( widgetID.compare((*iter).first) == 0)
     {
       return *iter;
     }
@@ -253,18 +274,19 @@ WidgetApplicationTizen::CreateWidgetFunctionPair WidgetApplicationTizen::GetWidg
   return CreateWidgetFunctionPair( "", NULL );
 }
 
-void WidgetApplicationTizen::AddWidget( widget_base_instance_h widgetBaseInstance, Dali::Widget widget )
+void WidgetApplicationTizen::AddWidget( widget_base_instance_h widgetBaseInstance, Dali::Widget widget , Dali::Window window )
 {
   mWidgetInstanceContainer.push_back( WidgetInstancePair(widgetBaseInstance, widget) );
+  mWindowInstanceContainer.push_back( WindowInstancePair(widgetBaseInstance, window) );
 }
 
-Dali::Widget WidgetApplicationTizen::GetWidget( widget_base_instance_h widgetBaseInstance )
+Dali::Widget WidgetApplicationTizen::GetWidget( widget_base_instance_h widgetBaseInstance ) const
 {
-  for( WidgetInstanceContainer::const_iterator iter = mWidgetInstanceContainer.begin(); iter != mWidgetInstanceContainer.end(); ++iter )
+  for( auto&& iter : mWidgetInstanceContainer )
   {
-    if( (*iter).first == widgetBaseInstance  )
+    if( (iter).first == widgetBaseInstance  )
     {
-      return (*iter).second;
+      return (iter).second;
     }
   }
   return Dali::Widget();
@@ -272,17 +294,53 @@ Dali::Widget WidgetApplicationTizen::GetWidget( widget_base_instance_h widgetBas
 
 void WidgetApplicationTizen::DeleteWidget( widget_base_instance_h widgetBaseInstance )
 {
-  for( WidgetInstanceContainer::const_iterator iter = mWidgetInstanceContainer.begin(); iter != mWidgetInstanceContainer.end(); ++iter )
+  // Delete WidgetInstance
+  auto widgetInstance = std::find_if( mWidgetInstanceContainer.begin(),
+                                      mWidgetInstanceContainer.end(),
+                                      [widgetBaseInstance]( WidgetInstancePair pair )
+                                      { return (pair.first == widgetBaseInstance); } );
+
+  if(widgetInstance != mWidgetInstanceContainer.end())
   {
-    if( (*iter).first == widgetBaseInstance  )
+    mWidgetInstanceContainer.erase(widgetInstance);
+  }
+
+  // Delete WindowInstance
+  auto windowInstance = std::find_if( mWindowInstanceContainer.begin(),
+                                      mWindowInstanceContainer.end(),
+                                      [widgetBaseInstance]( WindowInstancePair pair )
+                                      { return (pair.first == widgetBaseInstance); } );
+
+  if(windowInstance != mWindowInstanceContainer.end())
+  {
+    mWindowInstanceContainer.erase(windowInstance);
+  }
+}
+
+Dali::Window WidgetApplicationTizen::GetWindowFromWidget( widget_base_instance_h widgetBaseInstance ) const
+{
+  for( auto&& iter : mWindowInstanceContainer )
+  {
+    if( (iter).first == widgetBaseInstance  )
     {
-      mWidgetInstanceContainer.erase(iter);
-      break;
+      Dali::Window ret = (iter).second;
+      return ret;
     }
   }
+  return Dali::Window();
 }
 
-#endif
+int WidgetApplicationTizen::GetWidgetCount()
+{
+  return mWidgetInstanceContainer.size();
+}
+
+void WidgetApplicationTizen::OnInit()
+{
+  WidgetApplication::OnInit();
+
+  Dali::Adaptor::Get().SetRenderRefreshRate( GetEnvWidgetRenderRefreshRate() );
+}
 
 // factory function, must be implemented
 namespace WidgetApplicationFactory
@@ -295,11 +353,7 @@ namespace WidgetApplicationFactory
  */
 Dali::Internal::Adaptor::WidgetApplicationPtr Create( int* argc, char **argv[], const std::string& stylesheet )
 {
-#ifdef WIDGET_SUPPOERTED
   return WidgetApplicationTizen::New( argc, argv, stylesheet );
-#else
-  return nullptr;
-#endif
 }
 
 } // namespace Factory