2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "adaptor-impl.h"
22 #include <boost/thread/tss.hpp>
23 #include <dali/public-api/common/dali-common.h>
24 #include <dali/integration-api/debug.h>
25 #include <dali/integration-api/core.h>
26 #include <dali/integration-api/context-notifier.h>
27 #include <dali/integration-api/profiling.h>
28 #include <dali/integration-api/input-options.h>
29 #include <dali/integration-api/events/touch-event-integ.h>
32 #include <base/update-render-controller.h>
33 #include <base/environment-variables.h>
34 #include <base/performance-logging/performance-interface-factory.h>
35 #include <base/lifecycle-observer.h>
37 #include <callback-manager.h>
38 #include <trigger-event.h>
39 #include <window-render-surface.h>
40 #include <render-surface-impl.h>
41 #include <tts-player-impl.h>
42 #include <accessibility-manager-impl.h>
43 #include <timer-impl.h>
44 #include <events/gesture-manager.h>
45 #include <events/event-handler.h>
46 #include <feedback/feedback-controller.h>
47 #include <feedback/feedback-plugin-proxy.h>
48 #include <gl/gl-proxy-implementation.h>
49 #include <gl/gl-implementation.h>
50 #include <gl/egl-sync-implementation.h>
51 #include <gl/egl-image-extensions.h>
52 #include <gl/egl-factory.h>
53 #include <imf-manager-impl.h>
54 #include <clipboard-impl.h>
55 #include <vsync-monitor.h>
56 #include <object-profiler.h>
58 #include <slp-logging.h>
73 boost::thread_specific_ptr<Adaptor> gThreadLocalAdaptor;
75 unsigned int GetIntegerEnvironmentVariable( const char* variable, unsigned int defaultValue )
77 const char* variableParameter = std::getenv(variable);
79 // if the parameter exists convert it to an integer, else return the default value
80 unsigned int intValue = variableParameter ? atoi(variableParameter) : defaultValue;
84 bool GetIntegerEnvironmentVariable( const char* variable, int& intValue )
86 const char* variableParameter = std::getenv(variable);
88 if( !variableParameter )
92 // if the parameter exists convert it to an integer, else return the default value
93 intValue = atoi(variableParameter);
97 bool GetFloatEnvironmentVariable( const char* variable, float& floatValue )
99 const char* variableParameter = std::getenv(variable);
101 if( !variableParameter )
105 // if the parameter exists convert it to an integer, else return the default value
106 floatValue = atof(variableParameter);
110 } // unnamed namespace
112 Dali::Adaptor* Adaptor::New( RenderSurface *surface, const DeviceLayout& baseLayout,
113 Dali::Configuration::ContextLoss configuration )
115 DALI_ASSERT_ALWAYS( surface->GetType() != Dali::RenderSurface::NO_SURFACE && "No surface for adaptor" );
117 Dali::Adaptor* adaptor = new Dali::Adaptor;
118 Adaptor* impl = new Adaptor( *adaptor, surface, baseLayout );
119 adaptor->mImpl = impl;
121 impl->Initialize(configuration);
126 void Adaptor::ParseEnvironmentOptions()
128 // get logging options
129 unsigned int logFrameRateFrequency = GetIntegerEnvironmentVariable( DALI_ENV_FPS_TRACKING, 0 );
130 unsigned int logupdateStatusFrequency = GetIntegerEnvironmentVariable( DALI_ENV_UPDATE_STATUS_INTERVAL, 0 );
131 unsigned int logPerformanceStats = GetIntegerEnvironmentVariable( DALI_ENV_LOG_PERFORMANCE_STATS, 0 );
132 unsigned int logPerformanceStatsFrequency = GetIntegerEnvironmentVariable( DALI_ENV_LOG_PERFORMANCE_STATS_FREQUENCY, 0 );
133 unsigned int performanceTimeStampOutput= GetIntegerEnvironmentVariable( DALI_ENV_PERFORMANCE_TIMESTAMP_OUTPUT, 0 );
136 unsigned int logPanGesture = GetIntegerEnvironmentVariable( DALI_ENV_LOG_PAN_GESTURE, 0 );
138 // all threads here (event, update, and render) will send their logs to SLP Platform's LogMessage handler.
139 Dali::Integration::Log::LogFunction logFunction(Dali::SlpPlatform::LogMessage);
141 mEnvironmentOptions.SetLogOptions( logFunction, logFrameRateFrequency, logupdateStatusFrequency, logPerformanceStats, logPerformanceStatsFrequency, performanceTimeStampOutput, logPanGesture );
144 if( GetIntegerEnvironmentVariable(DALI_ENV_PAN_PREDICTION_MODE, predictionMode) )
146 mEnvironmentOptions.SetPanGesturePredictionMode(predictionMode);
148 int predictionAmount(-1);
149 if( GetIntegerEnvironmentVariable(DALI_ENV_PAN_PREDICTION_AMOUNT, predictionAmount) )
151 if( predictionAmount < 0 )
153 // do not support times in the past
154 predictionAmount = 0;
156 mEnvironmentOptions.SetPanGesturePredictionAmount(predictionAmount);
158 int minPredictionAmount(-1);
159 if( GetIntegerEnvironmentVariable(DALI_ENV_PAN_MIN_PREDICTION_AMOUNT, minPredictionAmount) )
161 if( minPredictionAmount < 0 )
163 // do not support times in the past
164 minPredictionAmount = 0;
166 mEnvironmentOptions.SetPanGestureMinimumPredictionAmount(minPredictionAmount);
168 int maxPredictionAmount(-1);
169 if( GetIntegerEnvironmentVariable(DALI_ENV_PAN_MAX_PREDICTION_AMOUNT, maxPredictionAmount) )
171 if( minPredictionAmount > -1 && maxPredictionAmount < minPredictionAmount )
173 // maximum amount should not be smaller than minimum amount
174 maxPredictionAmount = minPredictionAmount;
176 mEnvironmentOptions.SetPanGestureMaximumPredictionAmount(maxPredictionAmount);
178 int predictionAmountAdjustment(-1);
179 if( GetIntegerEnvironmentVariable(DALI_ENV_PAN_PREDICTION_AMOUNT_ADJUSTMENT, predictionAmountAdjustment) )
181 if( predictionAmountAdjustment < 0 )
183 // negative amount doesn't make sense
184 predictionAmountAdjustment = 0;
186 mEnvironmentOptions.SetPanGesturePredictionAmountAdjustment(predictionAmountAdjustment);
189 if( GetIntegerEnvironmentVariable(DALI_ENV_PAN_SMOOTHING_MODE, smoothingMode) )
191 mEnvironmentOptions.SetPanGestureSmoothingMode(smoothingMode);
193 float smoothingAmount = 1.0f;
194 if( GetFloatEnvironmentVariable(DALI_ENV_PAN_SMOOTHING_AMOUNT, smoothingAmount) )
196 smoothingAmount = Clamp(smoothingAmount, 0.0f, 1.0f);
197 mEnvironmentOptions.SetPanGestureSmoothingAmount(smoothingAmount);
200 int minimumDistance(-1);
201 if ( GetIntegerEnvironmentVariable(DALI_ENV_PAN_MINIMUM_DISTANCE, minimumDistance ))
203 mEnvironmentOptions.SetMinimumPanDistance( minimumDistance );
206 int minimumEvents(-1);
207 if ( GetIntegerEnvironmentVariable(DALI_ENV_PAN_MINIMUM_EVENTS, minimumEvents ))
209 mEnvironmentOptions.SetMinimumPanEvents( minimumEvents );
213 if ( GetIntegerEnvironmentVariable(DALI_GLES_CALL_TIME, glesCallTime ))
215 mEnvironmentOptions.SetGlesCallTime( glesCallTime );
218 mEnvironmentOptions.InstallLogFunction();
221 void Adaptor::Initialize(Dali::Configuration::ContextLoss configuration)
223 ParseEnvironmentOptions();
225 mPlatformAbstraction = new SlpPlatform::SlpPlatformAbstraction;
227 ResourcePolicy::DataRetention dataRetentionPolicy = ResourcePolicy::DALI_DISCARDS_ALL_DATA;
228 if( configuration == Dali::Configuration::APPLICATION_DOES_NOT_HANDLE_CONTEXT_LOSS )
230 dataRetentionPolicy = ResourcePolicy::DALI_RETAINS_MESH_DATA;
232 // Note, Tizen does not use DALI_RETAINS_ALL_DATA, as it can reload images from
233 // files automatically.
235 if( mEnvironmentOptions.PerformanceServerRequired() )
237 mPerformanceInterface = PerformanceInterfaceFactory::CreateInterface( *this, mEnvironmentOptions );
240 mCallbackManager = CallbackManager::New();
242 PositionSize size = mSurface->GetPositionSize();
244 mGestureManager = new GestureManager(*this, Vector2(size.width, size.height), mCallbackManager, mEnvironmentOptions);
246 if( mEnvironmentOptions.GetGlesCallTime() > 0 )
248 mGLES = new GlProxyImplementation( mEnvironmentOptions );
252 mGLES = new GlImplementation();
255 mEglFactory = new EglFactory();
257 EglSyncImplementation* eglSyncImpl = mEglFactory->GetSyncImplementation();
259 mCore = Integration::Core::New( *this, *mPlatformAbstraction, *mGLES, *eglSyncImpl, *mGestureManager, dataRetentionPolicy );
261 mObjectProfiler = new ObjectProfiler();
263 mNotificationTrigger = new TriggerEvent( boost::bind(&Adaptor::ProcessCoreEvents, this) );
265 mVSyncMonitor = new VSyncMonitor;
267 mUpdateRenderController = new UpdateRenderController( *this, mEnvironmentOptions );
269 mDaliFeedbackPlugin = new FeedbackPluginProxy( FeedbackPluginProxy::DEFAULT_OBJECT_NAME );
271 // Should be called after Core creation
272 if( mEnvironmentOptions.GetPanGestureLoggingLevel() )
274 Integration::EnableProfiling( Dali::Integration::PROFILING_TYPE_PAN_GESTURE );
276 if( mEnvironmentOptions.GetPanGesturePredictionMode() >= 0 )
278 Integration::SetPanGesturePredictionMode(mEnvironmentOptions.GetPanGesturePredictionMode());
280 if( mEnvironmentOptions.GetPanGesturePredictionAmount() >= 0 )
282 Integration::SetPanGesturePredictionAmount(mEnvironmentOptions.GetPanGesturePredictionAmount());
284 if( mEnvironmentOptions.GetPanGestureMaximumPredictionAmount() >= 0 )
286 Integration::SetPanGestureMaximumPredictionAmount(mEnvironmentOptions.GetPanGestureMaximumPredictionAmount());
288 if( mEnvironmentOptions.GetPanGestureMinimumPredictionAmount() >= 0 )
290 Integration::SetPanGestureMinimumPredictionAmount(mEnvironmentOptions.GetPanGestureMinimumPredictionAmount());
292 if( mEnvironmentOptions.GetPanGesturePredictionAmountAdjustment() >= 0 )
294 Integration::SetPanGesturePredictionAmountAdjustment(mEnvironmentOptions.GetPanGesturePredictionAmountAdjustment());
296 if( mEnvironmentOptions.GetPanGestureSmoothingMode() >= 0 )
298 Integration::SetPanGestureSmoothingMode(mEnvironmentOptions.GetPanGestureSmoothingMode());
300 if( mEnvironmentOptions.GetPanGestureSmoothingAmount() >= 0.0f )
302 Integration::SetPanGestureSmoothingAmount(mEnvironmentOptions.GetPanGestureSmoothingAmount());
308 // Ensure stop status
311 // Release first as we do not want any access to Adaptor as it is being destroyed.
312 gThreadLocalAdaptor.release();
314 for ( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
316 (*iter)->OnDestroy();
319 delete mUpdateRenderController; // this will shutdown render thread, which will call Core::ContextDestroyed before exit
320 delete mVSyncMonitor;
321 delete mEventHandler;
322 delete mObjectProfiler;
326 // Delete feedback controller before feedback plugin & style monitor dependencies
327 delete mFeedbackController;
328 delete mDaliFeedbackPlugin;
330 delete mGestureManager;
331 delete mPlatformAbstraction;
332 delete mCallbackManager;
333 delete mPerformanceInterface;
335 // uninstall it on this thread (main actor thread)
336 Dali::Integration::Log::UninstallLogFunction();
339 void Adaptor::Start()
341 // it doesn't support restart after stop at this moment
342 // to support restarting, need more testing
343 if( READY != mState )
348 // Start the callback manager
349 mCallbackManager->Start();
351 // create event handler
352 mEventHandler = new EventHandler( mSurface, *this, *mGestureManager, *this, mDragAndDropDetector );
354 if( mDeferredRotationObserver != NULL )
356 mEventHandler->SetRotationObserver(mDeferredRotationObserver);
357 mDeferredRotationObserver = NULL;
360 // guarantee map the surface before starting render-thread.
363 // NOTE: dpi must be set before starting the render thread
364 // use default or command line settings if not run on device
366 // set the DPI value for font rendering
367 unsigned int dpiHor, dpiVer;
369 mSurface->GetDpi(dpiHor, dpiVer);
371 // tell core about the value
372 mCore->SetDpi(dpiHor, dpiVer);
374 mCore->SetDpi(mHDpi, mVDpi);
377 // Tell the core the size of the surface just before we start the render-thread
378 PositionSize size = mSurface->GetPositionSize();
379 mCore->SurfaceResized( size.width, size.height );
381 // Start the update & render threads
382 mUpdateRenderController->Start();
386 ProcessCoreEvents(); // Ensure any startup messages are processed.
388 if ( !mFeedbackController )
390 // Start sound & haptic feedback
391 mFeedbackController = new FeedbackController( *mDaliFeedbackPlugin );
394 for ( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
400 // Dali::Internal::Adaptor::Adaptor::Pause
401 void Adaptor::Pause()
403 // Only pause the adaptor if we're actually running.
404 if( RUNNING == mState )
406 // Inform observers that we are about to be paused.
407 for( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
412 // Reset the event handler when adaptor paused
415 mEventHandler->Reset();
418 mUpdateRenderController->Pause();
424 // Dali::Internal::Adaptor::Adaptor::Resume
425 void Adaptor::Resume()
427 // Only resume the adaptor if we are in the suspended state.
428 if( PAUSED == mState )
430 // We put ResumeFrameTime first, as this was originally called at the start of mCore->Resume()
431 // If there were events pending, mCore->Resume() will call
432 // RenderController->RequestUpdate()
433 // UpdateRenderController->RequestUpdate()
434 // UpdateRenderSynchronization->RequestUpdate()
435 // and we should have reset the frame timers before allowing Core->Update() to be called.
436 //@todo Should we call UpdateRenderController->Resume before mCore->Resume()?
438 mUpdateRenderController->ResumeFrameTime();
440 mUpdateRenderController->Resume();
444 // Reset the event handler when adaptor resumed
447 mEventHandler->Reset();
450 // Inform observers that we have resumed.
451 for( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
456 ProcessCoreEvents(); // Ensure any outstanding messages are processed
462 if( RUNNING == mState ||
464 PAUSED_WHILE_HIDDEN == mState )
466 for( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
471 mUpdateRenderController->Stop();
474 // Delete the TTS player
475 for(int i =0; i < Dali::TtsPlayer::MODE_NUM; i++)
479 mTtsPlayers[i].Reset();
483 delete mEventHandler;
484 mEventHandler = NULL;
486 delete mNotificationTrigger;
487 mNotificationTrigger = NULL;
489 mCallbackManager->Stop();
495 void Adaptor::FeedTouchPoint( TouchPoint& point, int timeStamp )
497 mEventHandler->FeedTouchPoint( point, timeStamp );
500 void Adaptor::FeedWheelEvent( MouseWheelEvent& wheelEvent )
502 mEventHandler->FeedWheelEvent( wheelEvent );
505 void Adaptor::FeedKeyEvent( KeyEvent& keyEvent )
507 mEventHandler->FeedKeyEvent( keyEvent );
510 bool Adaptor::MoveResize( const PositionSize& positionSize )
512 PositionSize old = mSurface->GetPositionSize();
514 // just resize the surface. The driver should automatically resize the egl Surface (untested)
515 // EGL Spec says : EGL window surfaces need to be resized when their corresponding native window
516 // is resized. Implementations typically use hooks into the OS and native window
517 // system to perform this resizing on demand, transparently to the client.
518 mSurface->MoveResize( positionSize );
520 if(old.width != positionSize.width || old.height != positionSize.height)
522 SurfaceSizeChanged(positionSize);
528 void Adaptor::SurfaceResized( const PositionSize& positionSize )
530 PositionSize old = mSurface->GetPositionSize();
532 // Called by an application, when it has resized a window outside of Dali.
533 // The EGL driver automatically detects X Window resize calls, and resizes
534 // the EGL surface for us.
535 mSurface->MoveResize( positionSize );
537 if(old.width != positionSize.width || old.height != positionSize.height)
539 SurfaceSizeChanged(positionSize);
543 void Adaptor::ReplaceSurface( Dali::RenderSurface& surface )
545 // adaptor implementation needs the implementation of
546 RenderSurface* internalSurface = dynamic_cast<Internal::Adaptor::RenderSurface*>( &surface );
547 DALI_ASSERT_ALWAYS( internalSurface && "Incorrect surface" );
549 ECore::WindowRenderSurface* windowSurface = dynamic_cast<Internal::Adaptor::ECore::WindowRenderSurface*>( &surface);
550 if( windowSurface != NULL )
552 windowSurface->Map();
553 // @todo Restart event handler with new surface
556 mSurface = internalSurface;
558 SurfaceSizeChanged( internalSurface->GetPositionSize() );
560 // flush the event queue to give update and render threads chance
561 // to start processing messages for new camera setup etc as soon as possible
564 mCore->GetContextNotifier()->NotifyContextLost(); // Inform stage
566 // this method blocks until the render thread has completed the replace.
567 mUpdateRenderController->ReplaceSurface(internalSurface);
569 // Inform core, so that texture resources can be reloaded
570 mCore->RecoverFromContextLoss();
572 mCore->GetContextNotifier()->NotifyContextRegained(); // Inform stage
575 Dali::RenderSurface& Adaptor::GetSurface() const
580 void Adaptor::ReleaseSurfaceLock()
582 mSurface->ReleaseLock();
585 Dali::TtsPlayer Adaptor::GetTtsPlayer(Dali::TtsPlayer::Mode mode)
587 if(!mTtsPlayers[mode])
589 // Create the TTS player when it needed, because it can reduce launching time.
590 mTtsPlayers[mode] = TtsPlayer::New(mode);
593 return mTtsPlayers[mode];
596 bool Adaptor::AddIdle(boost::function<void(void)> callBack)
598 bool idleAdded(false);
600 // Only add an idle if the Adaptor is actually running
601 if( RUNNING == mState )
603 idleAdded = mCallbackManager->AddCallback(callBack, CallbackManager::IDLE_PRIORITY);
609 bool Adaptor::CallFromMainLoop(boost::function<void(void)> callBack)
611 bool callAdded(false);
613 // Only allow the callback if the Adaptor is actually running
614 if ( RUNNING == mState )
616 callAdded = mCallbackManager->AddCallback(callBack, CallbackManager::DEFAULT_PRIORITY);
622 Dali::Adaptor& Adaptor::Get()
624 DALI_ASSERT_ALWAYS( gThreadLocalAdaptor.get() != NULL && "Adaptor not instantiated" );
625 return gThreadLocalAdaptor->mAdaptor;
628 bool Adaptor::IsAvailable()
630 return gThreadLocalAdaptor.get() != NULL;
633 Dali::Integration::Core& Adaptor::GetCore()
638 void Adaptor::SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender )
640 mUpdateRenderController->SetRenderRefreshRate( numberOfVSyncsPerRender );
643 void Adaptor::SetUseHardwareVSync( bool useHardware )
645 mVSyncMonitor->SetUseHardwareVSync( useHardware );
648 void Adaptor::SetDpi(size_t hDpi, size_t vDpi)
654 EglFactory& Adaptor::GetEGLFactory() const
656 DALI_ASSERT_DEBUG( mEglFactory && "EGL Factory not created" );
660 EglFactoryInterface& Adaptor::GetEGLFactoryInterface() const
665 Integration::GlAbstraction& Adaptor::GetGlAbstraction() const
667 DALI_ASSERT_DEBUG( mGLES && "GLImplementation not created" );
671 Dali::Integration::PlatformAbstraction& Adaptor::GetPlatformAbstractionInterface()
673 return *mPlatformAbstraction;
676 Dali::Integration::GlAbstraction& Adaptor::GetGlesInterface()
681 TriggerEventInterface& Adaptor::GetTriggerEventInterface()
683 return *mNotificationTrigger;
685 TriggerEventFactoryInterface& Adaptor::GetTriggerEventFactoryInterface()
687 return mTriggerEventFactory;
689 RenderSurface* Adaptor::GetRenderSurfaceInterface()
693 VSyncMonitorInterface* Adaptor::GetVSyncMonitorInterface()
695 return mVSyncMonitor;
698 KernelTraceInterface& Adaptor::GetKernelTraceInterface()
700 return mKernelTracer;
703 PerformanceInterface* Adaptor::GetPerformanceInterface()
705 return mPerformanceInterface;
708 Integration::PlatformAbstraction& Adaptor::GetPlatformAbstraction() const
710 DALI_ASSERT_DEBUG( mPlatformAbstraction && "PlatformAbstraction not created" );
711 return *mPlatformAbstraction;
714 void Adaptor::SetDragAndDropDetector( DragAndDropDetectorPtr detector )
716 mDragAndDropDetector = detector;
720 mEventHandler->SetDragAndDropDetector( detector );
724 void Adaptor::SetRotationObserver( RotationObserver* observer )
728 mEventHandler->SetRotationObserver( observer );
730 else if( mState == READY )
732 // Set once event handler exists
733 mDeferredRotationObserver = observer;
737 void Adaptor::DestroyTtsPlayer(Dali::TtsPlayer::Mode mode)
739 if(mTtsPlayers[mode])
741 mTtsPlayers[mode].Reset();
745 void Adaptor::SetMinimumPinchDistance(float distance)
747 if( mGestureManager )
749 mGestureManager->SetMinimumPinchDistance(distance);
754 void Adaptor::AddObserver( LifeCycleObserver& observer )
756 ObserverContainer::iterator match ( find(mObservers.begin(), mObservers.end(), &observer) );
758 if ( match == mObservers.end() )
760 mObservers.push_back( &observer );
764 void Adaptor::RemoveObserver( LifeCycleObserver& observer )
766 ObserverContainer::iterator match ( find(mObservers.begin(), mObservers.end(), &observer) );
768 if ( match != mObservers.end() )
770 mObservers.erase( match );
774 void Adaptor::QueueCoreEvent(const Dali::Integration::Event& event)
778 mCore->QueueEvent(event);
782 void Adaptor::ProcessCoreEvents()
786 if( mPerformanceInterface )
788 mPerformanceInterface->AddMarker( PerformanceInterface::PROCESS_EVENTS_START );
791 mCore->ProcessEvents();
793 if( mPerformanceInterface )
795 mPerformanceInterface->AddMarker( PerformanceInterface::PROCESS_EVENTS_END );
800 void Adaptor::RequestUpdate()
802 // When Dali applications are partially visible behind the lock-screen,
803 // the indicator must be updated (therefore allow updates in the PAUSED state)
804 if ( PAUSED == mState ||
807 mUpdateRenderController->RequestUpdate();
811 void Adaptor::RequestProcessEventsOnIdle()
813 // Only request a notification if the Adaptor is actually running
814 // and we haven't installed the idle notification
815 if( ( ! mNotificationOnIdleInstalled ) && ( RUNNING == mState ) )
817 mNotificationOnIdleInstalled = AddIdle( boost::bind( &Adaptor::ProcessCoreEventsFromIdle, this ) );
821 void Adaptor::OnWindowShown()
823 if ( PAUSED_WHILE_HIDDEN == mState )
825 // Adaptor can now be resumed
830 // Force a render task
835 void Adaptor::OnWindowHidden()
837 if ( STOPPED != mState )
841 // Adaptor cannot be resumed until the window is shown
842 mState = PAUSED_WHILE_HIDDEN;
846 // Dali::Internal::Adaptor::Adaptor::OnDamaged
847 void Adaptor::OnDamaged( const DamageArea& area )
849 // This is needed for the case where Dali window is partially obscured
853 void Adaptor::SurfaceSizeChanged(const PositionSize& positionSize)
855 // let the core know the surface size has changed
856 mCore->SurfaceResized(positionSize.width, positionSize.height);
858 mResizedSignal.Emit( mAdaptor );
861 void Adaptor::NotifyLanguageChanged()
863 mLanguageChangedSignal.Emit( mAdaptor );
866 void Adaptor::RequestUpdateOnce()
868 if( PAUSED_WHILE_HIDDEN != mState )
870 if( mUpdateRenderController )
872 mUpdateRenderController->RequestUpdateOnce();
877 void Adaptor::ProcessCoreEventsFromIdle()
881 // the idle handle automatically un-installs itself
882 mNotificationOnIdleInstalled = false;
885 Adaptor::Adaptor(Dali::Adaptor& adaptor, RenderSurface* surface, const DeviceLayout& baseLayout)
887 mLanguageChangedSignal(),
891 mUpdateRenderController(NULL),
896 mPlatformAbstraction( NULL ),
897 mEventHandler( NULL ),
898 mCallbackManager( NULL ),
899 mNotificationOnIdleInstalled( false ),
900 mNotificationTrigger(NULL),
901 mGestureManager(NULL),
904 mDaliFeedbackPlugin(NULL),
905 mFeedbackController(NULL),
907 mDragAndDropDetector(),
908 mDeferredRotationObserver(NULL),
909 mBaseLayout(baseLayout),
910 mEnvironmentOptions(),
911 mPerformanceInterface(NULL),
912 mObjectProfiler(NULL)
914 DALI_ASSERT_ALWAYS( gThreadLocalAdaptor.get() == NULL && "Cannot create more than one Adaptor per thread" );
915 gThreadLocalAdaptor.reset(this);
920 void Adaptor::SetViewMode( ViewMode viewMode )
922 mSurface->SetViewMode( viewMode );
923 mCore->SetViewMode( viewMode );
926 ViewMode Adaptor::GetViewMode() const
928 return mCore->GetViewMode();
931 void Adaptor::SetStereoBase( float stereoBase )
933 mCore->SetStereoBase( stereoBase );
936 float Adaptor::GetStereoBase() const
938 return mCore->GetStereoBase();
941 } // namespace Adaptor
943 } // namespace Internal