ProcessIdle method added to Adaptor. 97/227397/12
authorVictor Cebollada <v.cebollada@samsung.com>
Tue, 10 Mar 2020 07:51:23 +0000 (07:51 +0000)
committerVictor Cebollada <v.cebollada@samsung.com>
Tue, 14 Apr 2020 09:41:42 +0000 (10:41 +0100)
* 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>
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 948737d..b8eea93 100755 (executable)
@@ -274,6 +274,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
    *
    * @param[in] window The window to replace the surface for
index 1e66048..e06310a 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 93031ff..c2a9ad4 100755 (executable)
@@ -276,6 +276,11 @@ public: // AdaptorInternalServices implementation
   virtual void RemoveIdle( CallbackBase* callback );
 
   /**
+   * @copydoc Dali::Adaptor::ProcessIdle()
+   */
+  virtual void ProcessIdle();
+
+  /**
    * Sets a pre-render callback.
    */
   void SetPreRenderCallback( CallbackBase* callback );
index 3915b68..e77dea8 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 9e4ea63..01c334a 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 764f8bd..7cb1952 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 1dd913d..71017c5 100644 (file)
@@ -65,6 +65,16 @@ public:
     virtual void RemoveIdleCallback( CallbackBase* callback );
 
     /**
+     * @copydoc CallbackManager::ProcessIdle()
+     */
+    virtual bool ProcessIdle();
+
+    /**
+     * @copydoc CallbackManager::ProcessIdle()
+     */
+    virtual void ClearIdleCallbacks();
+
+    /**
      * @copydoc CallbackManager::AddIdleEntererCallback()
      */
     virtual bool AddIdleEntererCallback( CallbackBase* callback );
index 44ecac4..a368d49 100644 (file)
@@ -84,6 +84,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 286c946..ade2f19 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 d1b8dd5..f5fe7e3 100644 (file)
@@ -67,6 +67,16 @@ public:
     virtual void RemoveIdleCallback( CallbackBase* callback );
 
     /**
+     * @copydoc CallbackManager::ProcessIdle()
+     */
+    virtual bool ProcessIdle();
+
+    /**
+     * @copydoc CallbackManager::ProcessIdle()
+     */
+    virtual void ClearIdleCallbacks();
+
+    /**
      * @copydoc CallbackManager::AddIdleEntererCallback()
      */
     virtual bool AddIdleEntererCallback( CallbackBase* callback );
index 539daa3..b840cc5 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 a2cd2ed..ef85501 100755 (executable)
  */
 
 // EXTERNAL INCLUDES
-#include <list>
+#include <set>
 
 // INTERNAL INCLUDES
 #include <dali/internal/system/common/callback-manager.h>
 
-
 namespace Dali
 {
 
@@ -63,6 +62,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 84bb736..13932b5 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 1425e29..7f1fe0a 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