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 <dali/public-api/text-abstraction/font-client.h>
39 #include <callback-manager.h>
40 #include <trigger-event.h>
41 #include <render-surface.h>
42 #include <tts-player-impl.h>
43 #include <accessibility-manager-impl.h>
44 #include <timer-impl.h>
45 #include <events/gesture-manager.h>
46 #include <events/event-handler.h>
47 #include <feedback/feedback-controller.h>
48 #include <feedback/feedback-plugin-proxy.h>
49 #include <gl/gl-proxy-implementation.h>
50 #include <gl/gl-implementation.h>
51 #include <gl/egl-sync-implementation.h>
52 #include <gl/egl-image-extensions.h>
53 #include <gl/egl-factory.h>
54 #include <imf-manager-impl.h>
55 #include <clipboard-impl.h>
56 #include <vsync-monitor.h>
57 #include <object-profiler.h>
58 #include <base/display-connection.h>
60 #include <tizen-logging.h>
62 using Dali::TextAbstraction::FontClient;
75 boost::thread_specific_ptr<Adaptor> gThreadLocalAdaptor;
77 unsigned int GetIntegerEnvironmentVariable( const char* variable, unsigned int defaultValue )
79 const char* variableParameter = std::getenv(variable);
81 // if the parameter exists convert it to an integer, else return the default value
82 unsigned int intValue = variableParameter ? atoi(variableParameter) : defaultValue;
86 bool GetIntegerEnvironmentVariable( const char* variable, int& intValue )
88 const char* variableParameter = std::getenv(variable);
90 if( !variableParameter )
94 // if the parameter exists convert it to an integer, else return the default value
95 intValue = atoi(variableParameter);
99 bool GetFloatEnvironmentVariable( const char* variable, float& floatValue )
101 const char* variableParameter = std::getenv(variable);
103 if( !variableParameter )
107 // if the parameter exists convert it to an integer, else return the default value
108 floatValue = atof(variableParameter);
112 } // unnamed namespace
114 Dali::Adaptor* Adaptor::New( Any nativeWindow, RenderSurface *surface, const DeviceLayout& baseLayout,
115 Dali::Configuration::ContextLoss configuration )
117 Dali::Adaptor* adaptor = new Dali::Adaptor;
118 Adaptor* impl = new Adaptor( nativeWindow, *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 );
134 unsigned int networkControl= GetIntegerEnvironmentVariable( DALI_ENV_NETWORK_CONTROL, 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 TIZEN Platform's LogMessage handler.
139 Dali::Integration::Log::LogFunction logFunction(Dali::TizenPlatform::LogMessage);
141 mEnvironmentOptions.SetLogOptions( logFunction, networkControl, 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 int windowWidth(0), windowHeight(0);
219 if ( GetIntegerEnvironmentVariable( DALI_WINDOW_WIDTH, windowWidth ) && GetIntegerEnvironmentVariable( DALI_WINDOW_HEIGHT, windowHeight ) )
221 mEnvironmentOptions.SetWindowWidth( windowWidth );
222 mEnvironmentOptions.SetWindowHeight( windowHeight );
225 mEnvironmentOptions.InstallLogFunction();
228 void Adaptor::Initialize(Dali::Configuration::ContextLoss configuration)
230 ParseEnvironmentOptions();
232 mPlatformAbstraction = new TizenPlatform::TizenPlatformAbstraction;
235 GetDataStoragePath( path );
236 mPlatformAbstraction->SetDataStoragePath( path );
238 ResourcePolicy::DataRetention dataRetentionPolicy = ResourcePolicy::DALI_DISCARDS_ALL_DATA;
239 if( configuration == Dali::Configuration::APPLICATION_DOES_NOT_HANDLE_CONTEXT_LOSS )
241 dataRetentionPolicy = ResourcePolicy::DALI_RETAINS_MESH_DATA;
243 // Note, Tizen does not use DALI_RETAINS_ALL_DATA, as it can reload images from
244 // files automatically.
246 if( mEnvironmentOptions.PerformanceServerRequired() )
248 mPerformanceInterface = PerformanceInterfaceFactory::CreateInterface( *this, mEnvironmentOptions );
251 mCallbackManager = CallbackManager::New();
253 PositionSize size = mSurface->GetPositionSize();
255 mGestureManager = new GestureManager(*this, Vector2(size.width, size.height), mCallbackManager, mEnvironmentOptions);
257 if( mEnvironmentOptions.GetGlesCallTime() > 0 )
259 mGLES = new GlProxyImplementation( mEnvironmentOptions );
263 mGLES = new GlImplementation();
266 mEglFactory = new EglFactory();
268 EglSyncImplementation* eglSyncImpl = mEglFactory->GetSyncImplementation();
270 mCore = Integration::Core::New( *this, *mPlatformAbstraction, *mGLES, *eglSyncImpl, *mGestureManager, dataRetentionPolicy );
272 mObjectProfiler = new ObjectProfiler();
274 mNotificationTrigger = new TriggerEvent( MakeCallback( this, &Adaptor::ProcessCoreEvents ) );
276 mVSyncMonitor = new VSyncMonitor;
278 mUpdateRenderController = new UpdateRenderController( *this, mEnvironmentOptions );
280 mDaliFeedbackPlugin = new FeedbackPluginProxy( FeedbackPluginProxy::DEFAULT_OBJECT_NAME );
282 // Should be called after Core creation
283 if( mEnvironmentOptions.GetPanGestureLoggingLevel() )
285 Integration::EnableProfiling( Dali::Integration::PROFILING_TYPE_PAN_GESTURE );
287 if( mEnvironmentOptions.GetPanGesturePredictionMode() >= 0 )
289 Integration::SetPanGesturePredictionMode(mEnvironmentOptions.GetPanGesturePredictionMode());
291 if( mEnvironmentOptions.GetPanGesturePredictionAmount() >= 0 )
293 Integration::SetPanGesturePredictionAmount(mEnvironmentOptions.GetPanGesturePredictionAmount());
295 if( mEnvironmentOptions.GetPanGestureMaximumPredictionAmount() >= 0 )
297 Integration::SetPanGestureMaximumPredictionAmount(mEnvironmentOptions.GetPanGestureMaximumPredictionAmount());
299 if( mEnvironmentOptions.GetPanGestureMinimumPredictionAmount() >= 0 )
301 Integration::SetPanGestureMinimumPredictionAmount(mEnvironmentOptions.GetPanGestureMinimumPredictionAmount());
303 if( mEnvironmentOptions.GetPanGesturePredictionAmountAdjustment() >= 0 )
305 Integration::SetPanGesturePredictionAmountAdjustment(mEnvironmentOptions.GetPanGesturePredictionAmountAdjustment());
307 if( mEnvironmentOptions.GetPanGestureSmoothingMode() >= 0 )
309 Integration::SetPanGestureSmoothingMode(mEnvironmentOptions.GetPanGestureSmoothingMode());
311 if( mEnvironmentOptions.GetPanGestureSmoothingAmount() >= 0.0f )
313 Integration::SetPanGestureSmoothingAmount(mEnvironmentOptions.GetPanGestureSmoothingAmount());
315 if( mEnvironmentOptions.GetWindowWidth() && mEnvironmentOptions.GetWindowHeight() )
317 SurfaceResized( PositionSize( 0, 0, mEnvironmentOptions.GetWindowWidth(), mEnvironmentOptions.GetWindowHeight() ));
323 // Ensure stop status
326 // Release first as we do not want any access to Adaptor as it is being destroyed.
327 gThreadLocalAdaptor.release();
329 for ( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
331 (*iter)->OnDestroy();
334 delete mUpdateRenderController; // this will shutdown render thread, which will call Core::ContextDestroyed before exit
335 delete mVSyncMonitor;
336 delete mEventHandler;
337 delete mObjectProfiler;
341 // Delete feedback controller before feedback plugin & style monitor dependencies
342 delete mFeedbackController;
343 delete mDaliFeedbackPlugin;
345 delete mGestureManager;
346 delete mPlatformAbstraction;
347 delete mCallbackManager;
348 delete mPerformanceInterface;
350 // uninstall it on this thread (main actor thread)
351 Dali::Integration::Log::UninstallLogFunction();
354 void Adaptor::Start()
356 // it doesn't support restart after stop at this moment
357 // to support restarting, need more testing
358 if( READY != mState )
363 // Start the callback manager
364 mCallbackManager->Start();
366 // create event handler
367 mEventHandler = new EventHandler( mSurface, *this, *mGestureManager, *this, mDragAndDropDetector );
369 if( mDeferredRotationObserver != NULL )
371 mEventHandler->SetRotationObserver(mDeferredRotationObserver);
372 mDeferredRotationObserver = NULL;
375 unsigned int dpiHor, dpiVer;
377 Dali::DisplayConnection::GetDpi(dpiHor, dpiVer);
379 // tell core about the DPI value
380 mCore->SetDpi(dpiHor, dpiVer);
382 // set the DPI value for font rendering
383 FontClient fontClient = FontClient::Get();
384 fontClient.SetDpi( dpiHor, dpiVer );
386 // Tell the core the size of the surface just before we start the render-thread
387 PositionSize size = mSurface->GetPositionSize();
388 mCore->SurfaceResized( size.width, size.height );
390 // Start the update & render threads
391 mUpdateRenderController->Start();
395 ProcessCoreEvents(); // Ensure any startup messages are processed.
397 if ( !mFeedbackController )
399 // Start sound & haptic feedback
400 mFeedbackController = new FeedbackController( *mDaliFeedbackPlugin );
403 for ( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
409 // Dali::Internal::Adaptor::Adaptor::Pause
410 void Adaptor::Pause()
412 // Only pause the adaptor if we're actually running.
413 if( RUNNING == mState )
415 // Inform observers that we are about to be paused.
416 for( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
421 // Reset the event handler when adaptor paused
424 mEventHandler->Reset();
427 mUpdateRenderController->Pause();
433 // Dali::Internal::Adaptor::Adaptor::Resume
434 void Adaptor::Resume()
436 // Only resume the adaptor if we are in the suspended state.
437 if( PAUSED == mState )
439 // We put ResumeFrameTime first, as this was originally called at the start of mCore->Resume()
440 // If there were events pending, mCore->Resume() will call
441 // RenderController->RequestUpdate()
442 // UpdateRenderController->RequestUpdate()
443 // UpdateRenderSynchronization->RequestUpdate()
444 // and we should have reset the frame timers before allowing Core->Update() to be called.
445 //@todo Should we call UpdateRenderController->Resume before mCore->Resume()?
447 mUpdateRenderController->ResumeFrameTime();
449 mUpdateRenderController->Resume();
453 // Reset the event handler when adaptor resumed
456 mEventHandler->Reset();
459 // Inform observers that we have resumed.
460 for( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
465 ProcessCoreEvents(); // Ensure any outstanding messages are processed
471 if( RUNNING == mState ||
473 PAUSED_WHILE_HIDDEN == mState )
475 for( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
480 mUpdateRenderController->Stop();
483 // Delete the TTS player
484 for(int i =0; i < Dali::TtsPlayer::MODE_NUM; i++)
488 mTtsPlayers[i].Reset();
492 delete mEventHandler;
493 mEventHandler = NULL;
495 delete mNotificationTrigger;
496 mNotificationTrigger = NULL;
498 mCallbackManager->Stop();
504 void Adaptor::FeedTouchPoint( TouchPoint& point, int timeStamp )
506 mEventHandler->FeedTouchPoint( point, timeStamp );
509 void Adaptor::FeedWheelEvent( MouseWheelEvent& wheelEvent )
511 mEventHandler->FeedWheelEvent( wheelEvent );
514 void Adaptor::FeedKeyEvent( KeyEvent& keyEvent )
516 mEventHandler->FeedKeyEvent( keyEvent );
519 bool Adaptor::MoveResize( const PositionSize& positionSize )
521 PositionSize old = mSurface->GetPositionSize();
523 // just resize the surface. The driver should automatically resize the egl Surface (untested)
524 // EGL Spec says : EGL window surfaces need to be resized when their corresponding native window
525 // is resized. Implementations typically use hooks into the OS and native window
526 // system to perform this resizing on demand, transparently to the client.
527 mSurface->MoveResize( positionSize );
529 if(old.width != positionSize.width || old.height != positionSize.height)
531 SurfaceSizeChanged(positionSize);
537 void Adaptor::SurfaceResized( const PositionSize& positionSize )
539 PositionSize old = mSurface->GetPositionSize();
541 // Called by an application, when it has resized a window outside of Dali.
542 // The EGL driver automatically detects X Window resize calls, and resizes
543 // the EGL surface for us.
544 mSurface->MoveResize( positionSize );
546 if(old.width != positionSize.width || old.height != positionSize.height)
548 SurfaceSizeChanged(positionSize);
552 void Adaptor::ReplaceSurface( Any nativeWindow, RenderSurface& surface )
554 mNativeWindow = nativeWindow;
557 SurfaceSizeChanged(mSurface->GetPositionSize());
559 // flush the event queue to give update and render threads chance
560 // to start processing messages for new camera setup etc as soon as possible
563 mCore->GetContextNotifier()->NotifyContextLost(); // Inform stage
565 // this method blocks until the render thread has completed the replace.
566 mUpdateRenderController->ReplaceSurface(mSurface);
568 // Inform core, so that texture resources can be reloaded
569 mCore->RecoverFromContextLoss();
571 mCore->GetContextNotifier()->NotifyContextRegained(); // Inform stage
574 RenderSurface& Adaptor::GetSurface() const
579 void Adaptor::ReleaseSurfaceLock()
581 mSurface->ReleaseLock();
584 Dali::TtsPlayer Adaptor::GetTtsPlayer(Dali::TtsPlayer::Mode mode)
586 if(!mTtsPlayers[mode])
588 // Create the TTS player when it needed, because it can reduce launching time.
589 mTtsPlayers[mode] = TtsPlayer::New(mode);
592 return mTtsPlayers[mode];
595 bool Adaptor::AddIdle( CallbackBase* callback )
597 bool idleAdded(false);
599 // Only add an idle if the Adaptor is actually running
600 if( RUNNING == mState )
602 idleAdded = mCallbackManager->AddCallback( callback, CallbackManager::IDLE_PRIORITY );
608 bool Adaptor::CallFromMainLoop( CallbackBase* callback )
610 bool callAdded(false);
612 // Only allow the callback if the Adaptor is actually running
613 if ( RUNNING == mState )
615 callAdded = mCallbackManager->AddCallback( callback, CallbackManager::DEFAULT_PRIORITY );
621 Dali::Adaptor& Adaptor::Get()
623 DALI_ASSERT_ALWAYS( gThreadLocalAdaptor.get() != NULL && "Adaptor not instantiated" );
624 return gThreadLocalAdaptor->mAdaptor;
627 bool Adaptor::IsAvailable()
629 return gThreadLocalAdaptor.get() != NULL;
632 Dali::Integration::Core& Adaptor::GetCore()
637 void Adaptor::SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender )
639 mUpdateRenderController->SetRenderRefreshRate( numberOfVSyncsPerRender );
642 void Adaptor::SetUseHardwareVSync( bool useHardware )
644 mVSyncMonitor->SetUseHardwareVSync( useHardware );
647 EglFactory& Adaptor::GetEGLFactory() const
649 DALI_ASSERT_DEBUG( mEglFactory && "EGL Factory not created" );
653 EglFactoryInterface& Adaptor::GetEGLFactoryInterface() const
658 Integration::GlAbstraction& Adaptor::GetGlAbstraction() const
660 DALI_ASSERT_DEBUG( mGLES && "GLImplementation not created" );
664 Dali::Integration::PlatformAbstraction& Adaptor::GetPlatformAbstractionInterface()
666 return *mPlatformAbstraction;
669 Dali::Integration::GlAbstraction& Adaptor::GetGlesInterface()
674 TriggerEventInterface& Adaptor::GetTriggerEventInterface()
676 return *mNotificationTrigger;
679 TriggerEventFactoryInterface& Adaptor::GetTriggerEventFactoryInterface()
681 return mTriggerEventFactory;
684 SocketFactoryInterface& Adaptor::GetSocketFactoryInterface()
686 return mSocketFactory;
689 RenderSurface* Adaptor::GetRenderSurfaceInterface()
694 VSyncMonitorInterface* Adaptor::GetVSyncMonitorInterface()
696 return mVSyncMonitor;
699 TraceInterface& Adaptor::GetKernelTraceInterface()
701 return mKernelTracer;
704 TraceInterface& Adaptor::GetSystemTraceInterface()
706 return mSystemTracer;
709 PerformanceInterface* Adaptor::GetPerformanceInterface()
711 return mPerformanceInterface;
714 Integration::PlatformAbstraction& Adaptor::GetPlatformAbstraction() const
716 DALI_ASSERT_DEBUG( mPlatformAbstraction && "PlatformAbstraction not created" );
717 return *mPlatformAbstraction;
720 void Adaptor::SetDragAndDropDetector( DragAndDropDetectorPtr detector )
722 mDragAndDropDetector = detector;
726 mEventHandler->SetDragAndDropDetector( detector );
730 void Adaptor::SetRotationObserver( RotationObserver* observer )
734 mEventHandler->SetRotationObserver( observer );
736 else if( mState == READY )
738 // Set once event handler exists
739 mDeferredRotationObserver = observer;
743 void Adaptor::DestroyTtsPlayer(Dali::TtsPlayer::Mode mode)
745 if(mTtsPlayers[mode])
747 mTtsPlayers[mode].Reset();
751 void Adaptor::SetMinimumPinchDistance(float distance)
753 if( mGestureManager )
755 mGestureManager->SetMinimumPinchDistance(distance);
759 Any Adaptor::GetNativeWindowHandle()
761 return mNativeWindow;
764 void Adaptor::AddObserver( LifeCycleObserver& observer )
766 ObserverContainer::iterator match ( find(mObservers.begin(), mObservers.end(), &observer) );
768 if ( match == mObservers.end() )
770 mObservers.push_back( &observer );
774 void Adaptor::RemoveObserver( LifeCycleObserver& observer )
776 ObserverContainer::iterator match ( find(mObservers.begin(), mObservers.end(), &observer) );
778 if ( match != mObservers.end() )
780 mObservers.erase( match );
784 void Adaptor::QueueCoreEvent(const Dali::Integration::Event& event)
788 mCore->QueueEvent(event);
792 void Adaptor::ProcessCoreEvents()
796 if( mPerformanceInterface )
798 mPerformanceInterface->AddMarker( PerformanceInterface::PROCESS_EVENTS_START );
801 mCore->ProcessEvents();
803 if( mPerformanceInterface )
805 mPerformanceInterface->AddMarker( PerformanceInterface::PROCESS_EVENTS_END );
810 void Adaptor::RequestUpdate()
812 // When Dali applications are partially visible behind the lock-screen,
813 // the indicator must be updated (therefore allow updates in the PAUSED state)
814 if ( PAUSED == mState ||
817 mUpdateRenderController->RequestUpdate();
821 void Adaptor::RequestProcessEventsOnIdle()
823 // Only request a notification if the Adaptor is actually running
824 // and we haven't installed the idle notification
825 if( ( ! mNotificationOnIdleInstalled ) && ( RUNNING == mState ) )
827 mNotificationOnIdleInstalled = AddIdle( MakeCallback( this, &Adaptor::ProcessCoreEventsFromIdle ) );
831 void Adaptor::OnWindowShown()
833 if ( PAUSED_WHILE_HIDDEN == mState )
835 // Adaptor can now be resumed
840 // Force a render task
845 void Adaptor::OnWindowHidden()
847 if ( STOPPED != mState )
851 // Adaptor cannot be resumed until the window is shown
852 mState = PAUSED_WHILE_HIDDEN;
856 // Dali::Internal::Adaptor::Adaptor::OnDamaged
857 void Adaptor::OnDamaged( const DamageArea& area )
859 // This is needed for the case where Dali window is partially obscured
863 void Adaptor::SurfaceSizeChanged(const PositionSize& positionSize)
865 // let the core know the surface size has changed
866 mCore->SurfaceResized(positionSize.width, positionSize.height);
868 mResizedSignal.Emit( mAdaptor );
871 void Adaptor::NotifyLanguageChanged()
873 mLanguageChangedSignal.Emit( mAdaptor );
876 void Adaptor::RequestUpdateOnce()
878 if( PAUSED_WHILE_HIDDEN != mState )
880 if( mUpdateRenderController )
882 mUpdateRenderController->RequestUpdateOnce();
887 void Adaptor::ProcessCoreEventsFromIdle()
891 // the idle handle automatically un-installs itself
892 mNotificationOnIdleInstalled = false;
895 Adaptor::Adaptor(Any nativeWindow, Dali::Adaptor& adaptor, RenderSurface* surface, const DeviceLayout& baseLayout)
897 mLanguageChangedSignal(),
901 mUpdateRenderController(NULL),
905 mNativeWindow( nativeWindow ),
907 mPlatformAbstraction( NULL ),
908 mEventHandler( NULL ),
909 mCallbackManager( NULL ),
910 mNotificationOnIdleInstalled( false ),
911 mNotificationTrigger(NULL),
912 mGestureManager(NULL),
913 mDaliFeedbackPlugin(NULL),
914 mFeedbackController(NULL),
916 mDragAndDropDetector(),
917 mDeferredRotationObserver(NULL),
918 mBaseLayout(baseLayout),
919 mEnvironmentOptions(),
920 mPerformanceInterface(NULL),
921 mObjectProfiler(NULL)
923 DALI_ASSERT_ALWAYS( gThreadLocalAdaptor.get() == NULL && "Cannot create more than one Adaptor per thread" );
924 gThreadLocalAdaptor.reset(this);
929 void Adaptor::SetViewMode( ViewMode viewMode )
931 mSurface->SetViewMode( viewMode );
932 mCore->SetViewMode( viewMode );
935 ViewMode Adaptor::GetViewMode() const
937 return mCore->GetViewMode();
940 void Adaptor::SetStereoBase( float stereoBase )
942 mCore->SetStereoBase( stereoBase );
945 float Adaptor::GetStereoBase() const
947 return mCore->GetStereoBase();
950 } // namespace Adaptor
952 } // namespace Internal