Revert "[Tizen] Import Extension::Capture to support backward compatibility"
[platform/core/uifw/dali-extension.git] / dali-extension / internal / evas-plugin / evas-plugin-impl.h
1 #ifndef __DALI_EXTENSION_INTERNAL_EVAS_PLUGIN_H__
2 #define __DALI_EXTENSION_INTERNAL_EVAS_PLUGIN_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 <Elementary.h>
23 #include <Ecore_IMF_Evas.h>
24 #include <tbm_surface.h>
25
26 #include <dali/public-api/dali-core.h>
27 #include <dali/public-api/math/rect.h>
28 #include <dali/public-api/object/base-object.h>
29 #include <dali/public-api/common/intrusive-ptr.h>
30 #include <dali/public-api/common/stage.h>
31 #include <dali/public-api/signals/connection-tracker.h>
32 #include <dali/public-api/adaptor-framework/timer.h>
33
34 #include <dali/devel-api/adaptor-framework/singleton-service.h>
35 #include <dali/devel-api/adaptor-framework/clipboard.h>
36 #include <dali/devel-api/adaptor-framework/clipboard-event-notifier.h>
37 #include <dali/devel-api/adaptor-framework/accessibility-adaptor.h>
38
39
40 #include <dali/integration-api/debug.h>
41 #include <dali/integration-api/adaptors/adaptor.h>
42 #include <dali/integration-api/adaptors/native-render-surface.h>
43 #include <dali/integration-api/adaptors/native-render-surface-factory.h>
44 #include <dali/integration-api/adaptors/trigger-event-factory.h>
45 #ifdef DALI_EVASPLUGIN_USE_IMF_MANAGER
46 #include <dali/integration-api/adaptors/imf-manager-impl.h>
47 #endif
48
49 #include <dali-toolkit/public-api/accessibility-manager/accessibility-manager.h>
50
51
52 #ifdef ENABLE_TTRACE
53 #include <ttrace.h>
54 #endif
55
56
57 // INTERNAL INCLUDES
58 #include "evas-event-handler.h"
59 #include "ecore-wl-event-handler.h"
60 #include "evas-plugin-event-interface.h"
61 #include "evas-plugin-visibility-interface.h"
62
63 #include <dali-extension/devel-api/evas-plugin/evas-plugin.h>
64
65 namespace Dali
66 {
67 class TriggerEventInterface;
68 class NativeRenderSurface;
69
70 namespace Extension
71 {
72
73 namespace Internal
74 {
75
76 typedef Rect<int> PositionSize;
77
78 class EvasPlugin;
79 typedef IntrusivePtr<EvasPlugin> EvasPluginPtr;
80
81 /**
82  * Implementation of the EvasPlugin class.
83  */
84 class EvasPlugin : public BaseObject,
85                    public ConnectionTracker,
86                    public Extension::Internal::EvasPluginEventInterface,
87                    public Extension::Internal::EvasPluginVisibilityInterface
88 {
89 public:
90
91   typedef Dali::Extension::EvasPlugin::EvasPluginSignalType EvasPluginSignalType;
92
93   /**
94    * @brief Create a new evas plugin
95    * @param[in] parentEvasObject A pointer of the parent evas object
96    * @param[in] width The width of Dali view port
97    * @param[in] height The height of Dali view port
98    * @param[in] transparent Whether the evas object is transparent or not
99    */
100   static EvasPluginPtr New(Evas_Object* parentEvasObject, int width, int height, bool transparent);
101
102 public:
103
104   /**
105    * @copydoc Dali::Extension::EvasPlugin::Start()
106    */
107   void Run();
108
109   /**
110    * @copydoc Dali::Extension::EvasPlugin::Pause()
111    */
112   void Pause();
113
114   /**
115    * @copydoc Dali::Extension::EvasPlugin::Resume()
116    */
117   void Resume();
118
119   /**
120    * @copydoc Dali::Extension::EvasPlugin::Stop()
121    */
122   void Stop();
123
124   /**
125    * @copydoc Dali::Extension::EvasPlugin::GetDaliAccessEvasObject()
126    */
127   Evas_Object* GetDaliAccessEvasObject();
128
129   /**
130    * @copydoc Dali::Extension::EvasPlugin::GetDaliEvasObject()
131    */
132   Evas_Object* GetDaliEvasObject();
133
134   /**
135    * @copydoc Dali::Extension::EvasPlugin::InitSignal()
136    */
137   EvasPluginSignalType& InitSignal()
138   {
139     return mInitSignal;
140   }
141
142   /**
143    * @copydoc Dali::Extension::EvasPlugin::TerminateSignal()
144    */
145   EvasPluginSignalType& TerminateSignal()
146   {
147     return mTerminateSignal;
148   }
149
150   /**
151    * @copydoc Dali::Extension::EvasPlugin::PauseSignal()
152    */
153   EvasPluginSignalType& PauseSignal()
154   {
155    return mPauseSignal;
156   }
157
158   /**
159    * @copydoc Dali::Extension::EvasPlugin::ResumeSignal()
160    */
161   EvasPluginSignalType& ResumeSignal()
162   {
163     return mResumeSignal;
164   }
165
166   /**
167    * @copydoc Dali::Extension::EvasPlugin::ResizeSignal()
168    */
169   EvasPluginSignalType& ResizeSignal()
170   {
171     return mResizeSignal;
172   }
173
174   /**
175    * @copydoc Dali::Extension::EvasPlugin::FocusedSignal()
176    */
177   EvasPluginSignalType& FocusedSignal()
178   {
179     return mFocusedSignal;
180   }
181
182   /**
183    * @copydoc Dali::Extension::EvasPlugin::UnFocusedSignal()
184    */
185   EvasPluginSignalType& UnFocusedSignal()
186   {
187     return mUnFocusedSignal;
188   }
189
190 private:
191
192   /**
193    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnEvasObjectTouchEvent
194    */
195   virtual void OnEvasObjectTouchEvent(TouchPoint& touchPoint, unsigned long timeStamp);
196
197   /**
198    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnEvasObjectWheelEvent
199    */
200   virtual void OnEvasObjectWheelEvent(WheelEvent& wheelEvent);
201
202   /**
203    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnEvasObjectKeyEvent
204    */
205   virtual void OnEvasObjectKeyEvent(KeyEvent& keyEvent);
206
207   /**
208    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnEvasObjectMove
209    */
210   virtual void OnEvasObjectMove(const Rect<int>& geometry);
211
212   /**
213    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnEvasObjectResize
214    */
215   virtual void OnEvasObjectResize(const Rect<int>& geometry);
216
217   /**
218    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnEvasObjectFocusIn
219    */
220   virtual void OnEvasObjectFocusIn();
221
222   /**
223    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnEvasObjectFocusOut
224    */
225   virtual void OnEvasObjectFocusOut();
226
227   /**
228    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnEvasRenderPost
229    */
230   virtual void OnEvasPostRender();
231
232   /**
233    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnElmAccessActionHighlight
234    */
235   virtual bool OnElmAccessActionHighlight(Dali::Extension::Internal::AccessActionInfo& accessActionInfo);
236
237   /**
238    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnElmAccessActionUnhighlight
239    */
240   virtual bool OnElmAccessActionUnhighlight(Dali::Extension::Internal::AccessActionInfo& accessActionInfo);
241
242   /**
243    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnElmAccessActionHighlightNext
244    */
245   virtual bool OnElmAccessActionHighlightNext(Dali::Extension::Internal::AccessActionInfo& accessActionInfo);
246
247   /**
248    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnElmAccessActionHighlightPrev
249    */
250   virtual bool OnElmAccessActionHighlightPrev(Dali::Extension::Internal::AccessActionInfo& accessActionInfo);
251
252   /**
253    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnElmAccessActionActivate
254    */
255   virtual bool OnElmAccessActionActivate(Dali::Extension::Internal::AccessActionInfo& accessActionInfo);
256
257   /**
258    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnElmAccessActionUp
259    */
260   virtual bool OnElmAccessActionUp(Dali::Extension::Internal::AccessActionInfo& accessActionInfo);
261
262   /**
263    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnElmAccessActionDown
264    */
265   virtual bool OnElmAccessActionDown(Dali::Extension::Internal::AccessActionInfo& accessActionInfo);
266
267   /**
268    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnElmAccessActionScroll
269    */
270   virtual bool OnElmAccessActionScroll(Dali::Extension::Internal::AccessActionInfo& accessActionInfo);
271
272   /**
273    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface:OnElmAccessActionBack:
274    */
275   virtual bool OnElmAccessActionBack(Dali::Extension::Internal::AccessActionInfo& accessActionInfo);
276
277   /**
278    * @copydoc Dali::Extension::Internal::EvasPluginEventInterface::OnElmAccessActionRead
279    */
280   virtual bool OnElmAccessActionRead(Dali::Extension::Internal::AccessActionInfo& accessActionInfo);
281
282   /**
283    * @copydoc Dali::Extension::Internal::EvasPluginVisibilityInterface::OnElmEcoreWlVisibility
284    */
285   virtual void OnEcoreWlVisibility(bool visibility);
286
287   /**
288    * Resize the surface
289    * To resize, create new surface with evas object's size and replace with it.
290    */
291   void ResizeSurface();
292
293 #ifdef DALI_EVASPLUGIN_USE_IMF_MANAGER
294   /**
295    * For ImfActivated signal
296    * When the imf is activated, it will handle the focus
297    * @param[in] imfManager imfManager instance
298    */
299   void OnImfActivated(ImfManager& imfManager);
300 #endif
301
302   /**
303    * This function is called after drawing by dali.
304    */
305   void OnPostRender();
306
307   /**
308    * Called when the accessibility action event dispatched from elm_access.
309    * @param[in] actionType elm accessibility action type structure
310    * @param[in] x x position for action, it could be unnecessary
311    * @param[in] y y position for action, it could be unnecessary
312    * @return True if the event was handled
313    */
314   bool OnElmAccessibilityActionEvent(AccessActionInfo& actionInfo, int x = -1, int y = -1);
315
316 private:
317   /**
318    * Private constructor
319    * @param[in] parentEvasObject A pointer of the parent evas object
320    * @param[in] width The width of Dali view port
321    * @param[in] height The height of Dali view port
322    * @param[in] transparent Whether the evas object is transparent or not
323    */
324   EvasPlugin(Evas_Object* parentEvasObject, int width, int height, bool transparent);
325
326   /**
327    * Destructor
328    */
329   virtual ~EvasPlugin();
330
331   // Undefined
332   EvasPlugin(const EvasPlugin&);
333   EvasPlugin& operator=(EvasPlugin&);
334
335 private:
336   enum State
337   {
338     READY,
339     RUNNING,
340     SUSPENDED,
341     STOPPED,
342   };
343
344   State mState;
345   NativeRenderSurface* mTBMRenderSurface;
346   Adaptor* mAdaptor;
347   TriggerEventInterface* mRenderNotification;
348   Extension::Internal::EvasEventHandler* mEvasEventHandler;
349   Extension::Internal::EcoreWlEventHandler* mEcoreWlEventHandler;
350
351   bool mIsFocus:1;        ///< Flag
352   bool mTransparent:1;    ///< Whether
353
354   SingletonService mSingletonService;
355
356   // Signals
357   EvasPluginSignalType mInitSignal;
358   EvasPluginSignalType mTerminateSignal;
359   EvasPluginSignalType mPauseSignal;
360   EvasPluginSignalType mResumeSignal;
361   EvasPluginSignalType mResizeSignal;
362   EvasPluginSignalType mFocusedSignal;
363   EvasPluginSignalType mUnFocusedSignal;
364
365   struct Impl;
366   Impl* mImpl;
367 };
368
369 inline EvasPlugin& GetImplementation(Extension::EvasPlugin& evasPlugin)
370 {
371   DALI_ASSERT_ALWAYS(evasPlugin && "evasPluing handle is empty");
372
373   BaseObject& handle = evasPlugin.GetBaseObject();
374
375   return static_cast<EvasPlugin&>(handle);
376 }
377
378 inline const EvasPlugin& GetImplementation(const Extension::EvasPlugin& evasPlugin)
379 {
380   DALI_ASSERT_ALWAYS(evasPlugin && "evasPlugin handle is empty");
381
382   const BaseObject& handle = evasPlugin.GetBaseObject();
383
384   return static_cast<const EvasPlugin&>(handle);
385 }
386
387 } // namespace Internal
388
389 } // namespace Extension
390
391 } // namespace Dali
392
393 #endif // __DALI_EXTENSION_INTERNAL_EVAS_PLUGIN_H__