From e99e2cb33e64139dd7007faaf95605a7ba1375d3 Mon Sep 17 00:00:00 2001 From: Victor Cebollada Date: Tue, 10 Mar 2020 07:51:23 +0000 Subject: [PATCH] ProcessIdle method added to Adaptor. * 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 --- dali/integration-api/adaptor-framework/adaptor.h | 7 +++++ dali/internal/adaptor/common/adaptor-impl.cpp | 6 +++++ dali/internal/adaptor/common/adaptor-impl.h | 5 ++++ dali/internal/adaptor/common/adaptor.cpp | 5 ++++ dali/internal/adaptor/windows/framework-win.cpp | 22 ++++++++++++++- .../system/android/callback-manager-android.cpp | 11 ++++++++ .../system/android/callback-manager-android.h | 10 +++++++ dali/internal/system/common/callback-manager.h | 12 +++++++++ .../system/linux/callback-manager-ecore.cpp | 11 ++++++++ .../internal/system/linux/callback-manager-ecore.h | 10 +++++++ .../system/windows/callback-manager-win.cpp | 21 +++++++++++++++ .../internal/system/windows/callback-manager-win.h | 14 ++++++++-- .../windows/platform-implement-win.cpp | 31 ++++------------------ .../window-system/windows/platform-implement-win.h | 4 +-- 14 files changed, 137 insertions(+), 32 deletions(-) diff --git a/dali/integration-api/adaptor-framework/adaptor.h b/dali/integration-api/adaptor-framework/adaptor.h index 948737d..b8eea93 100755 --- a/dali/integration-api/adaptor-framework/adaptor.h +++ b/dali/integration-api/adaptor-framework/adaptor.h @@ -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 diff --git a/dali/internal/adaptor/common/adaptor-impl.cpp b/dali/internal/adaptor/common/adaptor-impl.cpp index 1e66048..e06310a 100755 --- a/dali/internal/adaptor/common/adaptor-impl.cpp +++ b/dali/internal/adaptor/common/adaptor-impl.cpp @@ -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 ); diff --git a/dali/internal/adaptor/common/adaptor-impl.h b/dali/internal/adaptor/common/adaptor-impl.h index 93031ff..c2a9ad4 100755 --- a/dali/internal/adaptor/common/adaptor-impl.h +++ b/dali/internal/adaptor/common/adaptor-impl.h @@ -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 ); diff --git a/dali/internal/adaptor/common/adaptor.cpp b/dali/internal/adaptor/common/adaptor.cpp index 3915b68..e77dea8 100755 --- a/dali/internal/adaptor/common/adaptor.cpp +++ b/dali/internal/adaptor/common/adaptor.cpp @@ -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 ); diff --git a/dali/internal/adaptor/windows/framework-win.cpp b/dali/internal/adaptor/windows/framework-win.cpp index 9e4ea63..01c334a 100755 --- a/dali/internal/adaptor/windows/framework-win.cpp +++ b/dali/internal/adaptor/windows/framework-win.cpp @@ -20,6 +20,7 @@ // EXTERNAL INCLUDES #include +#include // INTERNAL INCLUDES #include @@ -128,7 +129,26 @@ struct Framework::Impl void Run() { - WindowsPlatformImplementation::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); + + mCallbackManager->ClearIdleCallbacks(); + + if (WM_CLOSE == nMsg.message) + { + break; + } + } } void Quit() diff --git a/dali/internal/system/android/callback-manager-android.cpp b/dali/internal/system/android/callback-manager-android.cpp index 764f8bd..7cb1952 100644 --- a/dali/internal/system/android/callback-manager-android.cpp +++ b/dali/internal/system/android/callback-manager-android.cpp @@ -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 ) diff --git a/dali/internal/system/android/callback-manager-android.h b/dali/internal/system/android/callback-manager-android.h index 1dd913d..71017c5 100644 --- a/dali/internal/system/android/callback-manager-android.h +++ b/dali/internal/system/android/callback-manager-android.h @@ -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 ); diff --git a/dali/internal/system/common/callback-manager.h b/dali/internal/system/common/callback-manager.h index 44ecac4..a368d49 100644 --- a/dali/internal/system/common/callback-manager.h +++ b/dali/internal/system/common/callback-manager.h @@ -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. * diff --git a/dali/internal/system/linux/callback-manager-ecore.cpp b/dali/internal/system/linux/callback-manager-ecore.cpp index 286c946..ade2f19 100644 --- a/dali/internal/system/linux/callback-manager-ecore.cpp +++ b/dali/internal/system/linux/callback-manager-ecore.cpp @@ -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 ) diff --git a/dali/internal/system/linux/callback-manager-ecore.h b/dali/internal/system/linux/callback-manager-ecore.h index d1b8dd5..f5fe7e3 100644 --- a/dali/internal/system/linux/callback-manager-ecore.h +++ b/dali/internal/system/linux/callback-manager-ecore.h @@ -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 ); diff --git a/dali/internal/system/windows/callback-manager-win.cpp b/dali/internal/system/windows/callback-manager-win.cpp index 539daa3..b840cc5 100755 --- a/dali/internal/system/windows/callback-manager-win.cpp +++ b/dali/internal/system/windows/callback-manager-win.cpp @@ -60,7 +60,10 @@ bool WinCallbackManager::AddIdleCallback( CallbackBase* callback, bool hasReturn return false; } + mCallbacks.insert(callback); + WindowsPlatformImplementation::PostWinThreadMessage( WIN_CALLBACK_EVENT, reinterpret_cast(callback), 0 ); + return true; } @@ -69,6 +72,24 @@ void WinCallbackManager::RemoveIdleCallback( CallbackBase* callback ) //Wait for deal } +bool WinCallbackManager::ProcessIdle() +{ + const bool idleProcessed = !mCallbacks.empty(); + + for (CallbackBase* cb : mCallbacks) + { + Dali::CallbackBase::Execute(*cb); + } + mCallbacks.clear(); + + return idleProcessed; +} + +void WinCallbackManager::ClearIdleCallbacks() +{ + mCallbacks.clear(); +} + bool WinCallbackManager::AddIdleEntererCallback( CallbackBase* callback ) { return AddIdleCallback( callback, true ); diff --git a/dali/internal/system/windows/callback-manager-win.h b/dali/internal/system/windows/callback-manager-win.h index a2cd2ed..ef85501 100755 --- a/dali/internal/system/windows/callback-manager-win.h +++ b/dali/internal/system/windows/callback-manager-win.h @@ -19,12 +19,11 @@ */ // EXTERNAL INCLUDES -#include +#include // INTERNAL INCLUDES #include - 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 mCallbacks; bool mRunning; ///< flag is set to true if when running }; diff --git a/dali/internal/window-system/windows/platform-implement-win.cpp b/dali/internal/window-system/windows/platform-implement-win.cpp index 84bb736..13932b5 100755 --- a/dali/internal/window-system/windows/platform-implement-win.cpp +++ b/dali/internal/window-system/windows/platform-implement-win.cpp @@ -25,9 +25,10 @@ // INTERNAL INCLUDES #include +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( hWnd ), uMsg, wParam, lParam ); + WindowImpl::ProcWinMessage( reinterpret_cast( 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::iterator x = mHWndToListener.find( hWnd ); diff --git a/dali/internal/window-system/windows/platform-implement-win.h b/dali/internal/window-system/windows/platform-implement-win.h index 1425e29..7f1fe0a 100755 --- a/dali/internal/window-system/windows/platform-implement-win.h +++ b/dali/internal/window-system/windows/platform-implement-win.h @@ -37,8 +37,6 @@ namespace Adaptor namespace WindowsPlatformImplementation { -void RunLoop(); - bool PostWinThreadMessage( _In_ uint32_t Msg, _In_ uint32_t wParam, @@ -66,7 +64,7 @@ public: virtual ~WindowImpl(); - static void ProcWinMessge( uint64_t hWnd, uint32_t uMsg, uint64_t wParam, uint64_t lParam ); + static void ProcWinMessage( uint64_t hWnd, uint32_t uMsg, uint64_t wParam, uint64_t lParam ); void GetDPI( float &xDpi, float &yDpi ); -- 2.7.4