-#ifndef __DALI_INTERNAL_ADAPTOR_IMPL_H__
-#define __DALI_INTERNAL_ADAPTOR_IMPL_H__
+#ifndef DALI_INTERNAL_ADAPTOR_IMPL_H
+#define DALI_INTERNAL_ADAPTOR_IMPL_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 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.
// INTERNAL INCLUDES
#include <dali/integration-api/adaptor.h>
-#include <dali/devel-api/adaptor-framework/render-surface.h>
+#include <dali/integration-api/scene.h>
+
+#ifdef DALI_ADAPTOR_COMPILATION
+#include <dali/integration-api/scene-holder-impl.h>
+#else
+#include <dali/integration-api/adaptors/scene-holder-impl.h>
+#endif
+
#include <dali/public-api/adaptor-framework/tts-player.h>
-#include <dali/devel-api/adaptor-framework/imf-manager.h>
#include <dali/devel-api/adaptor-framework/clipboard.h>
+#include <dali/internal/graphics/common/graphics-interface.h>
+
#include <dali/internal/legacy/common/tizen-platform-abstraction.h>
#include <dali/internal/adaptor/common/adaptor-internal-services.h>
#include <dali/internal/system/common/environment-options.h>
#include <dali/internal/system/common/core-event-interface.h>
-#include <dali/internal/input/common/drag-and-drop-detector-impl.h>
#include <dali/internal/window-system/common/damage-observer.h>
#include <dali/internal/window-system/common/window-visibility-observer.h>
#include <dali/internal/system/common/kernel-trace.h>
#include <dali/integration-api/trigger-event-factory.h>
#include <dali/internal/network/common/socket-factory.h>
+
namespace Dali
{
-class RenderSurface;
-class Window;
+class RenderSurfaceInterface;
namespace Integration
{
class Core;
class GlAbstraction;
+class Processor;
}
namespace Internal
namespace Adaptor
{
-class EventHandler;
-class EglFactory;
-class GestureManager;
+class DisplayConnection;
+class GraphicsFactory;
class GlImplementation;
class GlSyncImplementation;
class ThreadController;
class CallbackManager;
class FeedbackPluginProxy;
class FeedbackController;
-class RotationObserver;
class VSyncMonitor;
class PerformanceInterface;
class LifeCycleObserver;
class ObjectProfiler;
+class SceneHolder;
/**
* Implementation of the Adaptor class.
{
public:
- typedef Dali::Adaptor::AdaptorSignalType AdaptorSignalType;
+ using AdaptorSignalType = Dali::Adaptor::AdaptorSignalType;
+ using WindowCreatedSignalType = Dali::Adaptor::WindowCreatedSignalType;
- typedef Uint16Pair SurfaceSize; ///< Surface size type
+ using SurfaceSize = Uint16Pair; ///< Surface size type
/**
* Creates a New Adaptor
- * @param[in] nativeWindow Native window handle
+ * @param[in] window The window handle
* @param[in] surface A render surface can be one of the following
* - Pixmap, adaptor will use existing Pixmap to draw on to
* - Window, adaptor will use existing Window to draw on to
* @param[in] configuration The context loss configuration ( to choose resource discard policy )
* @param[in] environmentOptions A pointer to the environment options. If NULL then one is created.
*/
- static Dali::Adaptor* New( Any nativeWindow,
- RenderSurface* surface,
+ static Dali::Adaptor* New( Dali::Integration::SceneHolder window,
+ Dali::RenderSurfaceInterface* surface,
Dali::Configuration::ContextLoss configuration,
EnvironmentOptions* environmentOptions );
/**
* Creates a New Adaptor
- * @param[in] nativeWindow native window handle
+ * @param[in] window The window handle
* @param[in] configuration The context loss configuration ( to choose resource discard policy )
* @param[in] environmentOptions A pointer to the environment options. If NULL then one is created.
*/
- static Dali::Adaptor* New( Dali::Window window, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions );
+ static Dali::Adaptor* New( Dali::Integration::SceneHolder window,
+ Dali::Configuration::ContextLoss configuration,
+ EnvironmentOptions* environmentOptions );
+
+ /**
+ * Creates a New Adaptor
+ * @param[in] graphicsFactory A factory that creates the graphics interface
+ * @param[in] window The window handle
+ * @param[in] surface A render surface can be one of the following
+ * - Pixmap, adaptor will use existing Pixmap to draw on to
+ * - Window, adaptor will use existing Window to draw on to
+ * @param[in] configuration The context loss configuration ( to choose resource discard policy )
+ * @param[in] environmentOptions A pointer to the environment options. If NULL then one is created.
+ */
+ static Dali::Adaptor* New( GraphicsFactory& graphicsFactory,
+ Dali::Integration::SceneHolder window,
+ Dali::RenderSurfaceInterface* surface,
+ Dali::Configuration::ContextLoss configuration,
+ EnvironmentOptions* environmentOptions );
+
+ /**
+ * Creates a New Adaptor
+ * @param[in] graphicsFactory A factory that creates the graphics interface
+ * @param[in] window The window handle
+ * @param[in] configuration The context loss configuration ( to choose resource discard policy )
+ * @param[in] environmentOptions A pointer to the environment options. If NULL then one is created.
+ */
+ static Dali::Adaptor* New( GraphicsFactory& graphicsFactory,
+ Dali::Integration::SceneHolder window,
+ Dali::Configuration::ContextLoss configuration,
+ EnvironmentOptions* environmentOptions );
/**
* 2-step initialisation, this should be called after creating an adaptor instance.
+ * @param[in] graphicsFactory A factory that creates the graphics interface
+ * @param[in] configuration The context loss configuration ( to choose resource discard policy )
*/
- void Initialize(Dali::Configuration::ContextLoss configuration);
+ void Initialize( GraphicsFactory& graphicsFactory, Dali::Configuration::ContextLoss configuration );
/**
* Virtual destructor.
virtual void FeedKeyEvent( KeyEvent& keyEvent );
/**
- * @copydoc AdaptorInterface::ReplaceSurface()
+ * @copydoc Dali::Adaptor::ReplaceSurface()
*/
- virtual void ReplaceSurface( Any nativeWindow, RenderSurface& surface );
+ virtual void ReplaceSurface( Dali::Integration::SceneHolder window, Dali::RenderSurfaceInterface& surface );
/**
* @copydoc Dali::Adaptor::GetSurface()
*/
- virtual RenderSurface& GetSurface() const;
+ virtual Dali::RenderSurfaceInterface& GetSurface() const;
/**
* @copydoc Dali::Adaptor::ReleaseSurfaceLock()
/**
* @copydoc Dali::Adaptor::AddIdle()
*/
- virtual bool AddIdle( CallbackBase* callback, bool forceAdd );
+ virtual bool AddIdle( CallbackBase* callback, bool hasReturnValue, bool forceAdd );
+
+ /**
+ * Adds a new Window instance to the Adaptor
+ * @param[in] childWindow The child window instance
+ * @param[in] childWindowName The child window title/name
+ * @param[in] childWindowClassName The class name that the child window belongs to
+ * @param[in] childWindowMode The mode of the child window
+ */
+ virtual bool AddWindow( Dali::Integration::SceneHolder childWindow,
+ const std::string& childWindowName,
+ const std::string& childWindowClassName,
+ bool childWindowMode );
+
+ /**
+ * Removes an existing Window instance from the Adaptor
+ * @param[in] window The Window instance
+ */
+ virtual bool RemoveWindow( Dali::Integration::SceneHolder* childWindow );
+
+ /**
+ * Removes an existing Window instance from the Adaptor
+ * @param[in] windowName The Window name
+ * @note If two Windows have the same name, the first one that matches will be removed
+ */
+ virtual bool RemoveWindow( std::string childWindowName );
/**
* @copydoc Dali::Adaptor::RemoveIdle()
*/
virtual void RemoveIdle( CallbackBase* callback );
-public:
-
/**
- * @return the Core instance
+ * Sets a pre-render callback.
*/
- virtual Dali::Integration::Core& GetCore();
+ void SetPreRenderCallback( CallbackBase* callback );
/**
- * @copydoc Dali::Adaptor::SetRenderRefreshRate()
+ * Removes an existing Window instance from the Adaptor
+ * @param[in] childWindow The Window instance
*/
- void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender );
+ bool RemoveWindow( Dali::Internal::Adaptor::SceneHolder* childWindow );
/**
- * @copydoc Dali::Adaptor::SetUseHardwareVSync()
+ * @brief Retrieve the window that the given actor is added to.
+ *
+ * @param[in] actor The actor
+ * @return The window the actor is added to or a null pointer if the actor is not added to any widnow.
*/
- void SetUseHardwareVSync(bool useHardware);
+ Dali::Internal::Adaptor::SceneHolder* GetWindow( Dali::Actor& actor );
/**
- * @return reference to EglFactory class
+ * @copydoc Dali::Adaptor::GetWindows()
*/
- EglFactory& GetEGLFactory() const;
+ Dali::WindowContainer GetWindows() const;
+
+public:
/**
- * Return GlAbstraction.
- * @return the GlAbstraction.
+ * @return the Core instance
*/
- Integration::GlAbstraction& GetGlAbstraction() const;
+ virtual Dali::Integration::Core& GetCore();
/**
- * Return the PlatformAbstraction.
- * @return The PlatformAbstraction.
+ * @copydoc Dali::Adaptor::SetRenderRefreshRate()
*/
- Integration::PlatformAbstraction& GetPlatformAbstraction() const;
+ void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender );
/**
- * Sets the Drag & Drop Listener.
- * @param[in] detector The detector to send Drag & Drop events to.
+ * @copydoc Dali::Adaptor::SetUseHardwareVSync()
*/
- void SetDragAndDropDetector( DragAndDropDetectorPtr detector );
+ void SetUseHardwareVSync(bool useHardware);
/**
- * Sets a rotation observer, or set to NULL to remove.
- * @pre Adaptor::Start() has been called ( to create EventHandler )
- * @param[in] observer The observer to listen for window rotation events
+ * Return the PlatformAbstraction.
+ * @return The PlatformAbstraction.
*/
- void SetRotationObserver( RotationObserver* observer );
+ Integration::PlatformAbstraction& GetPlatformAbstraction() const;
/**
- * Destroy the TtsPlayer of sepcific mode.
+ * Destroy the TtsPlayer of specific mode.
* @param[in] mode The mode of TtsPlayer to destroy
*/
void DestroyTtsPlayer(Dali::TtsPlayer::Mode mode);
/**
- * @brief Sets minimum distance in pixels that the fingers must move towards/away from each other in order to
- * trigger a pinch gesture
+ * Gets native window handle
*
- * @param[in] distance The minimum pinch distance in pixels
+ * @return native window handle
*/
- void SetMinimumPinchDistance(float distance);
+ Any GetNativeWindowHandle();
/**
- * Gets native window handle
+ * Get the native display associated with the graphics backend
*
- * @return native window handle
+ * @return A handle to the native display
*/
- Any GetNativeWindowHandle();
+ Any GetGraphicsDisplay();
/**
- * Sets use remote surface for eglSurface output
+ * Sets use remote surface for Surface output
* @param[in] useRemoteSurface True if the remote surface is used
*/
void SetUseRemoteSurface(bool useRemoteSurface);
void RequestUpdateOnce();
/**
- * Request adaptor to update indicator's height
- */
- void IndicatorSizeChanged(int height);
-
- /**
* @copydoc Dali::Adaptor::NotifySceneCreated()
*/
void NotifySceneCreated();
void GetAppId( std::string& appId );
/**
- * Informs core the surface size has changed
+ * @copydoc Dali::Adaptor::SurfaceResizePrepare
*/
- void SurfaceResizePrepare( SurfaceSize surfaceSize );
+ void SurfaceResizePrepare( Dali::RenderSurfaceInterface* surface, SurfaceSize surfaceSize );
/**
- * Informs ThreadController the surface size has changed
+ * @copydoc Dali::Adaptor::SurfaceResizeComplete
*/
- void SurfaceResizeComplete( SurfaceSize surfaceSize );
+ void SurfaceResizeComplete( Dali::RenderSurfaceInterface* surface, SurfaceSize surfaceSize );
/**
* Sets layout direction of root by system language
*/
void RenderOnce();
+ /**
+ * @copydoc Dali::Adaptor::GetLogFactory
+ */
+ const LogFactoryInterface& GetLogFactory();
+
+ /**
+ * @copydoc Dali::Adaptor::RegisterProcessor
+ */
+ void RegisterProcessor( Integration::Processor& processor );
+
+ /**
+ * @coydoc Dali::Adaptor::UnregisterProcessor
+ */
+ void UnregisterProcessor( Integration::Processor& processor );
+
public: //AdaptorInternalServices
/**
virtual Dali::Integration::PlatformAbstraction& GetPlatformAbstractionInterface();
/**
- * @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetGlesInterface()
+ * @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetDisplayConnectionInterface()
*/
- virtual Dali::Integration::GlAbstraction& GetGlesInterface();
+ virtual Dali::DisplayConnection& GetDisplayConnectionInterface();
/**
- * @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetEGLFactoryInterface()
- */
- virtual EglFactoryInterface& GetEGLFactoryInterface() const;
+ * @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetGraphicsInterface()
+ */
+ virtual GraphicsInterface& GetGraphicsInterface();
/**
* @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetTriggerEventInterface()
/**
* @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetRenderSurfaceInterface()
*/
- virtual RenderSurface* GetRenderSurfaceInterface();
+ virtual Dali::RenderSurfaceInterface* GetRenderSurfaceInterface();
/**
* @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetVSyncMonitorInterface()
*/
virtual TraceInterface& GetSystemTraceInterface();
-public: // Stereoscopy
-
- /**
- * @copydoc Dali::Integration::Core::SetViewMode()
- */
- void SetViewMode( ViewMode viewMode );
-
- /**
- * @copydoc Dali::Integration::Core::GetViewMode()
- */
- ViewMode GetViewMode() const;
-
- /**
- * @copydoc Dali::Integration::Core::SetStereoBase()
- */
- void SetStereoBase( float stereoBase );
-
- /**
- * @copydoc Dali::Integration::Core::GetStereoBase()
- */
- float GetStereoBase() const;
-
public: // Signals
/**
return mLanguageChangedSignal;
}
-private: // From Dali::Internal::Adaptor::CoreEventInterface
-
/**
- * @copydoc Dali::Internal::Adaptor::CoreEventInterface::QueueCoreEvent()
+ * @copydoc Dali::Adaptor::WindowCreatedSignal
*/
- virtual void QueueCoreEvent(const Dali::Integration::Event& event);
+ WindowCreatedSignalType& WindowCreatedSignal()
+ {
+ return mWindowCreatedSignal;
+ }
+
+public: // From Dali::Internal::Adaptor::CoreEventInterface
/**
* @copydoc Dali::Internal::Adaptor:CoreEventInterface:::ProcessCoreEvents()
*/
virtual void ProcessCoreEvents();
+private: // From Dali::Internal::Adaptor::CoreEventInterface
+
+ /**
+ * @copydoc Dali::Internal::Adaptor::CoreEventInterface::QueueCoreEvent()
+ */
+ virtual void QueueCoreEvent(const Dali::Integration::Event& event);
+
private: // From Dali::Integration::RenderController
/**
*/
virtual void RequestProcessEventsOnIdle( bool forceProcess );
-private: // From Dali::Internal::Adaptor::WindowVisibilityObserver
+public: // From Dali::Internal::Adaptor::WindowVisibilityObserver
/**
* Called when the window becomes fully or partially visible.
private:
// Undefined
- Adaptor(const Adaptor&);
- Adaptor& operator=(Adaptor&);
+ Adaptor(const Adaptor&) = delete;
+ Adaptor& operator=(Adaptor&) = delete;
private:
* Assigns the render surface to the adaptor
*
*/
- void SetSurface(RenderSurface *surface);
+ void SetSurface(Dali::RenderSurfaceInterface *surface);
/**
* called after surface is created
/**
* Sends an notification message from main loop idle handler
*/
- void ProcessCoreEventsFromIdle();
+ bool ProcessCoreEventsFromIdle();
/**
* Gets path for data/resource storage.
*/
void SetupSystemInformation();
+ /**
+ * Adds a callback to be run when entering an idle state.
+ *
+ * A callback of the following type should be used:
+ * @code
+ * bool MyFunction();
+ * @endcode
+ * This callback will be called repeatedly as long as it returns true. A return of 0 deletes this callback.
+ */
+ bool AddIdleEnterer( CallbackBase* callback, bool forceAdd );
+
+ /**
+ * Removes a previously added the idle enterer callback.
+ */
+ void RemoveIdleEnterer( CallbackBase* callback );
+
private:
/**
* Constructor
- * @param[in] nativeWindow native window handle
+ * @param[in] window window handle
* @param[in] adaptor The public adaptor
* @param[in] surface A render surface can be one of the following
* - Pixmap, adaptor will use existing Pixmap to draw on to
* - Window, adaptor will use existing Window to draw on to
* @param[in] environmentOptions A pointer to the environment options. If NULL then one is created.
*/
- Adaptor( Any nativeWindow, Dali::Adaptor& adaptor, RenderSurface* surface, EnvironmentOptions* environmentOptions );
+ Adaptor( Dali::Integration::SceneHolder window, Dali::Adaptor& adaptor, Dali::RenderSurfaceInterface* surface, EnvironmentOptions* environmentOptions );
private: // Types
enum State
{
- READY, ///< Initial state before Adaptor::Start is called.
- RUNNING, ///< Adaptor is running.
- PAUSED, ///< Adaptor has been paused.
- PAUSED_WHILE_HIDDEN, ///< Adaptor is paused while window is hidden (& cannot be resumed until window is shown).
- STOPPED, ///< Adaptor has been stopped.
+ READY, ///< Initial state before Adaptor::Start is called.
+ RUNNING, ///< Adaptor is running.
+ PAUSED, ///< Adaptor has been paused.
+ PAUSED_WHILE_HIDDEN, ///< Adaptor is paused while window is hidden (& cannot be resumed until window is shown).
+ PAUSED_WHILE_INITIALIZING, ///< Adaptor is paused while application is initializing.
+ STOPPED, ///< Adaptor has been stopped.
};
- typedef std::vector<LifeCycleObserver*> ObserverContainer;
+ // There is no weak handle for BaseHandle in DALi, but we can't ref count the window here,
+ // so we have to store the raw pointer.
+ using WindowContainer = std::vector<Dali::Internal::Adaptor::SceneHolder*>;
+ using ObserverContainer = std::vector<LifeCycleObserver*>;
private: // Data
AdaptorSignalType mResizedSignal; ///< Resized signal.
AdaptorSignalType mLanguageChangedSignal; ///< Language changed signal.
+ WindowCreatedSignalType mWindowCreatedSignal; ///< Window created signal.
Dali::Adaptor& mAdaptor; ///< Reference to public adaptor instance.
State mState; ///< Current state of the adaptor
Dali::Integration::Core* mCore; ///< Dali Core
ThreadController* mThreadController; ///< Controls the threads
VSyncMonitor* mVSyncMonitor; ///< Monitors VSync events
- GlImplementation* mGLES; ///< GL implementation
- GlSyncImplementation* mGlSync; ///< GL Sync implementation
- EglFactory* mEglFactory; ///< EGL Factory
- Any mNativeWindow; ///< window identifier
- RenderSurface* mSurface; ///< Current surface
+ GraphicsInterface* mGraphics; ///< Graphics interface
+ Dali::DisplayConnection* mDisplayConnection; ///< Display connection
+ WindowContainer mWindows; ///< A container of all the Windows that are currently created
+
TizenPlatform::TizenPlatformAbstraction* mPlatformAbstraction; ///< Platform abstraction
- EventHandler* mEventHandler; ///< event handler
CallbackManager* mCallbackManager; ///< Used to install callbacks
bool mNotificationOnIdleInstalled; ///< whether the idle handler is installed to send an notification event
TriggerEventInterface* mNotificationTrigger; ///< Notification event trigger
- GestureManager* mGestureManager; ///< Gesture manager
FeedbackPluginProxy* mDaliFeedbackPlugin; ///< Used to access feedback support
FeedbackController* mFeedbackController; ///< Plays feedback effects for Dali-Toolkit UI Controls.
Dali::TtsPlayer mTtsPlayers[Dali::TtsPlayer::MODE_NUM]; ///< Provides TTS support
ObserverContainer mObservers; ///< A list of adaptor observer pointers
- DragAndDropDetectorPtr mDragAndDropDetector; ///< The Drag & Drop detector
- RotationObserver* mDeferredRotationObserver; ///< deferred Rotation observer needs event handler
EnvironmentOptions* mEnvironmentOptions; ///< environment options
PerformanceInterface* mPerformanceInterface; ///< Performance interface
KernelTrace mKernelTracer; ///< Kernel tracer
SocketFactory mSocketFactory; ///< Socket factory
const bool mEnvironmentOptionsOwned:1; ///< Whether we own the EnvironmentOptions (and thus, need to delete it)
bool mUseRemoteSurface; ///< whether the remoteSurface is used or not
+
public:
- inline static Adaptor& GetImplementation(Dali::Adaptor& adaptor) {return *adaptor.mImpl;}
+ inline static Adaptor& GetImplementation(Dali::Adaptor& adaptor) { return *adaptor.mImpl; }
};
} // namespace Internal
} // namespace Dali
-#endif // __DALI_INTERNAL_ADAPTOR_IMPL_H__
+#endif // DALI_INTERNAL_ADAPTOR_IMPL_H