From: Heeyong Song Date: Mon, 25 Sep 2017 06:59:13 +0000 (+0900) Subject: Change to process events when the application is paused X-Git-Tag: dali_1.2.63~3^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F45%2F152145%2F7;p=platform%2Fcore%2Fuifw%2Fdali-core.git Change to process events when the application is paused Change-Id: I1a798c461962ce34eed99d97971a85012e1e08b4 --- diff --git a/automated-tests/src/dali-internal/utc-Dali-Internal-Core.cpp b/automated-tests/src/dali-internal/utc-Dali-Internal-Core.cpp index 77c7a1f..e12a27a 100644 --- a/automated-tests/src/dali-internal/utc-Dali-Internal-Core.cpp +++ b/automated-tests/src/dali-internal/utc-Dali-Internal-Core.cpp @@ -37,6 +37,34 @@ void utc_dali_internal_core_cleanup() test_return_value = TET_PASS; } +namespace +{ + +class RelayoutSignalHandler : public Dali::ConnectionTracker +{ +public: + + RelayoutSignalHandler( TestApplication& application ) + : mApplication( application ), + mSignalCalled( false ) + { + } + + // callback to be connected to RelayoutSignal + void RelayoutCallback( Actor actor ) + { + tet_infoline("RelayoutCallback is called"); + + mSignalCalled = true; + + mApplication.SendNotification(); + } + + TestApplication& mApplication; + bool mSignalCalled; +}; + +} // anonymous namespace int UtcDaliCoreTopMargin(void) { @@ -66,3 +94,30 @@ int UtcDaliCoreTopMargin(void) END_TEST; } + +int UtcDaliCoreProcessEvents(void) +{ + TestApplication application; + tet_infoline("Testing Dali::Integration::Core::ProcessEvents"); + + Vector3 size( 100.0f, 100.0f, 0.0f ); + Vector3 position( 100.0f, 100.0f, 0.0f ); + + Actor actor = Actor::New(); + actor.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS ); + actor.SetSize( size ); + actor.SetPosition( position ); + Stage::GetCurrent().Add( actor ); + + RelayoutSignalHandler relayoutSignal( application ); + actor.OnRelayoutSignal().Connect( &relayoutSignal, &RelayoutSignalHandler::RelayoutCallback ); + + application.SendNotification(); + + DALI_TEST_EQUALS( relayoutSignal.mSignalCalled, true, TEST_LOCATION ); + + DALI_TEST_EQUALS( actor.GetProperty( Actor::Property::SIZE ).Get< Vector3 >(), size, TEST_LOCATION ); + DALI_TEST_EQUALS( actor.GetProperty( Actor::Property::POSITION ).Get< Vector3 >(), position, TEST_LOCATION ); + + END_TEST; +} diff --git a/automated-tests/src/dali/dali-test-suite-utils/test-render-controller.cpp b/automated-tests/src/dali/dali-test-suite-utils/test-render-controller.cpp index f3b04ad..6f845d4 100644 --- a/automated-tests/src/dali/dali-test-suite-utils/test-render-controller.cpp +++ b/automated-tests/src/dali/dali-test-suite-utils/test-render-controller.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,12 +29,12 @@ TestRenderController::~TestRenderController() { } -void TestRenderController::RequestUpdate() +void TestRenderController::RequestUpdate( bool forceUpdate ) { mRequestUpdateCalled = true; } -void TestRenderController::RequestProcessEventsOnIdle() +void TestRenderController::RequestProcessEventsOnIdle( bool forceProcess ) { mRequestProcessEventsOnIdleCalled = true; } diff --git a/automated-tests/src/dali/dali-test-suite-utils/test-render-controller.h b/automated-tests/src/dali/dali-test-suite-utils/test-render-controller.h index b00fbf0..3ad63d3 100644 --- a/automated-tests/src/dali/dali-test-suite-utils/test-render-controller.h +++ b/automated-tests/src/dali/dali-test-suite-utils/test-render-controller.h @@ -2,7 +2,7 @@ #define __TEST_RENDER_CONTROLLER_H__ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,8 +31,8 @@ public: TestRenderController(); ~TestRenderController(); - virtual void RequestUpdate(); - virtual void RequestProcessEventsOnIdle(); + virtual void RequestUpdate( bool forceUpdate ); + virtual void RequestProcessEventsOnIdle( bool forceProcess ); typedef enum { diff --git a/dali/integration-api/core.cpp b/dali/integration-api/core.cpp index ca76112..0c6ef9b 100644 --- a/dali/integration-api/core.cpp +++ b/dali/integration-api/core.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -79,16 +79,6 @@ void Core::SetDpi(unsigned int dpiHorizontal, unsigned int dpiVertical) mImpl->SetDpi(dpiHorizontal, dpiVertical); } -void Core::Suspend() -{ - mImpl->Suspend(); -} - -void Core::Resume() -{ - mImpl->Resume(); -} - void Core::SceneCreated() { mImpl->SceneCreated(); diff --git a/dali/integration-api/core.h b/dali/integration-api/core.h index fed5246..2e41509 100644 --- a/dali/integration-api/core.h +++ b/dali/integration-api/core.h @@ -186,12 +186,6 @@ private: * * 7) Provide an implementation of the GestureManager interface, used to register gestures provided by the platform. * - * Suspend/Resume behaviour: - * - * The Core has no knowledge of the application lifecycle, but can be suspended. - * In the suspended state, input events will not be processed, and animations will not progress any further. - * The Core can still render in the suspended state; the same frame will be produced each time. - * * Multi-threading notes: * * The Dali API methods are not reentrant. If you access the API from multiple threads simultaneously, then the results @@ -304,25 +298,6 @@ public: // Core Lifecycle /** - * Put Core into the suspended state. - * Any ongoing event processing will be cancelled, for example multi-touch sequences. - * The core expects the system has suspended us. Animation time will continue during the suspended - * state. - * Multi-threading note: this method should be called from the main thread - * @post The Core is in the suspended state. - */ - void Suspend(); - - /** - * Resume the Core from the suspended state. - * At the first update, the elapsed time passed to the animations will be equal to the time spent - * suspended. - * Multi-threading note: this method should be called from the main thread - * @post The Core is not in the suspended state. - */ - void Resume(); - - /** * Notify Core that the scene has been created. */ void SceneCreated(); diff --git a/dali/integration-api/render-controller.h b/dali/integration-api/render-controller.h index 253c67e..3bdb112 100644 --- a/dali/integration-api/render-controller.h +++ b/dali/integration-api/render-controller.h @@ -2,7 +2,7 @@ #define __DALI_INTEGRATION_RENDER_CONTROLLER_H__ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,14 +43,16 @@ public: * Requests a future call to Dali::Integration::Core::Update(). * This is called when Dali has new content, typically in response to Actors/Animations being added. * Multi-threading note: this method will be called from the main thread only. + * @param[in] forceUpdate true to update forcely. */ - virtual void RequestUpdate() = 0; + virtual void RequestUpdate( bool forceUpdate ) = 0; /** * Requests a future call to Dali::Integration::Core::ProcessEvents(), when the application is idle. * Multi-threading note: this method will be called from the main thread only. + * @param[in] forceProcess true to process events forcely. */ - virtual void RequestProcessEventsOnIdle() = 0; + virtual void RequestProcessEventsOnIdle( bool forceProcess ) = 0; }; diff --git a/dali/internal/common/core-impl.cpp b/dali/internal/common/core-impl.cpp index d176f70..aa6eb19 100644 --- a/dali/internal/common/core-impl.cpp +++ b/dali/internal/common/core-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -83,7 +83,6 @@ Core::Core( RenderController& renderController, PlatformAbstraction& platform, GestureManager& gestureManager, ResourcePolicy::DataRetention dataRetentionPolicy) : mRenderController( renderController ), mPlatform(platform), - mIsActive(true), mProcessingEvent(false) { // Create the thread local storage @@ -117,7 +116,7 @@ Core::Core( RenderController& renderController, PlatformAbstraction& platform, mRenderManager->SetShaderSaver( *mUpdateManager ); - mStage = IntrusivePtr( Stage::New( *mAnimationPlaylist, *mPropertyNotificationManager, *mUpdateManager, *mNotificationManager ) ); + mStage = IntrusivePtr( Stage::New( *mAnimationPlaylist, *mPropertyNotificationManager, *mUpdateManager, *mNotificationManager, mRenderController ) ); // This must be called after stage is created but before stage initialization mRelayoutController = IntrusivePtr< RelayoutController >( new RelayoutController( mRenderController ) ); @@ -229,19 +228,6 @@ void Core::Render( RenderStatus& status ) mRenderManager->Render( status ); } -void Core::Suspend() -{ - mIsActive = false; -} - -void Core::Resume() -{ - mIsActive = true; - - // trigger processing of events queued up while paused - ProcessEvents(); -} - void Core::SceneCreated() { mStage->EmitSceneCreatedSignal(); @@ -260,7 +246,7 @@ void Core::ProcessEvents() if( mProcessingEvent ) { DALI_LOG_ERROR( "ProcessEvents should not be called from within ProcessEvents!\n" ); - mRenderController.RequestProcessEventsOnIdle(); + mRenderController.RequestProcessEventsOnIdle( false ); return; } @@ -274,29 +260,27 @@ void Core::ProcessEvents() mNotificationManager->ProcessMessages(); - // Avoid allocating MessageBuffers, triggering size-negotiation or sending any other spam whilst paused - if( mIsActive ) - { - // Emit signal here to inform listeners that event processing has finished. - mStage->EmitEventProcessingFinishedSignal(); + // Emit signal here to inform listeners that event processing has finished. + mStage->EmitEventProcessingFinishedSignal(); - // Run the size negotiation after event processing finished signal - mRelayoutController->Relayout(); + // Run the size negotiation after event processing finished signal + mRelayoutController->Relayout(); - // Rebuild depth tree after event processing has finished - mStage->RebuildDepthTree(); + // Rebuild depth tree after event processing has finished + mStage->RebuildDepthTree(); - // Flush any queued messages for the update-thread - const bool messagesToProcess = mUpdateManager->FlushQueue(); + // Flush any queued messages for the update-thread + const bool messagesToProcess = mUpdateManager->FlushQueue(); - // Check if the touch or gestures require updates. - const bool gestureNeedsUpdate = mGestureEventProcessor->NeedsUpdate(); + // Check if the touch or gestures require updates. + const bool gestureNeedsUpdate = mGestureEventProcessor->NeedsUpdate(); + // Check if the next update is forced. + const bool forceUpdate = mStage->IsNextUpdateForced(); - if( messagesToProcess || gestureNeedsUpdate ) - { - // tell the render controller to keep update thread running - mRenderController.RequestUpdate(); - } + if( messagesToProcess || gestureNeedsUpdate || forceUpdate ) + { + // tell the render controller to keep update thread running + mRenderController.RequestUpdate( forceUpdate ); } mRelayoutController->SetProcessingCoreEvents( false ); diff --git a/dali/internal/common/core-impl.h b/dali/internal/common/core-impl.h index 17bc172..49d7b33 100644 --- a/dali/internal/common/core-impl.h +++ b/dali/internal/common/core-impl.h @@ -2,7 +2,7 @@ #define DALI_INTERNAL_CORE_H /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -137,16 +137,6 @@ public: void Render( Integration::RenderStatus& status ); /** - * @copydoc Dali::Integration::Core::Suspend() - */ - void Suspend(); - - /** - * @copydoc Dali::Integration::Core::Resume() - */ - void Resume(); - - /** * @copydoc Dali::Integration::Core::SceneCreated() */ void SceneCreated(); @@ -265,7 +255,6 @@ private: AnimationPlaylistOwner mAnimationPlaylist; ///< For 'Fire and forget' animation support OwnerPointer mPropertyNotificationManager; ///< For safe signal emmision of property changed notifications IntrusivePtr< RelayoutController > mRelayoutController; ///< Size negotiation relayout controller - bool mIsActive : 1; ///< Whether Core is active or suspended bool mProcessingEvent : 1; ///< True during ProcessEvents() OwnerPointer mRenderTaskProcessor; ///< Handles the processing of render tasks diff --git a/dali/internal/event/common/event-thread-services.h b/dali/internal/event/common/event-thread-services.h index eb2d345..c21c835 100644 --- a/dali/internal/event/common/event-thread-services.h +++ b/dali/internal/event/common/event-thread-services.h @@ -2,7 +2,7 @@ #define __DALI_INTERNAL_EVENT_THREAD_SERVICES_H__ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,11 @@ namespace Dali class BaseObject; +namespace Integration +{ +class RenderController; +} + namespace Internal { @@ -74,6 +79,13 @@ public: virtual SceneGraph::UpdateManager& GetUpdateManager() = 0; /** + * @brief Get a reference to the RenderController + * + * @return the render controller + */ + virtual Integration::RenderController& GetRenderController() = 0; + + /** * Reserve space for another message in the queue; this must then be initialized by the caller. * The message will be read from the update-thread after the next FlushMessages is called. * @post Calling this method may invalidate any previously returned slots. @@ -89,6 +101,18 @@ public: virtual BufferIndex GetEventBufferIndex() const = 0; /** + * @brief Indicate that the next rendering is really required. + */ + virtual void ForceNextUpdate() = 0; + + /** + * @brief Check if the next rendering is really required. + * + * @return true if the next rendering is really required. + */ + virtual bool IsNextUpdateForced() = 0; + + /** * @return true if core is still running and we can send messages */ static bool IsCoreRunning(); diff --git a/dali/internal/event/common/stage-impl.cpp b/dali/internal/event/common/stage-impl.cpp index 997bb3a..9e10b2e 100644 --- a/dali/internal/event/common/stage-impl.cpp +++ b/dali/internal/event/common/stage-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -89,9 +89,10 @@ SignalConnectorType signalConnector9( mType, SIGNAL_TOUCH, & StagePtr Stage::New( AnimationPlaylist& playlist, PropertyNotificationManager& propertyNotificationManager, SceneGraph::UpdateManager& updateManager, - NotificationManager& notificationManager ) + NotificationManager& notificationManager, + Integration::RenderController& renderController ) { - return StagePtr( new Stage( playlist, propertyNotificationManager, updateManager, notificationManager ) ); + return StagePtr( new Stage( playlist, propertyNotificationManager, updateManager, notificationManager, renderController ) ); } void Stage::Initialize() @@ -697,18 +698,21 @@ void Stage::RebuildDepthTree() Stage::Stage( AnimationPlaylist& playlist, PropertyNotificationManager& propertyNotificationManager, SceneGraph::UpdateManager& updateManager, - NotificationManager& notificationManager ) + NotificationManager& notificationManager, + Integration::RenderController& renderController ) : mAnimationPlaylist( playlist ), - mPropertyNotificationManager(propertyNotificationManager), - mUpdateManager(updateManager), - mNotificationManager(notificationManager), - mSize(Vector2::ZERO), - mBackgroundColor(Dali::Stage::DEFAULT_BACKGROUND_COLOR), + mPropertyNotificationManager( propertyNotificationManager ), + mUpdateManager( updateManager ), + mNotificationManager( notificationManager ), + mRenderController( renderController ), + mSize( Vector2::ZERO ), + mBackgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ), mViewMode( MONO ), mStereoBase( DEFAULT_STEREO_BASE ), mTopMargin( 0 ), - mSystemOverlay(NULL), - mDepthTreeDirty( false ) + mSystemOverlay( NULL ), + mDepthTreeDirty( false ), + mForceNextUpdate( false ) { } @@ -717,6 +721,11 @@ SceneGraph::UpdateManager& Stage::GetUpdateManager() return mUpdateManager; } +Integration::RenderController& Stage::GetRenderController() +{ + return mRenderController; +} + unsigned int* Stage::ReserveMessageSlot( std::size_t size, bool updateScene ) { return mUpdateManager.ReserveMessageSlot( size, updateScene ); @@ -727,6 +736,18 @@ BufferIndex Stage::GetEventBufferIndex() const return mUpdateManager.GetEventBufferIndex(); } +void Stage::ForceNextUpdate() +{ + mForceNextUpdate = true; +} + +bool Stage::IsNextUpdateForced() +{ + bool nextUpdateForced = mForceNextUpdate; + mForceNextUpdate = false; + return nextUpdateForced; +} + Stage::~Stage() { delete mSystemOverlay; diff --git a/dali/internal/event/common/stage-impl.h b/dali/internal/event/common/stage-impl.h index 52d68ee..7ff94ba 100644 --- a/dali/internal/event/common/stage-impl.h +++ b/dali/internal/event/common/stage-impl.h @@ -2,7 +2,7 @@ #define __DALI_INTERNAL_STAGE_H__ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -45,6 +45,7 @@ struct Vector2; namespace Integration { class SystemOverlay; +class RenderController; } namespace Internal @@ -76,11 +77,13 @@ public: * @param[in] propertyNotificationManager * @param[in] updateManager * @param[in] notificationManager + * @param[in] renderController */ static StagePtr New( AnimationPlaylist& playlist, PropertyNotificationManager& propertyNotificationManager, SceneGraph::UpdateManager& updateManager, - NotificationManager& notificationManager ); + NotificationManager& notificationManager, + Integration::RenderController& renderController ); /** * Initialize the stage. @@ -425,6 +428,11 @@ public: // Implementation of EventThreadServices virtual SceneGraph::UpdateManager& GetUpdateManager(); /** + * @copydoc EventThreadServices::GetRenderController + */ + virtual Integration::RenderController& GetRenderController(); + + /** * @copydoc EventThreadServices::ReserveMessageSlot */ virtual unsigned int* ReserveMessageSlot( std::size_t size, bool updateScene ); @@ -435,6 +443,16 @@ public: // Implementation of EventThreadServices virtual BufferIndex GetEventBufferIndex() const; /** + * @copydoc EventThreadServices::ForceNextUpdate + */ + virtual void ForceNextUpdate(); + + /** + * @copydoc EventThreadServices::IsNextUpdateForced + */ + virtual bool IsNextUpdateForced(); + + /** * Request that the depth tree is rebuilt */ void RequestRebuildDepthTree(); @@ -453,7 +471,8 @@ private: Stage( AnimationPlaylist& playlist, PropertyNotificationManager& propertyNotificationManager, SceneGraph::UpdateManager& updateManager, - NotificationManager& notificationManager ); + NotificationManager& notificationManager, + Integration::RenderController& renderController ); /** * A reference counted object may only be deleted by calling Unreference() @@ -471,6 +490,8 @@ private: NotificationManager& mNotificationManager; + Integration::RenderController& mRenderController; + // The stage-size may be less than surface-size (reduced by top-margin) Vector2 mSize; Vector2 mSurfaceSize; @@ -504,6 +525,9 @@ private: Integration::SystemOverlay* mSystemOverlay; ///< SystemOverlay stage access + bool mDepthTreeDirty; ///< True if the depth tree needs recalculating + bool mForceNextUpdate; ///< True if the next rendering is really required. + // The key event signal Dali::Stage::KeyEventSignalType mKeyEventSignal; Dali::DevelStage::KeyEventGeneratedSignalType mKeyEventGeneratedSignal; @@ -514,7 +538,6 @@ private: // The touched signals Dali::Stage::TouchedSignalType mTouchedSignal; Dali::Stage::TouchSignalType mTouchSignal; - bool mDepthTreeDirty; ///< True if the depth tree needs recalculating // The wheel event signal Dali::Stage::WheelEventSignalType mWheelEventSignal; diff --git a/dali/internal/event/events/gesture-event-processor.cpp b/dali/internal/event/events/gesture-event-processor.cpp index a6ad63a..6a5b938 100644 --- a/dali/internal/event/events/gesture-event-processor.cpp +++ b/dali/internal/event/events/gesture-event-processor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -194,7 +194,7 @@ void GestureEventProcessor::SetGestureProperties( const Gesture& gesture ) SetUpdateRequired(); // We may not be updating so we need to ask the render controller for an update. - mRenderController.RequestUpdate(); + mRenderController.RequestUpdate( false ); } switch ( gesture.type ) diff --git a/dali/internal/event/rendering/texture-impl.cpp b/dali/internal/event/rendering/texture-impl.cpp index 5044890..3c3bbbd 100644 --- a/dali/internal/event/rendering/texture-impl.cpp +++ b/dali/internal/event/rendering/texture-impl.cpp @@ -21,6 +21,7 @@ // INTERNAL INCLUDES #include #include +#include namespace Dali { @@ -151,6 +152,11 @@ bool Texture::Upload( PixelDataPtr pixelData, static_cast< uint16_t >( width ), static_cast< uint16_t >( height ) }; UploadTextureMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject, pixelData, params ); + + // Request event processing and update forcely + mEventThreadServices.GetRenderController().RequestProcessEventsOnIdle( true ); + mEventThreadServices.ForceNextUpdate(); + result = true; } } diff --git a/dali/internal/event/size-negotiation/relayout-controller-impl.cpp b/dali/internal/event/size-negotiation/relayout-controller-impl.cpp index 0b3ec2c..4e468f4 100644 --- a/dali/internal/event/size-negotiation/relayout-controller-impl.cpp +++ b/dali/internal/event/size-negotiation/relayout-controller-impl.cpp @@ -199,7 +199,7 @@ void RelayoutController::RequestRelayout( Dali::Actor& actor, Dimension::Type di if ( !mProcessingCoreEvents ) { - mRenderController.RequestProcessEventsOnIdle(); + mRenderController.RequestProcessEventsOnIdle( false ); } } diff --git a/dali/internal/update/queue/update-message-queue.cpp b/dali/internal/update/queue/update-message-queue.cpp index 29b32ba..330234d 100644 --- a/dali/internal/update/queue/update-message-queue.cpp +++ b/dali/internal/update/queue/update-message-queue.cpp @@ -193,7 +193,7 @@ unsigned int* MessageQueue::ReserveMessageSlot( unsigned int requestedSize, bool // If we are outside, then we have to request a call to Core::ProcessEvents() on idle. if ( false == mImpl->processingEvents ) { - mImpl->renderController.RequestProcessEventsOnIdle(); + mImpl->renderController.RequestProcessEventsOnIdle( false ); } return mImpl->currentMessageBuffer->ReserveMessageSlot( requestedSize );