Revert "[Tizen] Revert "Not ref counting the windows in the adaptor""
[platform/core/uifw/dali-adaptor.git] / dali / internal / adaptor / common / adaptor-impl.h
1 #ifndef DALI_INTERNAL_ADAPTOR_IMPL_H
2 #define DALI_INTERNAL_ADAPTOR_IMPL_H
3
4 /*
5  * Copyright (c) 2019 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/common/vector-wrapper.h>
23 #include <dali/public-api/common/view-mode.h>
24 #include <dali/public-api/math/rect.h>
25 #include <dali/public-api/signals/callback.h>
26 #include <dali/public-api/math/uint-16-pair.h>
27 #include <dali/integration-api/render-controller.h>
28
29 // INTERNAL INCLUDES
30 #include <dali/integration-api/adaptor.h>
31 #include <dali/integration-api/scene.h>
32
33 #ifdef DALI_ADAPTOR_COMPILATION
34 #include <dali/integration-api/scene-holder-impl.h>
35 #else
36 #include <dali/integration-api/adaptors/scene-holder-impl.h>
37 #endif
38
39 #include <dali/public-api/adaptor-framework/tts-player.h>
40 #include <dali/devel-api/adaptor-framework/clipboard.h>
41
42 #include <dali/internal/graphics/common/graphics-interface.h>
43
44 #include <dali/internal/legacy/common/tizen-platform-abstraction.h>
45 #include <dali/internal/adaptor/common/adaptor-internal-services.h>
46 #include <dali/internal/system/common/environment-options.h>
47 #include <dali/internal/system/common/core-event-interface.h>
48 #include <dali/internal/window-system/common/damage-observer.h>
49 #include <dali/internal/window-system/common/window-visibility-observer.h>
50 #include <dali/internal/system/common/kernel-trace.h>
51 #include <dali/internal/system/common/system-trace.h>
52 #include <dali/integration-api/trigger-event-factory.h>
53 #include <dali/internal/network/common/socket-factory.h>
54
55
56 namespace Dali
57 {
58
59 class RenderSurfaceInterface;
60
61 namespace Integration
62 {
63 class Core;
64 class GlAbstraction;
65 class Processor;
66 }
67
68 namespace Internal
69 {
70
71 namespace Adaptor
72 {
73 class DisplayConnection;
74 class GraphicsFactory;
75 class GestureManager;
76 class GlImplementation;
77 class GlSyncImplementation;
78 class ThreadController;
79 class TriggerEvent;
80 class CallbackManager;
81 class FeedbackPluginProxy;
82 class FeedbackController;
83 class VSyncMonitor;
84 class PerformanceInterface;
85 class LifeCycleObserver;
86 class ObjectProfiler;
87 class SceneHolder;
88
89 /**
90  * Implementation of the Adaptor class.
91  */
92 class Adaptor : public Integration::RenderController,
93                 public AdaptorInternalServices,
94                 public CoreEventInterface,
95                 public DamageObserver,
96                 public WindowVisibilityObserver
97 {
98 public:
99
100   using AdaptorSignalType =  Dali::Adaptor::AdaptorSignalType;
101   using WindowCreatedSignalType = Dali::Adaptor::WindowCreatedSignalType;
102
103   using SurfaceSize = Uint16Pair;          ///< Surface size type
104
105   /**
106    * Creates a New Adaptor
107    * @param[in]  window              The window handle
108    * @param[in]  surface             A render surface can be one of the following
109    *                                  - Pixmap, adaptor will use existing Pixmap to draw on to
110    *                                  - Window, adaptor will use existing Window to draw on to
111    * @param[in]  configuration       The context loss configuration ( to choose resource discard policy )
112    * @param[in]  environmentOptions  A pointer to the environment options. If NULL then one is created.
113    */
114   static Dali::Adaptor* New( Dali::Integration::SceneHolder window,
115                              Dali::RenderSurfaceInterface* surface,
116                              Dali::Configuration::ContextLoss configuration,
117                              EnvironmentOptions* environmentOptions );
118
119   /**
120    * Creates a New Adaptor
121    * @param[in]  window              The window handle
122    * @param[in]  configuration       The context loss configuration ( to choose resource discard policy )
123    * @param[in]  environmentOptions  A pointer to the environment options. If NULL then one is created.
124    */
125   static Dali::Adaptor* New( Dali::Integration::SceneHolder window,
126                              Dali::Configuration::ContextLoss configuration,
127                              EnvironmentOptions* environmentOptions );
128
129   /**
130    * Creates a New Adaptor
131    * @param[in]  graphicsFactory     A factory that creates the graphics interface
132    * @param[in]  window              The window handle
133    * @param[in]  surface             A render surface can be one of the following
134    *                                  - Pixmap, adaptor will use existing Pixmap to draw on to
135    *                                  - Window, adaptor will use existing Window to draw on to
136    * @param[in]  configuration       The context loss configuration ( to choose resource discard policy )
137    * @param[in]  environmentOptions  A pointer to the environment options. If NULL then one is created.
138    */
139   static Dali::Adaptor* New( GraphicsFactory& graphicsFactory,
140                              Dali::Integration::SceneHolder window,
141                              Dali::RenderSurfaceInterface* surface,
142                              Dali::Configuration::ContextLoss configuration,
143                              EnvironmentOptions* environmentOptions );
144
145   /**
146    * Creates a New Adaptor
147    * @param[in]  graphicsFactory     A factory that creates the graphics interface
148    * @param[in]  window              The window handle
149    * @param[in]  configuration       The context loss configuration ( to choose resource discard policy )
150    * @param[in]  environmentOptions  A pointer to the environment options. If NULL then one is created.
151    */
152   static Dali::Adaptor* New( GraphicsFactory& graphicsFactory,
153                              Dali::Integration::SceneHolder window,
154                              Dali::Configuration::ContextLoss configuration,
155                              EnvironmentOptions* environmentOptions );
156
157   /**
158    * 2-step initialisation, this should be called after creating an adaptor instance.
159    * @param[in]  graphicsFactory     A factory that creates the graphics interface
160    * @param[in]  configuration       The context loss configuration ( to choose resource discard policy )
161    */
162   void Initialize( GraphicsFactory& graphicsFactory, Dali::Configuration::ContextLoss configuration );
163
164   /**
165    * Virtual destructor.
166    */
167   virtual ~Adaptor();
168
169   /**
170    * @copydoc Dali::Adaptor::Get()
171    */
172   static Dali::Adaptor& Get();
173
174   /**
175    * @copydoc Dali::Adaptor::IsAvailable()
176    */
177   static bool IsAvailable();
178
179   /**
180    * @copydoc Dali::Core::SceneCreated();
181    */
182   void SceneCreated();
183
184 public: // AdaptorInternalServices implementation
185   /**
186    * @copydoc Dali::Adaptor::Start()
187    */
188   virtual void Start();
189
190   /**
191    * @copydoc Dali::Adaptor::Pause()
192    */
193   virtual void Pause();
194
195   /**
196    * @copydoc Dali::Adaptor::Resume()
197    */
198   virtual void Resume();
199
200   /**
201    * @copydoc Dali::Adaptor::Stop()
202    */
203   virtual void Stop();
204
205   /**
206    * @copydoc Dali::Adaptor::ContextLost()
207    */
208   virtual void ContextLost();
209
210   /**
211    * @copydoc Dali::Adaptor::ContextRegained()
212    */
213   virtual void ContextRegained();
214
215   /**
216    * @copydoc Dali::EventFeeder::FeedTouchPoint()
217    */
218   virtual void FeedTouchPoint( TouchPoint& point, int timeStamp );
219
220   /**
221    * @copydoc Dali::EventFeeder::FeedWheelEvent()
222    */
223   virtual void FeedWheelEvent( WheelEvent& wheelEvent );
224
225   /**
226    * @copydoc Dali::EventFeeder::FeedKeyEvent()
227    */
228   virtual void FeedKeyEvent( KeyEvent& keyEvent );
229
230   /**
231    * @copydoc Dali::Adaptor::ReplaceSurface()
232    */
233   virtual void ReplaceSurface( Dali::Integration::SceneHolder window, Dali::RenderSurfaceInterface& surface );
234
235   /**
236    * @copydoc Dali::Adaptor::GetSurface()
237    */
238   virtual Dali::RenderSurfaceInterface& GetSurface() const;
239
240   /**
241    * @copydoc Dali::Adaptor::ReleaseSurfaceLock()
242    */
243   virtual void ReleaseSurfaceLock();
244
245   /**
246    * Retrieve the TtsPlayer.
247    * @param[in] mode The mode of TtsPlayer
248    * @return A handle to the TtsPlayer.
249    */
250   virtual Dali::TtsPlayer GetTtsPlayer(Dali::TtsPlayer::Mode mode);
251
252   /**
253    * @copydoc Dali::Adaptor::AddIdle()
254    */
255   virtual bool AddIdle( CallbackBase* callback, bool hasReturnValue, bool forceAdd );
256
257   /**
258    * Adds a new Window instance to the Adaptor
259    * @param[in]  childWindow The child window instance
260    * @param[in]  childWindowName The child window title/name
261    * @param[in]  childWindowClassName The class name that the child window belongs to
262    * @param[in]  childWindowMode The mode of the child window
263    */
264   virtual bool AddWindow( Dali::Integration::SceneHolder childWindow,
265                           const std::string& childWindowName,
266                           const std::string& childWindowClassName,
267                           bool childWindowMode );
268
269   /**
270    * Removes an existing Window instance from the Adaptor
271    * @param[in]  window The Window instance
272    */
273   virtual bool RemoveWindow( Dali::Integration::SceneHolder* childWindow );
274
275   /**
276    * Removes an existing Window instance from the Adaptor
277    * @param[in]  windowName The Window name
278    * @note If two Windows have the same name, the first one that matches will be removed
279    */
280   virtual bool RemoveWindow( std::string childWindowName );
281
282   /**
283    * @copydoc Dali::Adaptor::RemoveIdle()
284    */
285   virtual void RemoveIdle( CallbackBase* callback );
286
287   /**
288    * Sets a pre-render callback.
289    */
290   void SetPreRenderCallback( CallbackBase* callback );
291
292   /**
293    * Removes an existing Window instance from the Adaptor
294    * @param[in]  childWindow The Window instance
295    */
296   bool RemoveWindow( Dali::Internal::Adaptor::SceneHolder* childWindow );
297
298   /**
299    * @brief Retrieve the window that the given actor is added to.
300    *
301    * @param[in] actor The actor
302    * @return The window the actor is added to or a null pointer if the actor is not added to any widnow.
303    */
304   Dali::Internal::Adaptor::SceneHolder* GetWindow( Dali::Actor& actor );
305
306   /**
307    * @copydoc Dali::Adaptor::GetWindows()
308    */
309   Dali::WindowContainer GetWindows() const;
310
311 public:
312
313   /**
314    * @return the Core instance
315    */
316   virtual Dali::Integration::Core& GetCore();
317
318   /**
319    * @copydoc Dali::Adaptor::SetRenderRefreshRate()
320    */
321   void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender );
322
323   /**
324    * Return the PlatformAbstraction.
325    * @return The PlatformAbstraction.
326    */
327   Integration::PlatformAbstraction& GetPlatformAbstraction() const;
328
329   /**
330    * Destroy the TtsPlayer of specific mode.
331    * @param[in] mode The mode of TtsPlayer to destroy
332    */
333   void DestroyTtsPlayer(Dali::TtsPlayer::Mode mode);
334
335   /**
336    * Gets native window handle
337    *
338    * @return native window handle
339    */
340   Any GetNativeWindowHandle();
341
342   /**
343    * Get the native display associated with the graphics backend
344    *
345    * @return A handle to the native display
346    */
347   Any GetGraphicsDisplay();
348
349   /**
350    * Sets use remote surface for Surface output
351    * @param[in] useRemoteSurface True if the remote surface is used
352    */
353   void SetUseRemoteSurface(bool useRemoteSurface);
354
355 public:
356
357   /**
358    * Adds an adaptor observer so that we can observe the adaptor's lifetime events.
359    * @param[in]  observer  The observer.
360    * @note Observers should remove themselves when they are destroyed.
361    */
362   void AddObserver( LifeCycleObserver& observer );
363
364   /**
365    * Removes the observer from the adaptor.
366    * @param[in]  observer  The observer to remove.
367    * @note Observers should remove themselves when they are destroyed.
368    */
369   void RemoveObserver( LifeCycleObserver& observer );
370
371   /**
372    * Emits the Notification event to the Dali core.
373    */
374   void SendNotificationEvent();
375
376   /**
377    * Request adaptor to update once
378    */
379   void RequestUpdateOnce();
380
381   /**
382    * @copydoc Dali::Adaptor::NotifySceneCreated()
383    */
384   void NotifySceneCreated();
385
386   /**
387    * @copydoc Dali::Adaptor::NotifyLanguageChanged()
388    */
389   void NotifyLanguageChanged();
390
391   /**
392    * Gets AppId of current application
393    */
394   void GetAppId( std::string& appId );
395
396   /**
397    * @copydoc Dali::Adaptor::SurfaceResizePrepare
398    */
399   void SurfaceResizePrepare( Dali::RenderSurfaceInterface* surface, SurfaceSize surfaceSize );
400
401   /**
402    * @copydoc Dali::Adaptor::SurfaceResizeComplete
403    */
404   void SurfaceResizeComplete( Dali::RenderSurfaceInterface* surface, SurfaceSize surfaceSize );
405
406   /**
407    * Sets layout direction of root by system language
408    * @param[in] locale System locale
409    */
410   void SetRootLayoutDirection( std::string locale );
411
412   /**
413    * @copydoc Dali::Adaptor::RenderOnce
414    */
415   void RenderOnce();
416
417   /**
418    * @copydoc Dali::Adaptor::GetLogFactory
419    */
420   const LogFactoryInterface& GetLogFactory();
421
422   /**
423    * @copydoc Dali::Adaptor::RegisterProcessor
424    */
425   void RegisterProcessor( Integration::Processor& processor );
426
427   /**
428    * @coydoc Dali::Adaptor::UnregisterProcessor
429    */
430   void UnregisterProcessor( Integration::Processor& processor );
431
432 public:  //AdaptorInternalServices
433
434   /**
435    * @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetPlatformAbstractionInterface()
436    */
437   virtual Dali::Integration::PlatformAbstraction& GetPlatformAbstractionInterface();
438
439   /**
440    * @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetDisplayConnectionInterface()
441    */
442   virtual Dali::DisplayConnection& GetDisplayConnectionInterface();
443
444   /**
445    * @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetGraphicsInterface()
446    */
447   virtual GraphicsInterface& GetGraphicsInterface();
448
449   /**
450    * @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetTriggerEventInterface()
451    */
452   virtual TriggerEventInterface& GetProcessCoreEventsTrigger();
453
454   /**
455    * @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetTriggerEventFactoryInterface()
456    */
457   virtual TriggerEventFactoryInterface& GetTriggerEventFactoryInterface();
458
459   /**
460    * @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetSocketFactoryInterface()
461    */
462   virtual SocketFactoryInterface& GetSocketFactoryInterface();
463
464   /**
465    * @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetRenderSurfaceInterface()
466    */
467   virtual Dali::RenderSurfaceInterface* GetRenderSurfaceInterface();
468
469   /**
470    * @copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetPerformanceInterface()
471    */
472   virtual PerformanceInterface* GetPerformanceInterface();
473
474   /**
475    * copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetKernelTraceInterface()
476    */
477   virtual TraceInterface& GetKernelTraceInterface();
478
479   /**
480    * copydoc Dali::Internal::Adaptor::AdaptorInternalServices::GetSystemTraceInterface()
481    */
482   virtual TraceInterface& GetSystemTraceInterface();
483
484 public: // Signals
485
486   /**
487    * @copydoc Dali::Adaptor::SignalResized
488    */
489   AdaptorSignalType& ResizedSignal()
490   {
491     return mResizedSignal;
492   }
493
494   /**
495    * @copydoc Dali::Adaptor::LanguageChangedSignal
496    */
497   AdaptorSignalType& LanguageChangedSignal()
498   {
499     return mLanguageChangedSignal;
500   }
501
502   /**
503    * @copydoc Dali::Adaptor::WindowCreatedSignal
504    */
505   WindowCreatedSignalType& WindowCreatedSignal()
506   {
507     return mWindowCreatedSignal;
508   }
509
510 public: // From Dali::Internal::Adaptor::CoreEventInterface
511
512   /**
513    * @copydoc Dali::Internal::Adaptor:CoreEventInterface:::ProcessCoreEvents()
514    */
515   virtual void ProcessCoreEvents();
516
517 private: // From Dali::Internal::Adaptor::CoreEventInterface
518
519   /**
520    * @copydoc Dali::Internal::Adaptor::CoreEventInterface::QueueCoreEvent()
521    */
522   virtual void QueueCoreEvent(const Dali::Integration::Event& event);
523
524 private: // From Dali::Integration::RenderController
525
526   /**
527    * @copydoc Dali::Integration::RenderController::RequestUpdate()
528    */
529   virtual void RequestUpdate( bool forceUpdate );
530
531   /**
532    * @copydoc Dali::Integration::RenderController::RequestProcessEventsOnIdle()
533    */
534   virtual void RequestProcessEventsOnIdle( bool forceProcess );
535
536 public: // From Dali::Internal::Adaptor::WindowVisibilityObserver
537
538   /**
539    * Called when the window becomes fully or partially visible.
540    */
541   virtual void OnWindowShown();
542
543   /**
544    * Called when the window is fully hidden.
545    */
546   virtual void OnWindowHidden();
547
548 private: // From Dali::Internal::Adaptor::DamageObserver
549
550   /**
551    * @copydoc Dali::Internal::Adaptor::DamageObserver::OnDamaged()
552    */
553   void OnDamaged( const DamageArea& area );
554
555 private:
556
557   // Undefined
558   Adaptor(const Adaptor&) = delete;
559   Adaptor& operator=(Adaptor&) = delete;
560
561 private:
562
563   /**
564    * Assigns the render surface to the adaptor
565    *
566    */
567   void SetSurface(Dali::RenderSurfaceInterface *surface);
568
569   /**
570    * called after surface is created
571    */
572   void SurfaceInitialized();
573
574   /**
575    * Sends an notification message from main loop idle handler
576    */
577   bool ProcessCoreEventsFromIdle();
578
579   /**
580    * Gets path for data/resource storage.
581    * @param[out] path Path for data/resource storage
582    */
583   void GetDataStoragePath(std::string& path);
584
585   /**
586    * Sets up system information if needs
587    */
588   void SetupSystemInformation();
589
590   /**
591    * Adds a callback to be run when entering an idle state.
592    *
593    * A callback of the following type should be used:
594    * @code
595    *   bool MyFunction();
596    * @endcode
597    * This callback will be called repeatedly as long as it returns true. A return of 0 deletes this callback.
598    */
599   bool AddIdleEnterer( CallbackBase* callback, bool forceAdd );
600
601   /**
602    * Removes a previously added the idle enterer callback.
603    */
604   void RemoveIdleEnterer( CallbackBase* callback );
605
606 private:
607
608   /**
609    * Constructor
610    * @param[in]  window       window handle
611    * @param[in]  adaptor      The public adaptor
612    * @param[in]  surface      A render surface can be one of the following
613    *                          - Pixmap, adaptor will use existing Pixmap to draw on to
614    *                          - Window, adaptor will use existing Window to draw on to
615    * @param[in]  environmentOptions  A pointer to the environment options. If NULL then one is created.
616    */
617   Adaptor( Dali::Integration::SceneHolder window, Dali::Adaptor& adaptor, Dali::RenderSurfaceInterface* surface, EnvironmentOptions* environmentOptions );
618
619 private: // Types
620
621   enum State
622   {
623     READY,                     ///< Initial state before Adaptor::Start is called.
624     RUNNING,                   ///< Adaptor is running.
625     PAUSED,                    ///< Adaptor has been paused.
626     PAUSED_WHILE_HIDDEN,       ///< Adaptor is paused while window is hidden (& cannot be resumed until window is shown).
627     PAUSED_WHILE_INITIALIZING, ///< Adaptor is paused while application is initializing.
628     STOPPED,                   ///< Adaptor has been stopped.
629   };
630
631   // There is no weak handle for BaseHandle in DALi, but we can't ref count the window here,
632   // so we have to store the raw pointer.
633   using WindowContainer = std::vector<Dali::Internal::Adaptor::SceneHolder*>;
634   using ObserverContainer = std::vector<LifeCycleObserver*>;
635
636 private: // Data
637
638   AdaptorSignalType                     mResizedSignal;               ///< Resized signal.
639   AdaptorSignalType                     mLanguageChangedSignal;       ///< Language changed signal.
640   WindowCreatedSignalType               mWindowCreatedSignal;         ///< Window created signal.
641
642   Dali::Adaptor&                        mAdaptor;                     ///< Reference to public adaptor instance.
643   State                                 mState;                       ///< Current state of the adaptor
644   Dali::Integration::Core*              mCore;                        ///< Dali Core
645   ThreadController*                     mThreadController;            ///< Controls the threads
646
647   GraphicsInterface*                    mGraphics;                    ///< Graphics interface
648   Dali::DisplayConnection*              mDisplayConnection;           ///< Display connection
649   WindowContainer                       mWindows;                     ///< A container of all the Windows that are currently created
650
651   TizenPlatform::TizenPlatformAbstraction* mPlatformAbstraction;      ///< Platform abstraction
652
653   CallbackManager*                      mCallbackManager;             ///< Used to install callbacks
654   bool                                  mNotificationOnIdleInstalled; ///< whether the idle handler is installed to send an notification event
655   TriggerEventInterface*                mNotificationTrigger;         ///< Notification event trigger
656   FeedbackPluginProxy*                  mDaliFeedbackPlugin;          ///< Used to access feedback support
657   FeedbackController*                   mFeedbackController;          ///< Plays feedback effects for Dali-Toolkit UI Controls.
658   Dali::TtsPlayer                       mTtsPlayers[Dali::TtsPlayer::MODE_NUM];                   ///< Provides TTS support
659   ObserverContainer                     mObservers;                   ///< A list of adaptor observer pointers
660   EnvironmentOptions*                   mEnvironmentOptions;          ///< environment options
661   PerformanceInterface*                 mPerformanceInterface;        ///< Performance interface
662   KernelTrace                           mKernelTracer;                ///< Kernel tracer
663   SystemTrace                           mSystemTracer;                ///< System tracer
664   TriggerEventFactory                   mTriggerEventFactory;         ///< Trigger event factory
665   ObjectProfiler*                       mObjectProfiler;              ///< Tracks object lifetime for profiling
666   SocketFactory                         mSocketFactory;               ///< Socket factory
667   const bool                            mEnvironmentOptionsOwned:1;   ///< Whether we own the EnvironmentOptions (and thus, need to delete it)
668   bool                                  mUseRemoteSurface;            ///< whether the remoteSurface is used or not
669
670 public:
671   inline static Adaptor& GetImplementation(Dali::Adaptor& adaptor) { return *adaptor.mImpl; }
672 };
673
674 } // namespace Internal
675
676 } // namespace Adaptor
677
678 } // namespace Dali
679
680 #endif // DALI_INTERNAL_ADAPTOR_IMPL_H