(FrameCallback) Ensure Update doesn't invoke removed FrameCallbacks
[platform/core/uifw/dali-core.git] / dali / devel-api / update / frame-callback-interface.h
1 #ifndef DALI_FRAME_CALLBACK_INTERFACE_H
2 #define DALI_FRAME_CALLBACK_INTERFACE_H
3
4 /*
5  * Copyright (c) 2018 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 <memory>
23
24 // INTERNAL INCLUDES
25 #include <dali/public-api/common/dali-common.h>
26
27 namespace Dali
28 {
29
30 class UpdateProxy;
31
32 /**
33  * @brief This interface should be implemented if a callback is required on every frame.
34  *
35  * The Update() method is called from the update-thread after the scene has been updated, and is ready to render.
36  *
37  * As this method is called from the update-thread, no event thread APIs (e.g. Actor::Get...) can be called.
38  * This will invariably lead to crashes.
39  *
40  * Instead, setting and retrieving the values should be done by using the UpdateProxy class returned as a parameter to
41  * the Update() method.
42  *
43  * Actors can be identified using Actor IDs which can be retrieved using Actor::GetId() in the event-thread.
44  * However, calling Actor::GetId() will lead to problems if it is called from the update-thread.
45  * Instead, the Actor IDs should be stored by the implementation of this class or passed via a thread-safe manner from
46  * the event-thread.
47  */
48 class DALI_CORE_API FrameCallbackInterface
49 {
50 public:
51
52   /**
53    * @brief Called from the update-thread after the scene has been updated, and is ready to render.
54    * @param[in]  updateProxy  Use this to get/set required values for the Actor.
55    * @param[in]  elapsedSeconds  Time elapsed time since the last frame (in seconds)
56    * @see FrameCallbackInterface
57    */
58   virtual void Update( UpdateProxy& updateProxy, float elapsedSeconds ) = 0;
59
60 protected:
61
62   /**
63    * @brief Protected constructor.
64    */
65   FrameCallbackInterface();
66
67   /**
68    * @brief Protected virtual destructor.
69    */
70   virtual ~FrameCallbackInterface();
71
72 public:
73   /// @cond internal
74   class Impl;
75
76 private:
77   std::unique_ptr< Impl > mImpl;
78   /// @endcond
79 };
80
81 } // namespace Dali
82
83 #endif // DALI_FRAME_CALLBACK_INTERFACE_H