ProcessIdle method added to Adaptor. 59/230959/1
authorVictor Cebollada <v.cebollada@samsung.com>
Tue, 10 Mar 2020 07:51:23 +0000 (07:51 +0000)
committerVíctor Cebollada <v.cebollada@samsung.com>
Thu, 16 Apr 2020 07:54:33 +0000 (07:54 +0000)
* This function is intended to be used in the case there is no instance
  of a Dali::Application i.e. DALi is used in a implementation of
  a plugin of an application.

Change-Id: Ia2a16f2234a42ec6a1e6a957e1d80149bd2628ce
Signed-off-by: Victor Cebollada <v.cebollada@samsung.com>
(cherry picked from commit e99e2cb33e64139dd7007faaf95605a7ba1375d3)

14 files changed:
dali/integration-api/adaptor-framework/adaptor.h
dali/internal/adaptor/common/adaptor-impl.cpp
dali/internal/adaptor/common/adaptor-impl.h
dali/internal/adaptor/common/adaptor.cpp
dali/internal/adaptor/windows/framework-win.cpp
dali/internal/system/android/callback-manager-android.cpp
dali/internal/system/android/callback-manager-android.h
dali/internal/system/common/callback-manager.h
dali/internal/system/linux/callback-manager-ecore.cpp
dali/internal/system/linux/callback-manager-ecore.h
dali/internal/system/windows/callback-manager-win.cpp
dali/internal/system/windows/callback-manager-win.h
dali/internal/window-system/windows/platform-implement-win.cpp
dali/internal/window-system/windows/platform-implement-win.h

index 948737d9144855766de051fd3390053c420a2fdc..b8eea9392edaf6fe4d177c889bc4b251d00dd297 100755 (executable)
@@ -273,6 +273,13 @@ public:
    */
   void RemoveIdle( CallbackBase* callback );
 
+  /**
+   * @brief Processes the idle callbacks.
+   *
+   * @note This function is intended to be used in the case there is no instance of a Dali::Application i.e. DALi is used in a implementation of a plugin of an application.
+   */
+  void ProcessIdle();
+
   /**
    * @brief Replaces the rendering surface
    *
index 1e6604859009501fa6830562abbae0a99a1c31fb..e06310a26957df7c8a41ec4894c649403672c10c 100755 (executable)
@@ -594,6 +594,12 @@ void Adaptor::RemoveIdle( CallbackBase* callback )
   mCallbackManager->RemoveIdleCallback( callback );
 }
 
+void Adaptor::ProcessIdle()
+{
+  bool idleProcessed = mCallbackManager->ProcessIdle();
+  mNotificationOnIdleInstalled = mNotificationOnIdleInstalled && !idleProcessed;
+}
+
 void Adaptor::SetPreRenderCallback( CallbackBase* callback )
 {
   mThreadController->SetPreRenderCallback( callback );
index 93031fffa3c9ccf09f8fda3cb249c496dfac18c6..c2a9ad4a0392416563598016f98ddb39b7a4bc46 100755 (executable)
@@ -275,6 +275,11 @@ public: // AdaptorInternalServices implementation
    */
   virtual void RemoveIdle( CallbackBase* callback );
 
+  /**
+   * @copydoc Dali::Adaptor::ProcessIdle()
+   */
+  virtual void ProcessIdle();
+
   /**
    * Sets a pre-render callback.
    */
index 3915b685ae44a10db63cad80c81334793f8e7db2..e77dea8877fe2ec747745c9ccd2c465a491a7f12 100755 (executable)
@@ -120,6 +120,11 @@ void Adaptor::RemoveIdle( CallbackBase* callback )
   mImpl->RemoveIdle( callback );
 }
 
+void Adaptor::ProcessIdle()
+{
+  mImpl->ProcessIdle();
+}
+
 void Adaptor::ReplaceSurface( Window window, Dali::RenderSurfaceInterface& surface )
 {
   Internal::Adaptor::SceneHolder* sceneHolder = &Dali::GetImplementation( window );
index 9e4ea630045ba45a2447d4dc0775cba131a176c4..01c334a66a3f1bf3200c780ce1e44c9a3b749c61 100755 (executable)
@@ -20,6 +20,7 @@
 \r
 // EXTERNAL INCLUDES\r
 #include <dali/integration-api/debug.h>\r
+#include <windows.h>\r
 \r
 // INTERNAL INCLUDES\r
 #include <dali/internal/window-system/windows/platform-implement-win.h>\r
@@ -128,7 +129,26 @@ struct Framework::Impl
 \r
   void Run()\r
   {\r
-    WindowsPlatformImplementation::RunLoop();\r
+    MSG nMsg = { 0 };\r
+\r
+    while (GetMessage(&nMsg, 0, NULL, NULL))\r
+    {\r
+      if (WIN_CALLBACK_EVENT == nMsg.message)\r
+      {\r
+        Dali::CallbackBase *callback = (Dali::CallbackBase*)nMsg.wParam;\r
+        Dali::CallbackBase::Execute(*callback);\r
+      }\r
+\r
+      TranslateMessage(&nMsg);\r
+      DispatchMessage(&nMsg);\r
+\r
+      mCallbackManager->ClearIdleCallbacks();\r
+\r
+      if (WM_CLOSE == nMsg.message)\r
+      {\r
+        break;\r
+      }\r
+    }\r
   }\r
 \r
   void Quit()\r
index 764f8bd2b024fc23677762e0f497710d38585a42..7cb1952d34864d3dd3c613054bbe6a5cc28b0264 100644 (file)
@@ -171,6 +171,17 @@ void AndroidCallbackManager::RemoveIdleCallback( CallbackBase* callback )
   }
 }
 
+bool AndroidCallbackManager::ProcessIdle()
+{
+  // @todo To be implemented.
+  return false;
+}
+
+void AndroidCallbackManager::ClearIdleCallbacks()
+{
+  // @todo To be implemented.
+}
+
 bool AndroidCallbackManager::AddIdleEntererCallback( CallbackBase* callback )
 {
   if( !mRunning )
index 1dd913dd8eb0cc23f446a0233be5ed948a04a0f9..71017c5b51bc8c03f56cd92bc038ac84044faf64 100644 (file)
@@ -64,6 +64,16 @@ public:
      */
     virtual void RemoveIdleCallback( CallbackBase* callback );
 
+    /**
+     * @copydoc CallbackManager::ProcessIdle()
+     */
+    virtual bool ProcessIdle();
+
+    /**
+     * @copydoc CallbackManager::ProcessIdle()
+     */
+    virtual void ClearIdleCallbacks();
+
     /**
      * @copydoc CallbackManager::AddIdleEntererCallback()
      */
index 44ecac49d33131f7f6e0e6fc187ccc7b31703124..a368d49bb01ea6d924cb3d6d13e21b5ae640f6f3 100644 (file)
@@ -83,6 +83,18 @@ public:
      */
     virtual void RemoveIdleCallback( CallbackBase* callback ) = 0;
 
+    /**
+     * @brief Processes the idle callbacks.
+     *
+     * @return whether a DALi callback has been processed.
+     */
+    virtual bool ProcessIdle() = 0;
+
+    /**
+     * @brief Clears the container of callbacks.
+     */
+    virtual void ClearIdleCallbacks() = 0;
+
     /**
      * @brief Adds a @p callback to be run when entering an idle state.
      * @note Must be called from the main thread only.
index 286c946405e1304a14b7fa5c3d7981c11df24e67..ade2f1980fda0262d790ffa1925c3827c76d894c 100644 (file)
@@ -184,6 +184,17 @@ void EcoreCallbackManager::RemoveIdleCallback( CallbackBase* callback )
   }
 }
 
+bool EcoreCallbackManager::ProcessIdle()
+{
+  // @todo To be implemented.
+  return false;
+}
+
+void EcoreCallbackManager::ClearIdleCallbacks()
+{
+  // @todo To be implemented.
+}
+
 bool EcoreCallbackManager::AddIdleEntererCallback( CallbackBase* callback )
 {
   if( !mRunning )
index d1b8dd5c98cba06c5e55d656d643627ca38b7903..f5fe7e352df7411af302de9d6c3d9407b5f31844 100644 (file)
@@ -66,6 +66,16 @@ public:
      */
     virtual void RemoveIdleCallback( CallbackBase* callback );
 
+    /**
+     * @copydoc CallbackManager::ProcessIdle()
+     */
+    virtual bool ProcessIdle();
+
+    /**
+     * @copydoc CallbackManager::ProcessIdle()
+     */
+    virtual void ClearIdleCallbacks();
+
     /**
      * @copydoc CallbackManager::AddIdleEntererCallback()
      */
index 539daa307d61644453babf9bed89bb39f45b0d04..b840cc54edd5e9d319b6b0590b4b5aa5e0ddc92a 100755 (executable)
@@ -60,7 +60,10 @@ bool WinCallbackManager::AddIdleCallback( CallbackBase* callback, bool hasReturn
     return false;\r
   }\r
 \r
+  mCallbacks.insert(callback);\r
+\r
   WindowsPlatformImplementation::PostWinThreadMessage( WIN_CALLBACK_EVENT, reinterpret_cast<uint64_t>(callback), 0 );\r
+\r
   return true;\r
 }\r
 \r
@@ -69,6 +72,24 @@ void WinCallbackManager::RemoveIdleCallback( CallbackBase* callback )
   //Wait for deal\r
 }\r
 \r
+bool WinCallbackManager::ProcessIdle()\r
+{\r
+  const bool idleProcessed = !mCallbacks.empty();\r
+\r
+  for (CallbackBase* cb : mCallbacks)\r
+  {\r
+    Dali::CallbackBase::Execute(*cb);\r
+  }\r
+  mCallbacks.clear();\r
+\r
+  return idleProcessed;\r
+}\r
+\r
+void WinCallbackManager::ClearIdleCallbacks()\r
+{\r
+  mCallbacks.clear();\r
+}\r
+\r
 bool WinCallbackManager::AddIdleEntererCallback( CallbackBase* callback )\r
 {\r
   return AddIdleCallback( callback, true );\r
index a2cd2eda7574ec4280e62b378627ebbc9150fefc..ef8550151ff676811d08b3b29ef93b02ee1439ca 100755 (executable)
  */
 
 // EXTERNAL INCLUDES
-#include <list>
+#include <set>
 
 // INTERNAL INCLUDES
 #include <dali/internal/system/common/callback-manager.h>
 
-
 namespace Dali
 {
 
@@ -62,6 +61,16 @@ public:
      */
     virtual void RemoveIdleCallback( CallbackBase* callback );
 
+    /**
+     * @copydoc CallbackManager::ProcessIdle()
+     */
+    virtual bool ProcessIdle();
+
+    /**
+     * @copydoc CallbackManager::ClearIdleCallbacks()
+     */
+    virtual void ClearIdleCallbacks();
+
     /**
     * @brief Adds a @p callback to be run when entering an idle state.
     * @note Must be called from the main thread only.
@@ -99,6 +108,7 @@ public:
     virtual void Stop();
 
 private:
+    std::set<CallbackBase*>        mCallbacks;
     bool                           mRunning;            ///< flag is set to true if when running
 };
 
index 84bb736a86b0b4768277494ab964fd216b25c31c..13932b5d1915dd64e24aca79a298c884409ecc9f 100755 (executable)
 // INTERNAL INCLUDES
 #include <dali/internal/window-system/windows/event-system-win.h>
 
+namespace
+{
 static constexpr float INCH = 25.4;
-
-using namespace std;
+}
 
 namespace Dali
 {
@@ -41,31 +42,9 @@ namespace Adaptor
 namespace WindowsPlatformImplementation
 {
 
-void RunLoop()
-{
-  MSG nMsg = { 0 };
-
-  while( GetMessage( &nMsg, 0, NULL, NULL ) )
-  {
-    if( WIN_CALLBACK_EVENT == nMsg.message )
-    {
-      Dali::CallbackBase *callback = ( Dali::CallbackBase* )nMsg.wParam;
-      Dali::CallbackBase::Execute( *callback );
-    }
-
-    TranslateMessage( &nMsg );
-    DispatchMessage( &nMsg );
-
-    if( WM_CLOSE == nMsg.message )
-    {
-      break;
-    }
-  }
-}
-
 LRESULT CALLBACK WinProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
 {
-  WindowImpl::ProcWinMessge( reinterpret_cast<uint64_t>( hWnd ), uMsg, wParam, lParam );
+  WindowImpl::ProcWinMessage( reinterpret_cast<uint64_t>( hWnd ), uMsg, wParam, lParam );
 
   LRESULT ret = DefWindowProc( hWnd, uMsg, wParam, lParam );
   return ret;
@@ -87,7 +66,7 @@ WindowImpl::~WindowImpl()
   mHWndToListener.erase( mHWnd );
 }
 
-void WindowImpl::ProcWinMessge( uint64_t hWnd, uint32_t uMsg, uint64_t wParam, uint64_t lParam )
+void WindowImpl::ProcWinMessage( uint64_t hWnd, uint32_t uMsg, uint64_t wParam, uint64_t lParam )
 {
   std::map<uint64_t, WindowImpl*>::iterator x = mHWndToListener.find( hWnd );
 
index 1425e29af9bf53f09059e45f71eeba932091d9c9..7f1fe0a86c3a55aa74ca9cc04f600fbfc35019ff 100755 (executable)
@@ -37,8 +37,6 @@ namespace Adaptor
 namespace WindowsPlatformImplementation\r
 {\r
 \r
-void RunLoop();\r
-\r
 bool PostWinThreadMessage(\r
     _In_ uint32_t Msg,\r
     _In_ uint32_t wParam,\r
@@ -66,7 +64,7 @@ public:
 \r
   virtual ~WindowImpl();\r
 \r
-  static void ProcWinMessge( uint64_t hWnd, uint32_t uMsg, uint64_t wParam, uint64_t lParam );\r
+  static void ProcWinMessage( uint64_t hWnd, uint32_t uMsg, uint64_t wParam, uint64_t lParam );\r
 \r
   void GetDPI( float &xDpi, float &yDpi );\r
 \r