e8664cfb0a7df069c97b9075083356100fd16807
[platform/core/uifw/dali-adaptor.git] / adaptors / ecore / wayland / event-handler-ecore-wl.cpp
1 /*
2  * Copyright (c) 2017 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include <events/event-handler.h>
20
21 // EXTERNAL INCLUDES
22 // Ecore is littered with C style cast
23 #pragma GCC diagnostic push
24 #pragma GCC diagnostic ignored "-Wold-style-cast"
25 #include <Ecore.h>
26 #include <Ecore_Input.h>
27 #include <ecore-wl-render-surface.h>
28 #include <cstring>
29
30 #include <sys/time.h>
31
32 #ifndef DALI_PROFILE_UBUNTU
33 #include <vconf.h>
34 #include <vconf-keys.h>
35 #endif // DALI_PROFILE_UBUNTU
36
37 #ifdef DALI_ELDBUS_AVAILABLE
38 #include <Eldbus.h>
39 #endif // DALI_ELDBUS_AVAILABLE
40
41 #include <dali/public-api/common/vector-wrapper.h>
42 #include <dali/public-api/events/device.h>
43 #include <dali/public-api/events/touch-point.h>
44 #include <dali/public-api/events/key-event.h>
45 #include <dali/public-api/events/wheel-event.h>
46 #include <dali/integration-api/debug.h>
47 #include <dali/integration-api/events/key-event-integ.h>
48 #include <dali/integration-api/events/touch-event-integ.h>
49 #include <dali/integration-api/events/hover-event-integ.h>
50 #include <dali/integration-api/events/wheel-event-integ.h>
51
52 // INTERNAL INCLUDES
53 #include <events/gesture-manager.h>
54 #include <window-render-surface.h>
55 #include <clipboard-impl.h>
56 #include <key-impl.h>
57 #include <physical-keyboard-impl.h>
58 #include <style-monitor-impl.h>
59 #include <base/core-event-interface.h>
60 #include <virtual-keyboard.h>
61
62 namespace Dali
63 {
64
65 namespace Internal
66 {
67
68 namespace Adaptor
69 {
70
71 #if defined(DEBUG_ENABLED)
72 namespace
73 {
74 Integration::Log::Filter* gTouchEventLogFilter  = Integration::Log::Filter::New(Debug::NoLogging, false, "LOG_ADAPTOR_EVENTS_TOUCH");
75 Integration::Log::Filter* gDragAndDropLogFilter = Integration::Log::Filter::New(Debug::NoLogging, false, "LOG_ADAPTOR_EVENTS_DND");
76 Integration::Log::Filter* gImfLogging  = Integration::Log::Filter::New(Debug::NoLogging, false, "LOG_ADAPTOR_EVENTS_IMF");
77 Integration::Log::Filter* gSelectionEventLogFilter = Integration::Log::Filter::New(Debug::NoLogging, false, "LOG_ADAPTOR_EVENTS_SELECTION");
78 } // unnamed namespace
79 #endif
80
81
82 namespace
83 {
84
85 // DBUS accessibility
86 const char* BUS = "org.enlightenment.wm-screen-reader";
87 const char* INTERFACE = "org.tizen.GestureNavigation";
88 const char* PATH = "/org/tizen/GestureNavigation";
89
90 const unsigned int PRIMARY_TOUCH_BUTTON_ID( 1 );
91
92 const unsigned int BYTES_PER_CHARACTER_FOR_ATTRIBUTES = 3;
93
94 #ifdef DALI_ELDBUS_AVAILABLE
95 // DBus gesture string matching lists.
96 // TODO: This needs moving to its own module.
97 const char * ElDBusAccessibilityFingerCountStrings[] =
98 {
99   "OneFinger",
100   "TwoFingers",
101   "ThreeFingers"
102 };
103 const unsigned int FingerCountStringsTotal = sizeof( ElDBusAccessibilityFingerCountStrings ) / sizeof( ElDBusAccessibilityFingerCountStrings[0] );
104 enum GestureType
105 {
106   GESTURE_TYPE_NONE,
107   GESTURE_TYPE_HOVER,
108   GESTURE_TYPE_SINGLE_TAP,
109   GESTURE_TYPE_DOUBLE_TAP,
110   GESTURE_TYPE_TRIPLE_TAP
111 };
112 struct GestureTypeTable
113 {
114   const char* name;
115   const GestureType type;
116 };
117 GestureTypeTable ElDBusAccessibilityFullEventTypeStrings[] =
118 {
119   { "Hover",     GESTURE_TYPE_HOVER      },
120   { "SingleTap", GESTURE_TYPE_SINGLE_TAP },
121   { "DoubleTap", GESTURE_TYPE_DOUBLE_TAP },
122   { "TripleTap", GESTURE_TYPE_TRIPLE_TAP }
123 };
124 const unsigned int FullEventTypeStringsTotal = sizeof( ElDBusAccessibilityFullEventTypeStrings ) / sizeof( ElDBusAccessibilityFullEventTypeStrings[0] );
125 enum SubGestureType
126 {
127   SUB_GESTURE_TYPE_NONE,
128   SUB_GESTURE_TYPE_FLICK
129 };
130 struct SubGestureTypeTable
131 {
132   const char* name;
133   const SubGestureType type;
134 };
135 SubGestureTypeTable ElDBusAccessibilityDirectionalEventTypeStrings[] =
136 {
137   { "Flick", SUB_GESTURE_TYPE_FLICK }
138 };
139 const unsigned int DirectionalEventTypeStringsTotal = sizeof( ElDBusAccessibilityDirectionalEventTypeStrings ) / sizeof( ElDBusAccessibilityDirectionalEventTypeStrings[0] );
140 enum GestureDirection
141 {
142   GESTURE_DIRECTION_NONE,
143   GESTURE_DIRECTION_UP,
144   GESTURE_DIRECTION_DOWN,
145   GESTURE_DIRECTION_LEFT,
146   GESTURE_DIRECTION_RIGHT,
147   GESTURE_DIRECTION_UP_RETURN,
148   GESTURE_DIRECTION_DOWN_RETURN,
149   GESTURE_DIRECTION_LEFT_RETURN,
150   GESTURE_DIRECTION_RIGHT_RETURN
151 };
152 struct GestureDirectionTable
153 {
154     const char* name;
155     const GestureDirection direction;
156 };
157 GestureDirectionTable ElDBusAccessibilityDirectionStrings[] =
158 {
159   { "Up",           GESTURE_DIRECTION_UP           },
160   { "Down",         GESTURE_DIRECTION_DOWN         },
161   { "Left",         GESTURE_DIRECTION_LEFT         },
162   { "Right",        GESTURE_DIRECTION_RIGHT        },
163   { "UpReturn",     GESTURE_DIRECTION_UP_RETURN    },
164   { "DownReturn",   GESTURE_DIRECTION_DOWN_RETURN  },
165   { "LeftReturn",   GESTURE_DIRECTION_LEFT_RETURN  },
166   { "RightReturn",  GESTURE_DIRECTION_RIGHT_RETURN }
167 };
168 const unsigned int DirectionStringsTotal = sizeof( ElDBusAccessibilityDirectionStrings ) / sizeof( ElDBusAccessibilityDirectionStrings[0] );
169 #endif // DALI_ELDBUS_AVAILABLE
170
171 /**
172  * EcoreInputModifierToEcoreIMFLock function converts from Ecore_Event_Modifier to Ecore_IMF_Keyboard_Locks enums.
173  * @param[in] modifier the Ecore_Event_Modifier input.
174  * @return the Ecore_IMF_Keyboard_Locks output.
175  */
176 Ecore_IMF_Keyboard_Locks EcoreInputModifierToEcoreIMFLock( unsigned int modifier )
177 {
178     unsigned int lock( ECORE_IMF_KEYBOARD_LOCK_NONE ); // If no other matches, returns NONE.
179
180     if( modifier & ECORE_EVENT_LOCK_NUM )
181     {
182       lock |= ECORE_IMF_KEYBOARD_LOCK_NUM; // Num lock is active.
183     }
184
185     if( modifier & ECORE_EVENT_LOCK_CAPS )
186     {
187       lock |= ECORE_IMF_KEYBOARD_LOCK_CAPS; // Caps lock is active.
188     }
189
190     if( modifier & ECORE_EVENT_LOCK_SCROLL )
191     {
192       lock |= ECORE_IMF_KEYBOARD_LOCK_SCROLL; // Scroll lock is active.
193     }
194
195     return static_cast<Ecore_IMF_Keyboard_Locks>( lock );
196 }
197
198 /**
199  * Ecore_Event_Modifier enums in Ecore_Input.h do not match Ecore_IMF_Keyboard_Modifiers in Ecore_IMF.h.
200  * This function converts from Ecore_Event_Modifier to Ecore_IMF_Keyboard_Modifiers enums.
201  * @param[in] ecoreModifier the Ecore_Event_Modifier input.
202  * @return the Ecore_IMF_Keyboard_Modifiers output.
203  */
204 Ecore_IMF_Keyboard_Modifiers EcoreInputModifierToEcoreIMFModifier(unsigned int ecoreModifier)
205 {
206    unsigned int modifier( ECORE_IMF_KEYBOARD_MODIFIER_NONE );  // If no other matches returns NONE.
207
208
209    if ( ecoreModifier & ECORE_EVENT_MODIFIER_SHIFT )  // enums from ecore_input/Ecore_Input.h
210    {
211      modifier |= ECORE_IMF_KEYBOARD_MODIFIER_SHIFT;  // enums from ecore_imf/ecore_imf.h
212    }
213
214    if ( ecoreModifier & ECORE_EVENT_MODIFIER_ALT )
215    {
216      modifier |= ECORE_IMF_KEYBOARD_MODIFIER_ALT;
217    }
218
219    if ( ecoreModifier & ECORE_EVENT_MODIFIER_CTRL )
220    {
221      modifier |= ECORE_IMF_KEYBOARD_MODIFIER_CTRL;
222    }
223
224    if ( ecoreModifier & ECORE_EVENT_MODIFIER_WIN )
225    {
226      modifier |= ECORE_IMF_KEYBOARD_MODIFIER_WIN;
227    }
228
229    if ( ecoreModifier & ECORE_EVENT_MODIFIER_ALTGR )
230    {
231      modifier |= ECORE_IMF_KEYBOARD_MODIFIER_ALTGR;
232    }
233
234    return static_cast<Ecore_IMF_Keyboard_Modifiers>( modifier );
235 }
236
237
238 // Copied from x server
239 static unsigned int GetCurrentMilliSeconds(void)
240 {
241   struct timeval tv;
242
243   struct timespec tp;
244   static clockid_t clockid;
245
246   if (!clockid)
247   {
248 #ifdef CLOCK_MONOTONIC_COARSE
249     if (clock_getres(CLOCK_MONOTONIC_COARSE, &tp) == 0 &&
250       (tp.tv_nsec / 1000) <= 1000 && clock_gettime(CLOCK_MONOTONIC_COARSE, &tp) == 0)
251     {
252       clockid = CLOCK_MONOTONIC_COARSE;
253     }
254     else
255 #endif
256     if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
257     {
258       clockid = CLOCK_MONOTONIC;
259     }
260     else
261     {
262       clockid = ~0L;
263     }
264   }
265   if (clockid != ~0L && clock_gettime(clockid, &tp) == 0)
266   {
267     return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000L);
268   }
269
270   gettimeofday(&tv, NULL);
271   return (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
272 }
273
274 #ifndef DALI_PROFILE_UBUNTU
275 const char * DALI_VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE = "db/setting/accessibility/font_name";  // It will be update at vconf-key.h and replaced.
276 #endif // DALI_PROFILE_UBUNTU
277
278 /**
279  * Get the device name from the provided ecore key event
280  */
281 void GetDeviceName( Ecore_Event_Key* keyEvent, std::string& result )
282 {
283   const char* ecoreDeviceName = ecore_device_name_get( keyEvent->dev );
284
285   if ( ecoreDeviceName )
286   {
287     result = ecoreDeviceName;
288   }
289 }
290
291 /**
292  * Get the device class from the provided ecore event
293  */
294 void GetDeviceClass( Ecore_Device_Class ecoreDeviceClass, Device::Class::Type& deviceClass )
295 {
296   switch( ecoreDeviceClass )
297   {
298     case ECORE_DEVICE_CLASS_SEAT:
299     {
300       deviceClass = Device::Class::USER;
301       break;
302     }
303     case ECORE_DEVICE_CLASS_KEYBOARD:
304     {
305       deviceClass = Device::Class::KEYBOARD;
306       break;
307     }
308     case ECORE_DEVICE_CLASS_MOUSE:
309     {
310       deviceClass = Device::Class::MOUSE;
311       break;
312     }
313     case ECORE_DEVICE_CLASS_TOUCH:
314     {
315       deviceClass = Device::Class::TOUCH;
316       break;
317     }
318     case ECORE_DEVICE_CLASS_PEN:
319     {
320       deviceClass = Device::Class::PEN;
321       break;
322     }
323     case ECORE_DEVICE_CLASS_POINTER:
324     {
325       deviceClass = Device::Class::POINTER;
326       break;
327     }
328     case ECORE_DEVICE_CLASS_GAMEPAD:
329     {
330       deviceClass = Device::Class::GAMEPAD;
331       break;
332     }
333     default:
334     {
335       deviceClass = Device::Class::NONE;
336       break;
337     }
338   }
339 }
340
341 void GetDeviceSubclass( Ecore_Device_Subclass ecoreDeviceSubclass, Device::Subclass::Type& deviceSubclass )
342 {
343   switch( ecoreDeviceSubclass )
344   {
345     case ECORE_DEVICE_SUBCLASS_FINGER:
346     {
347       deviceSubclass = Device::Subclass::FINGER;
348       break;
349     }
350     case ECORE_DEVICE_SUBCLASS_FINGERNAIL:
351     {
352       deviceSubclass = Device::Subclass::FINGERNAIL;
353       break;
354     }
355     case ECORE_DEVICE_SUBCLASS_KNUCKLE:
356     {
357       deviceSubclass = Device::Subclass::KNUCKLE;
358       break;
359     }
360     case ECORE_DEVICE_SUBCLASS_PALM:
361     {
362       deviceSubclass = Device::Subclass::PALM;
363       break;
364     }
365     case ECORE_DEVICE_SUBCLASS_HAND_SIZE:
366     {
367       deviceSubclass = Device::Subclass::HAND_SIDE;
368       break;
369     }
370     case ECORE_DEVICE_SUBCLASS_HAND_FLAT:
371     {
372       deviceSubclass = Device::Subclass::HAND_FLAT;
373       break;
374     }
375     case ECORE_DEVICE_SUBCLASS_PEN_TIP:
376     {
377       deviceSubclass = Device::Subclass::PEN_TIP;
378       break;
379     }
380     case ECORE_DEVICE_SUBCLASS_TRACKPAD:
381     {
382       deviceSubclass = Device::Subclass::TRACKPAD;
383       break;
384     }
385     case ECORE_DEVICE_SUBCLASS_TRACKPOINT:
386     {
387       deviceSubclass = Device::Subclass::TRACKPOINT;
388       break;
389     }
390     case ECORE_DEVICE_SUBCLASS_TRACKBALL:
391     {
392       deviceSubclass = Device::Subclass::TRACKBALL;
393       break;
394     }
395 #ifdef OVER_TIZEN_VERSION_4
396     case ECORE_DEVICE_SUBCLASS_REMOCON:
397     {
398       deviceSubclass = Device::Subclass::REMOCON;
399       break;
400     }
401     case ECORE_DEVICE_SUBCLASS_VIRTUAL_KEYBOARD:
402     {
403       deviceSubclass = Device::Subclass::VIRTUAL_KEYBOARD;
404       break;
405     }
406 #endif
407     default:
408     {
409       deviceSubclass = Device::Subclass::NONE;
410       break;
411     }
412   }
413 }
414
415 } // unnamed namespace
416
417 // Impl to hide EFL implementation.
418 struct EventHandler::Impl
419 {
420   // Construction & Destruction
421
422   /**
423    * Constructor
424    */
425   Impl( EventHandler* handler, Ecore_Wl_Window* window )
426   : mHandler( handler ),
427     mEcoreEventHandler(),
428     mWindow( window ),
429     mRotationAngle( 0 ),
430     mWindowWidth( 0 ),
431     mWindowHeight( 0 )
432 #ifdef DALI_ELDBUS_AVAILABLE
433   , mSystemConnection( NULL )
434 #endif // DALI_ELDBUS_AVAILABLE
435   {
436     // Only register for touch and key events if we have a window
437     if ( window != 0 )
438     {
439       // Register Touch events
440       mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_EVENT_MOUSE_BUTTON_DOWN,   EcoreEventMouseButtonDown,   handler ) );
441       mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_EVENT_MOUSE_BUTTON_UP,     EcoreEventMouseButtonUp,     handler ) );
442       mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_EVENT_MOUSE_MOVE,          EcoreEventMouseButtonMove,   handler ) );
443       mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_EVENT_MOUSE_BUTTON_CANCEL, EcoreEventMouseButtonCancel, handler ) );
444
445       // Register Mouse wheel events
446       mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_EVENT_MOUSE_WHEEL,        EcoreEventMouseWheel,      handler ) );
447
448       // Register Focus events
449       mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_WL_EVENT_FOCUS_IN,  EcoreEventWindowFocusIn,   handler ) );
450       mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_WL_EVENT_FOCUS_OUT, EcoreEventWindowFocusOut,  handler ) );
451
452       // Register Key events
453       mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_EVENT_KEY_DOWN,           EcoreEventKeyDown,         handler ) );
454       mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_EVENT_KEY_UP,             EcoreEventKeyUp,           handler ) );
455
456       // Register Selection event - clipboard selection
457       mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_WL_EVENT_DATA_SOURCE_SEND, EcoreEventDataSend, handler ) );
458       mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_WL_EVENT_SELECTION_DATA_READY, EcoreEventDataReceive, handler ) );
459
460       // Register Rotate event
461       mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_WL_EVENT_WINDOW_ROTATE, EcoreEventRotate, handler) );
462
463       // Register Detent event
464       mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_EVENT_DETENT_ROTATE, EcoreEventDetent, handler) );
465
466 #ifndef DALI_PROFILE_UBUNTU
467       // Register Vconf notify - font name and size
468       vconf_notify_key_changed( DALI_VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, VconfNotifyFontNameChanged, handler );
469       vconf_notify_key_changed( VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, VconfNotifyFontSizeChanged, handler );
470 #endif // DALI_PROFILE_UBUNTU
471
472 #ifdef DALI_ELDBUS_AVAILABLE
473       // Initialize ElDBus.
474       DALI_LOG_INFO( gImfLogging, Debug::General, "Starting DBus Initialization\n" );
475
476       // Pass in handler.
477       EcoreElDBusInitialisation( handler );
478
479       DALI_LOG_INFO( gImfLogging, Debug::General, "Finished DBus Initialization\n" );
480 #endif // DALI_ELDBUS_AVAILABLE
481     }
482   }
483
484   /**
485    * Destructor
486    */
487   ~Impl()
488   {
489 #ifndef DALI_PROFILE_UBUNTU
490     vconf_ignore_key_changed( VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, VconfNotifyFontSizeChanged );
491     vconf_ignore_key_changed( DALI_VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, VconfNotifyFontNameChanged );
492 #endif // DALI_PROFILE_UBUNTU
493
494     for( std::vector<Ecore_Event_Handler*>::iterator iter = mEcoreEventHandler.begin(), endIter = mEcoreEventHandler.end(); iter != endIter; ++iter )
495     {
496       ecore_event_handler_del( *iter );
497     }
498
499 #ifdef DALI_ELDBUS_AVAILABLE
500     // Close down ElDBus connections.
501     if( mSystemConnection )
502     {
503       eldbus_connection_unref( mSystemConnection );
504     }
505 #endif // DALI_ELDBUS_AVAILABLE
506   }
507
508   // Static methods
509
510   /////////////////////////////////////////////////////////////////////////////////////////////////
511   // Touch Callbacks
512   /////////////////////////////////////////////////////////////////////////////////////////////////
513
514   /**
515    * Called when a touch down is received.
516    */
517   static Eina_Bool EcoreEventMouseButtonDown( void* data, int type, void* event )
518   {
519     Ecore_Event_Mouse_Button *touchEvent( (Ecore_Event_Mouse_Button*)event );
520     EventHandler* handler( (EventHandler*)data );
521
522     if ( touchEvent->window == (unsigned int)ecore_wl_window_id_get(handler->mImpl->mWindow) )
523     {
524       PointState::Type state ( PointState::DOWN );
525
526       // Check if the buttons field is set and ensure it's the primary touch button.
527       // If this event was triggered by buttons other than the primary button (used for touch), then
528       // just send an interrupted event to Core.
529       if ( touchEvent->buttons && (touchEvent->buttons != PRIMARY_TOUCH_BUTTON_ID ) )
530       {
531         state = PointState::INTERRUPTED;
532       }
533
534       Device::Class::Type deviceClass;
535       Device::Subclass::Type deviceSubclass;
536
537       GetDeviceClass( ecore_device_class_get( touchEvent->dev ), deviceClass );
538       GetDeviceSubclass( ecore_device_subclass_get( touchEvent->dev ), deviceSubclass );
539
540       Integration::Point point;
541       point.SetDeviceId( touchEvent->multi.device );
542       point.SetState( state );
543       point.SetScreenPosition( Vector2( touchEvent->x, touchEvent->y ) );
544       point.SetRadius( touchEvent->multi.radius, Vector2( touchEvent->multi.radius_x, touchEvent->multi.radius_y ) );
545       point.SetPressure( touchEvent->multi.pressure );
546       point.SetAngle( Degree( touchEvent->multi.angle ) );
547       point.SetDeviceClass( deviceClass );
548       point.SetDeviceSubclass( deviceSubclass );
549
550       handler->SendEvent( point, touchEvent->timestamp );
551     }
552
553     return ECORE_CALLBACK_PASS_ON;
554   }
555
556   /**
557    * Called when a touch up is received.
558    */
559   static Eina_Bool EcoreEventMouseButtonUp( void* data, int type, void* event )
560   {
561     Ecore_Event_Mouse_Button *touchEvent( (Ecore_Event_Mouse_Button*)event );
562     EventHandler* handler( (EventHandler*)data );
563
564     if ( touchEvent->window == (unsigned int)ecore_wl_window_id_get(handler->mImpl->mWindow) )
565     {
566       Device::Class::Type deviceClass;
567       Device::Subclass::Type deviceSubclass;
568
569       GetDeviceClass( ecore_device_class_get( touchEvent->dev ), deviceClass );
570       GetDeviceSubclass( ecore_device_subclass_get( touchEvent->dev ), deviceSubclass );
571
572       Integration::Point point;
573       point.SetDeviceId( touchEvent->multi.device );
574       point.SetState( PointState::UP );
575       point.SetScreenPosition( Vector2( touchEvent->x, touchEvent->y ) );
576       point.SetRadius( touchEvent->multi.radius, Vector2( touchEvent->multi.radius_x, touchEvent->multi.radius_y ) );
577       point.SetPressure( touchEvent->multi.pressure );
578       point.SetAngle( Degree( touchEvent->multi.angle ) );
579       point.SetDeviceClass( deviceClass );
580       point.SetDeviceSubclass( deviceSubclass );
581
582       handler->SendEvent( point, touchEvent->timestamp );
583     }
584
585     return ECORE_CALLBACK_PASS_ON;
586   }
587
588   /**
589    * Called when a touch motion is received.
590    */
591   static Eina_Bool EcoreEventMouseButtonMove( void* data, int type, void* event )
592   {
593     Ecore_Event_Mouse_Move *touchEvent( (Ecore_Event_Mouse_Move*)event );
594     EventHandler* handler( (EventHandler*)data );
595
596     if ( touchEvent->window == (unsigned int)ecore_wl_window_id_get(handler->mImpl->mWindow) )
597     {
598       Device::Class::Type deviceClass;
599       Device::Subclass::Type deviceSubclass;
600
601       GetDeviceClass( ecore_device_class_get( touchEvent->dev ), deviceClass );
602       GetDeviceSubclass( ecore_device_subclass_get( touchEvent->dev ), deviceSubclass );
603
604       Integration::Point point;
605       point.SetDeviceId( touchEvent->multi.device );
606       point.SetState( PointState::MOTION );
607       point.SetScreenPosition( Vector2( touchEvent->x, touchEvent->y ) );
608       point.SetRadius( touchEvent->multi.radius, Vector2( touchEvent->multi.radius_x, touchEvent->multi.radius_y ) );
609       point.SetPressure( touchEvent->multi.pressure );
610       point.SetAngle( Degree( touchEvent->multi.angle ) );
611       point.SetDeviceClass( deviceClass );
612       point.SetDeviceSubclass( deviceSubclass );
613
614       handler->SendEvent( point, touchEvent->timestamp );
615     }
616
617     return ECORE_CALLBACK_PASS_ON;
618   }
619
620   /**
621    * Called when a touch is canceled.
622    */
623   static Eina_Bool EcoreEventMouseButtonCancel( void* data, int type, void* event )
624   {
625     Ecore_Event_Mouse_Button *touchEvent( (Ecore_Event_Mouse_Button*)event );
626     EventHandler* handler( (EventHandler*)data );
627
628     if( touchEvent->window == (unsigned int)ecore_wl_window_id_get( handler->mImpl->mWindow ) )
629     {
630       Integration::Point point;
631       point.SetState( PointState::INTERRUPTED );
632       point.SetScreenPosition( Vector2( touchEvent->x, touchEvent->y ) );
633       handler->SendEvent( point, touchEvent->timestamp );
634
635       DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT EcoreEventMouseButtonCancel\n" );
636     }
637
638     return ECORE_CALLBACK_PASS_ON;
639   }
640
641   /**
642    * Called when a mouse wheel is received.
643    */
644   static Eina_Bool EcoreEventMouseWheel( void* data, int type, void* event )
645   {
646     Ecore_Event_Mouse_Wheel *mouseWheelEvent( (Ecore_Event_Mouse_Wheel*)event );
647
648     DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT Ecore_Event_Mouse_Wheel: direction: %d, modifiers: %d, x: %d, y: %d, z: %d\n", mouseWheelEvent->direction, mouseWheelEvent->modifiers, mouseWheelEvent->x, mouseWheelEvent->y, mouseWheelEvent->z);
649
650     EventHandler* handler( (EventHandler*)data );
651     if ( mouseWheelEvent->window == (unsigned int)ecore_wl_window_id_get(handler->mImpl->mWindow) )
652     {
653       WheelEvent wheelEvent( WheelEvent::MOUSE_WHEEL, mouseWheelEvent->direction, mouseWheelEvent->modifiers, Vector2(mouseWheelEvent->x, mouseWheelEvent->y), mouseWheelEvent->z, mouseWheelEvent->timestamp );
654       handler->SendWheelEvent( wheelEvent );
655     }
656     return ECORE_CALLBACK_PASS_ON;
657   }
658
659   /////////////////////////////////////////////////////////////////////////////////////////////////
660   // Key Callbacks
661   /////////////////////////////////////////////////////////////////////////////////////////////////
662
663   /**
664    * Called when a key down is received.
665    */
666   static Eina_Bool EcoreEventKeyDown( void* data, int type, void* event )
667   {
668     DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT >>EcoreEventKeyDown \n" );
669
670     EventHandler* handler( (EventHandler*)data );
671     Ecore_Event_Key *keyEvent( (Ecore_Event_Key*)event );
672     bool eventHandled( false );
673
674     // If a device key then skip ecore_imf_context_filter_event.
675     if ( ! KeyLookup::IsDeviceButton( keyEvent->keyname ) )
676     {
677       Ecore_IMF_Context* imfContext = NULL;
678       Dali::ImfManager imfManager( ImfManager::Get() );
679       if ( imfManager )
680       {
681         imfContext = ImfManager::GetImplementation( imfManager ).GetContext();
682       }
683
684       if ( imfContext )
685       {
686         // We're consuming key down event so we have to pass to IMF so that it can parse it as well.
687         Ecore_IMF_Event_Key_Down ecoreKeyDownEvent;
688         ecoreKeyDownEvent.keyname   = keyEvent->keyname;
689         ecoreKeyDownEvent.key       = keyEvent->key;
690         ecoreKeyDownEvent.string    = keyEvent->string;
691         ecoreKeyDownEvent.compose   = keyEvent->compose;
692         ecoreKeyDownEvent.timestamp = keyEvent->timestamp;
693         ecoreKeyDownEvent.modifiers = EcoreInputModifierToEcoreIMFModifier ( keyEvent->modifiers );
694         ecoreKeyDownEvent.locks     = EcoreInputModifierToEcoreIMFLock( keyEvent->modifiers );
695         ecoreKeyDownEvent.dev_name  = ecore_device_name_get( keyEvent->dev );
696         ecoreKeyDownEvent.dev_class = static_cast<Ecore_IMF_Device_Class>( ecore_device_class_get( keyEvent->dev ) );
697         ecoreKeyDownEvent.dev_subclass = static_cast<Ecore_IMF_Device_Subclass>( ecore_device_subclass_get( keyEvent->dev ) );
698
699         std::string checkDevice;
700         GetDeviceName( keyEvent, checkDevice );
701
702         // If the device is IME and the focused key is the direction keys, then we should send a key event to move a key cursor.
703         if( ( checkDevice == "ime" ) && ( ( !strncmp( keyEvent->keyname, "Left",  4 ) ) ||
704                                           ( !strncmp( keyEvent->keyname, "Right", 5 ) ) ||
705                                           ( !strncmp( keyEvent->keyname, "Up",    2 ) ) ||
706                                           ( !strncmp( keyEvent->keyname, "Down",  4 ) ) ) )
707         {
708           eventHandled = 0;
709         }
710         else
711         {
712           eventHandled = ecore_imf_context_filter_event( imfContext,
713                                                          ECORE_IMF_EVENT_KEY_DOWN,
714                                                          (Ecore_IMF_Event *) &ecoreKeyDownEvent );
715         }
716
717         // If the event has not been handled by IMF then check if we should reset our IMF context
718         if( !eventHandled )
719         {
720           if ( !strcmp( keyEvent->keyname, "Escape"   ) ||
721                !strcmp( keyEvent->keyname, "Return"   ) ||
722                !strcmp( keyEvent->keyname, "KP_Enter" ) )
723           {
724             ecore_imf_context_reset( imfContext );
725           }
726         }
727       }
728     }
729
730     // If the event wasn't handled then we should send a key event.
731     if ( !eventHandled )
732     {
733       if ( keyEvent->window == (unsigned int)ecore_wl_window_id_get(handler->mImpl->mWindow) )
734       {
735         std::string keyName( keyEvent->keyname );
736         std::string keyString( "" );
737         int keyCode = KeyLookup::GetDaliKeyCode( keyEvent->keyname);
738         keyCode = (keyCode == -1) ? 0 : keyCode;
739         int modifier( keyEvent->modifiers );
740         unsigned long time = keyEvent->timestamp;
741         if (!strncmp(keyEvent->keyname, "Keycode-", 8))
742           keyCode = atoi(keyEvent->keyname + 8);
743
744         // Ensure key event string is not NULL as keys like SHIFT have a null string.
745         if ( keyEvent->string )
746         {
747           keyString = keyEvent->string;
748         }
749
750         std::string deviceName;
751         Device::Class::Type deviceClass;
752         Device::Subclass::Type deviceSubclass;
753
754         GetDeviceName( keyEvent, deviceName );
755         GetDeviceClass( ecore_device_class_get( keyEvent->dev ), deviceClass );
756         GetDeviceSubclass( ecore_device_subclass_get( keyEvent->dev ), deviceSubclass );
757
758         DALI_LOG_INFO( gImfLogging, Debug::Verbose, "EVENT EcoreEventKeyDown - >>EcoreEventKeyDown deviceName(%s) deviceClass(%d)\n", deviceName.c_str(), deviceClass );
759
760         Integration::KeyEvent keyEvent(keyName, keyString, keyCode, modifier, time, Integration::KeyEvent::Down, deviceName, deviceClass, deviceSubclass );
761         handler->SendEvent( keyEvent );
762       }
763     }
764
765     return ECORE_CALLBACK_PASS_ON;
766   }
767
768   /**
769    * Called when a key up is received.
770    */
771   static Eina_Bool EcoreEventKeyUp( void* data, int type, void* event )
772   {
773     DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT >>EcoreEventKeyUp\n" );
774
775     EventHandler* handler( (EventHandler*)data );
776     Ecore_Event_Key *keyEvent( (Ecore_Event_Key*)event );
777     bool eventHandled( false );
778
779     // Device keys like Menu, home, back button must skip ecore_imf_context_filter_event.
780     if ( ! KeyLookup::IsDeviceButton( keyEvent->keyname ) )
781     {
782       Ecore_IMF_Context* imfContext = NULL;
783       Dali::ImfManager imfManager( ImfManager::Get() );
784       if ( imfManager )
785       {
786         imfContext = ImfManager::GetImplementation( imfManager ).GetContext();
787       }
788
789       if ( imfContext )
790       {
791         // We're consuming key up event so we have to pass to IMF so that it can parse it as well.
792         Ecore_IMF_Event_Key_Up ecoreKeyUpEvent;
793         ecoreKeyUpEvent.keyname   = keyEvent->keyname;
794         ecoreKeyUpEvent.key       = keyEvent->key;
795         ecoreKeyUpEvent.string    = keyEvent->string;
796         ecoreKeyUpEvent.compose   = keyEvent->compose;
797         ecoreKeyUpEvent.timestamp = keyEvent->timestamp;
798         ecoreKeyUpEvent.modifiers = EcoreInputModifierToEcoreIMFModifier ( keyEvent->modifiers );
799         ecoreKeyUpEvent.locks     = EcoreInputModifierToEcoreIMFLock( keyEvent->modifiers );
800         ecoreKeyUpEvent.dev_name  = ecore_device_name_get( keyEvent->dev );
801         ecoreKeyUpEvent.dev_class = static_cast<Ecore_IMF_Device_Class>( ecore_device_class_get( keyEvent->dev ) );
802         ecoreKeyUpEvent.dev_subclass = static_cast<Ecore_IMF_Device_Subclass>( ecore_device_subclass_get( keyEvent->dev ) );
803
804         eventHandled = ecore_imf_context_filter_event( imfContext,
805                                                        ECORE_IMF_EVENT_KEY_UP,
806                                                        (Ecore_IMF_Event *) &ecoreKeyUpEvent );
807       }
808     }
809
810     // If the event wasn't handled then we should send a key event.
811     if ( !eventHandled )
812     {
813       if ( keyEvent->window == (unsigned int)ecore_wl_window_id_get(handler->mImpl->mWindow) )
814       {
815         std::string keyName( keyEvent->keyname );
816         std::string keyString( "" );
817         int keyCode = KeyLookup::GetDaliKeyCode( keyEvent->keyname);
818         keyCode = (keyCode == -1) ? 0 : keyCode;
819         int modifier( keyEvent->modifiers );
820         unsigned long time = keyEvent->timestamp;
821         if (!strncmp(keyEvent->keyname, "Keycode-", 8))
822           keyCode = atoi(keyEvent->keyname + 8);
823
824         // Ensure key event string is not NULL as keys like SHIFT have a null string.
825         if ( keyEvent->string )
826         {
827           keyString = keyEvent->string;
828         }
829
830         std::string deviceName;
831         Device::Class::Type deviceClass;
832         Device::Subclass::Type deviceSubclass;
833
834         GetDeviceName( keyEvent, deviceName );
835         GetDeviceClass( ecore_device_class_get( keyEvent->dev ), deviceClass );
836         GetDeviceSubclass( ecore_device_subclass_get( keyEvent->dev ), deviceSubclass );
837
838         Integration::KeyEvent keyEvent(keyName, keyString, keyCode, modifier, time, Integration::KeyEvent::Up, deviceName, deviceClass, deviceSubclass );
839         handler->SendEvent( keyEvent );
840       }
841     }
842
843     return ECORE_CALLBACK_PASS_ON;
844   }
845
846   /////////////////////////////////////////////////////////////////////////////////////////////////
847   // Window Callbacks
848   /////////////////////////////////////////////////////////////////////////////////////////////////
849
850   /**
851    * Called when the window gains focus.
852    */
853   static Eina_Bool EcoreEventWindowFocusIn( void* data, int type, void* event )
854   {
855     Ecore_Wl_Event_Focus_In* focusInEvent( (Ecore_Wl_Event_Focus_In*)event );
856     EventHandler* handler( (EventHandler*)data );
857
858     DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT >>EcoreEventWindowFocusIn \n" );
859
860     // If the window gains focus and we hid the keyboard then show it again.
861     if ( focusInEvent->win == (unsigned int)ecore_wl_window_id_get(handler->mImpl->mWindow) )
862     {
863       DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT EcoreEventWindowFocusIn - >>WindowFocusGained \n" );
864
865       if ( ImfManager::IsAvailable() /* Only get the ImfManager if it's available as we do not want to create it */ )
866       {
867         Dali::ImfManager imfManager( ImfManager::Get() );
868         if ( imfManager )
869         {
870           ImfManager& imfManagerImpl( ImfManager::GetImplementation( imfManager ) );
871           if( imfManagerImpl.RestoreAfterFocusLost() )
872           {
873             imfManagerImpl.Activate();
874           }
875         }
876       }
877       Dali::Clipboard clipboard = Clipboard::Get();
878       clipboard.HideClipboard();
879     }
880
881     return ECORE_CALLBACK_PASS_ON;
882   }
883
884   /**
885    * Called when the window loses focus.
886    */
887   static Eina_Bool EcoreEventWindowFocusOut( void* data, int type, void* event )
888   {
889     Ecore_Wl_Event_Focus_Out* focusOutEvent( (Ecore_Wl_Event_Focus_Out*)event );
890     EventHandler* handler( (EventHandler*)data );
891
892     DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT >>EcoreEventWindowFocusOut \n" );
893
894     // If the window loses focus then hide the keyboard.
895     if ( focusOutEvent->win == (unsigned int)ecore_wl_window_id_get(handler->mImpl->mWindow) )
896     {
897       if ( ImfManager::IsAvailable() /* Only get the ImfManager if it's available as we do not want to create it */ )
898       {
899         Dali::ImfManager imfManager( ImfManager::Get() );
900         if ( imfManager )
901         {
902           ImfManager& imfManagerImpl( ImfManager::GetImplementation( imfManager ) );
903           if( imfManagerImpl.RestoreAfterFocusLost() )
904           {
905             imfManagerImpl.Deactivate();
906           }
907         }
908       }
909
910       // Hiding clipboard event will be ignored once because window focus out event is always received on showing clipboard
911       Dali::Clipboard clipboard = Clipboard::Get();
912       if ( clipboard )
913       {
914         Clipboard& clipBoardImpl( GetImplementation( clipboard ) );
915         clipBoardImpl.HideClipboard(true);
916       }
917     }
918
919     return ECORE_CALLBACK_PASS_ON;
920   }
921
922   /**
923    * Called when the window is damaged.
924    */
925   static Eina_Bool EcoreEventWindowDamaged(void *data, int type, void *event)
926   {
927     return ECORE_CALLBACK_PASS_ON;
928   }
929
930   /**
931    * Called when the window properties are changed.
932    * We are only interested in the font change.
933    */
934
935
936   /////////////////////////////////////////////////////////////////////////////////////////////////
937   // Drag & Drop Callbacks
938   /////////////////////////////////////////////////////////////////////////////////////////////////
939
940   /**
941    * Called when a dragged item enters our window's bounds.
942    * This is when items are dragged INTO our window.
943    */
944   static Eina_Bool EcoreEventDndEnter( void* data, int type, void* event )
945   {
946     DALI_LOG_INFO( gDragAndDropLogFilter, Debug::Concise, "EcoreEventDndEnter\n" );
947
948     return ECORE_CALLBACK_PASS_ON;
949   }
950
951   /**
952    * Called when a dragged item is moved within our window.
953    * This is when items are dragged INTO our window.
954    */
955   static Eina_Bool EcoreEventDndPosition( void* data, int type, void* event )
956   {
957     DALI_LOG_INFO(gDragAndDropLogFilter, Debug::Concise, "EcoreEventDndPosition\n" );
958
959     return ECORE_CALLBACK_PASS_ON;
960   }
961
962   /**
963    * Called when a dragged item leaves our window's bounds.
964    * This is when items are dragged INTO our window.
965    */
966   static Eina_Bool EcoreEventDndLeave( void* data, int type, void* event )
967   {
968     DALI_LOG_INFO(gDragAndDropLogFilter, Debug::Concise, "EcoreEventDndLeave\n" );
969
970     return ECORE_CALLBACK_PASS_ON;
971   }
972
973   /**
974    * Called when the dragged item is dropped within our window's bounds.
975    * This is when items are dragged INTO our window.
976    */
977   static Eina_Bool EcoreEventDndDrop( void* data, int type, void* event )
978   {
979     DALI_LOG_INFO(gDragAndDropLogFilter, Debug::Concise, "EcoreEventDndDrop\n" );
980
981     return ECORE_CALLBACK_PASS_ON;
982   }
983
984   /**
985    * Called when a dragged item is moved from our window and the target window has done processing it.
986    * This is when items are dragged FROM our window.
987    */
988   static Eina_Bool EcoreEventDndFinished( void* data, int type, void* event )
989   {
990     DALI_LOG_INFO(gDragAndDropLogFilter, Debug::Concise, "EcoreEventDndFinished\n" );
991     return ECORE_CALLBACK_PASS_ON;
992   }
993
994   /**
995    * Called when a dragged item is moved from our window and the target window has sent us a status.
996    * This is when items are dragged FROM our window.
997    */
998   static Eina_Bool EcoreEventDndStatus( void* data, int type, void* event )
999   {
1000     DALI_LOG_INFO(gDragAndDropLogFilter, Debug::Concise, "EcoreEventDndStatus\n" );
1001     return ECORE_CALLBACK_PASS_ON;
1002   }
1003
1004   /**
1005    * Called when the client messages (i.e. the accessibility events) are received.
1006    */
1007   static Eina_Bool EcoreEventClientMessage( void* data, int type, void* event )
1008   {
1009     return ECORE_CALLBACK_PASS_ON;
1010   }
1011
1012
1013   /////////////////////////////////////////////////////////////////////////////////////////////////
1014   // ElDBus Accessibility Callbacks
1015   /////////////////////////////////////////////////////////////////////////////////////////////////
1016
1017 #ifdef DALI_ELDBUS_AVAILABLE
1018   // Callback for Ecore ElDBus accessibility events.
1019   static void OnEcoreElDBusAccessibilityNotification( void *context EINA_UNUSED, const Eldbus_Message *message )
1020   {
1021     EventHandler* handler = static_cast< EventHandler* >( context );
1022     // Ignore any accessibility events when paused.
1023     if( handler->mPaused )
1024     {
1025       return;
1026     }
1027
1028     if( !handler->mAccessibilityAdaptor )
1029     {
1030       DALI_LOG_ERROR( "Invalid accessibility adaptor\n" );
1031       return;
1032     }
1033
1034     AccessibilityAdaptor* accessibilityAdaptor( &AccessibilityAdaptor::GetImplementation( handler->mAccessibilityAdaptor ) );
1035     if( !accessibilityAdaptor )
1036     {
1037       DALI_LOG_ERROR( "Cannot access accessibility adaptor\n" );
1038       return;
1039     }
1040
1041     int gestureValue;
1042     int xS, yS, xE, yE;
1043     int state; // 0 - begin, 1 - ongoing, 2 - ended, 3 - aborted
1044     int eventTime;
1045
1046     // The string defines the arg-list's respective types.
1047     if( !eldbus_message_arguments_get( message, "iiiiiiu", &gestureValue, &xS, &yS, &xE, &yE, &state, &eventTime ) )
1048     {
1049       DALI_LOG_ERROR( "OnEcoreElDBusAccessibilityNotification: Error getting arguments\n" );
1050     }
1051
1052     DALI_LOG_INFO( gImfLogging, Debug::General, "Got gesture: Name: %d  Args: %d,%d,%d,%d  State: %d\n", gestureValue, xS, yS, xE, yE );
1053
1054     // Create a touch point object.
1055     TouchPoint::State touchPointState( TouchPoint::Down );
1056     if( state == 0 )
1057     {
1058       touchPointState = TouchPoint::Down; // Mouse down.
1059     }
1060     else if( state == 1 )
1061     {
1062       touchPointState = TouchPoint::Motion; // Mouse move.
1063     }
1064     else if( state == 2 )
1065     {
1066       touchPointState = TouchPoint::Up; // Mouse up.
1067     }
1068     else
1069     {
1070       touchPointState = TouchPoint::Interrupted; // Error.
1071     }
1072
1073     // Send touch event to accessibility adaptor.
1074     TouchPoint point( 0, touchPointState, (float)xS, (float)yS );
1075
1076     // Perform actions based on received gestures.
1077     // Note: This is seperated from the reading so we can have other input readers without changing the below code.
1078     switch( gestureValue )
1079     {
1080       case 0: // OneFingerHover
1081       {
1082         // Focus, read out.
1083         accessibilityAdaptor->HandleActionReadEvent( (unsigned int)xS, (unsigned int)yS, true /* allow read again */ );
1084         break;
1085       }
1086       case 1: // TwoFingersHover
1087       {
1088         // In accessibility mode, scroll action should be handled when the currently focused actor is contained in scrollable control
1089         accessibilityAdaptor->HandleActionScrollEvent( point, GetCurrentMilliSeconds() );
1090         break;
1091       }
1092       case 2: // ThreeFingersHover
1093       {
1094         // Read from top item on screen continuously.
1095         accessibilityAdaptor->HandleActionReadFromTopEvent();
1096         break;
1097       }
1098       case 3: // OneFingerFlickLeft
1099       {
1100         // Move to previous item.
1101         accessibilityAdaptor->HandleActionReadPreviousEvent();
1102         break;
1103       }
1104       case 4: // OneFingerFlickRight
1105       {
1106         // Move to next item.
1107         accessibilityAdaptor->HandleActionReadNextEvent();
1108         break;
1109       }
1110       case 5: // OneFingerFlickUp
1111       {
1112         // Move to previous item.
1113         accessibilityAdaptor->HandleActionPreviousEvent();
1114         break;
1115       }
1116       case 6: // OneFingerFlickDown
1117       {
1118         // Move to next item.
1119         accessibilityAdaptor->HandleActionNextEvent();
1120         break;
1121       }
1122       case 7: // TwoFingersFlickUp
1123       {
1124         // Scroll up the list.
1125         accessibilityAdaptor->HandleActionScrollUpEvent();
1126         break;
1127       }
1128       case 8: // TwoFingersFlickDown
1129       {
1130         // Scroll down the list.
1131         accessibilityAdaptor->HandleActionScrollDownEvent();
1132         break;
1133       }
1134       case 9: // TwoFingersFlickLeft
1135       {
1136         // Scroll left to the previous page
1137         accessibilityAdaptor->HandleActionPageLeftEvent();
1138         break;
1139       }
1140       case 10: // TwoFingersFlickRight
1141       {
1142         // Scroll right to the next page
1143         accessibilityAdaptor->HandleActionPageRightEvent();
1144         break;
1145       }
1146       case 11: // ThreeFingersFlickLeft
1147       {
1148         // Not exist yet
1149         break;
1150       }
1151       case 12: // ThreeFingersFlickRight
1152       {
1153         // Not exist yet
1154         break;
1155       }
1156       case 13: // ThreeFingersFlickUp
1157       {
1158         // Not exist yet
1159         break;
1160       }
1161       case 14: // ThreeFingersFlickDown
1162       {
1163         // Not exist yet
1164         break;
1165       }
1166       case 15: // OneFingerSingleTap
1167       {
1168         // Focus, read out.
1169         accessibilityAdaptor->HandleActionReadEvent( (unsigned int)xS, (unsigned int)yS, true /* allow read again */ );
1170         break;
1171       }
1172       case 16: // OneFingerDoubleTap
1173       {
1174         // Activate selected item / active edit mode.
1175         accessibilityAdaptor->HandleActionActivateEvent();
1176         break;
1177       }
1178       case 17: // OneFingerTripleTap
1179       {
1180         // Zoom
1181         accessibilityAdaptor->HandleActionZoomEvent();
1182         break;
1183       }
1184       case 18: // TwoFingersSingleTap
1185       {
1186         // Pause/Resume current speech
1187         accessibilityAdaptor->HandleActionReadPauseResumeEvent();
1188         break;
1189       }
1190       case 19: // TwoFingersDoubleTap
1191       {
1192         // Start/Stop current action
1193         accessibilityAdaptor->HandleActionStartStopEvent();
1194         break;
1195       }
1196       case 20: // TwoFingersTripleTap
1197       {
1198         // Read information from indicator
1199         accessibilityAdaptor->HandleActionReadIndicatorInformationEvent();
1200         break;
1201       }
1202       case 21: // ThreeFingersSingleTap
1203       {
1204         // Read from top item on screen continuously.
1205         accessibilityAdaptor->HandleActionReadFromTopEvent();
1206         break;
1207       }
1208       case 22: // ThreeFingersDoubleTap
1209       {
1210         // Read from next item continuously.
1211         accessibilityAdaptor->HandleActionReadFromNextEvent();
1212         break;
1213       }
1214       case 23: // ThreeFingersTripleTap
1215       {
1216         // Not exist yet
1217         break;
1218       }
1219       case 24: // OneFingerFlickLeftReturn
1220       {
1221         // Scroll up to the previous page
1222         accessibilityAdaptor->HandleActionPageUpEvent();
1223         break;
1224       }
1225       case 25: // OneFingerFlickRightReturn
1226       {
1227         // Scroll down to the next page
1228         accessibilityAdaptor->HandleActionPageDownEvent();
1229         break;
1230       }
1231       case 26: // OneFingerFlickUpReturn
1232       {
1233         // Move to the first item on screen
1234         accessibilityAdaptor->HandleActionMoveToFirstEvent();
1235         break;
1236       }
1237       case 27: // OneFingerFlickDownReturn
1238       {
1239         // Move to the last item on screen
1240         accessibilityAdaptor->HandleActionMoveToLastEvent();
1241         break;
1242       }
1243       case 28: // TwoFingersFlickLeftReturn
1244       {
1245         // Not exist yet
1246         break;
1247       }
1248       case 29: // TwoFingersFlickRightReturn
1249       {
1250         // Not exist yet
1251         break;
1252       }
1253       case 30: // TwoFingersFlickUpReturn
1254       {
1255         // Not exist yet
1256         break;
1257       }
1258       case 31: // TwoFingersFlickDownReturn
1259       {
1260         // Not exist yet
1261         break;
1262       }
1263       case 32: // ThreeFingersFlickLeftReturn
1264       {
1265         // Not exist yet
1266         break;
1267       }
1268       case 33: // ThreeFingersFlickRightReturn
1269       {
1270         // Not exist yet
1271         break;
1272       }
1273       case 34: // ThreeFingersFlickUpReturn
1274       {
1275         // Not exist yet
1276         break;
1277       }
1278       case 35: // ThreeFingersFlickDownReturn
1279       {
1280         // Not exist yet
1281         break;
1282       }
1283     }
1284   }
1285
1286   void EcoreElDBusInitialisation( void *handle )
1287   {
1288     Eldbus_Object *object;
1289     Eldbus_Proxy *manager;
1290
1291     if( !( mSystemConnection = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM) ) )
1292     {
1293       DALI_LOG_ERROR( "Unable to get system bus\n" );
1294     }
1295
1296     object = eldbus_object_get( mSystemConnection, BUS, PATH );
1297     if( !object )
1298     {
1299       DALI_LOG_ERROR( "Getting object failed\n" );
1300       return;
1301     }
1302
1303     manager = eldbus_proxy_get( object, INTERFACE );
1304     if( !manager )
1305     {
1306       DALI_LOG_ERROR( "Getting proxy failed\n" );
1307       return;
1308     }
1309
1310     if( !eldbus_proxy_signal_handler_add( manager, "GestureDetected", OnEcoreElDBusAccessibilityNotification, handle ) )
1311     {
1312       DALI_LOG_ERROR( "No signal handler returned\n" );
1313     }
1314   }
1315 #endif // DALI_ELDBUS_AVAILABLE
1316
1317   /**
1318    * Called when the source window notifies us the content in clipboard is selected.
1319    */
1320   static Eina_Bool EcoreEventSelectionClear( void* data, int type, void* event )
1321   {
1322     DALI_LOG_INFO(gSelectionEventLogFilter, Debug::Concise, "EcoreEventSelectionClear\n" );
1323     return ECORE_CALLBACK_PASS_ON;
1324   }
1325
1326   /**
1327    * Called when the source window sends us about the selected content.
1328    * For example, when dragged items are dragged INTO our window or when items are selected in the clipboard.
1329    */
1330   static Eina_Bool EcoreEventSelectionNotify( void* data, int type, void* event )
1331   {
1332     DALI_LOG_INFO(gSelectionEventLogFilter, Debug::Concise, "EcoreEventSelectionNotify\n" );
1333     return ECORE_CALLBACK_PASS_ON;
1334   }
1335
1336   /**
1337   * Called when the source window notifies us the content in clipboard is selected.
1338   */
1339   static Eina_Bool EcoreEventDataSend( void* data, int type, void* event )
1340   {
1341     DALI_LOG_INFO(gSelectionEventLogFilter, Debug::Concise, "EcoreEventDataSend\n" );
1342
1343     Dali::Clipboard clipboard = Clipboard::Get();
1344     if ( clipboard )
1345     {
1346       Clipboard& clipBoardImpl( GetImplementation( clipboard ) );
1347       clipBoardImpl.ExcuteBuffered( true, event );
1348     }
1349     return ECORE_CALLBACK_PASS_ON;
1350   }
1351
1352    /**
1353     * Called when the source window sends us about the selected content.
1354     * For example, when item is selected in the clipboard.
1355     */
1356    static Eina_Bool EcoreEventDataReceive( void* data, int type, void* event )
1357    {
1358      DALI_LOG_INFO(gSelectionEventLogFilter, Debug::Concise, "EcoreEventDataReceive\n" );
1359
1360      EventHandler* handler( (EventHandler*)data );
1361       Dali::Clipboard clipboard = Clipboard::Get();
1362       char *selectionData = NULL;
1363       if ( clipboard )
1364       {
1365         Clipboard& clipBoardImpl( GetImplementation( clipboard ) );
1366         selectionData = clipBoardImpl.ExcuteBuffered( false, event );
1367       }
1368       if ( selectionData && handler->mClipboardEventNotifier )
1369       {
1370         ClipboardEventNotifier& clipboardEventNotifier( ClipboardEventNotifier::GetImplementation( handler->mClipboardEventNotifier ) );
1371         std::string content( selectionData, strlen(selectionData) );
1372
1373         clipboardEventNotifier.SetContent( content );
1374         clipboardEventNotifier.EmitContentSelectedSignal();
1375       }
1376      return ECORE_CALLBACK_PASS_ON;
1377    }
1378
1379   /*
1380   * Called when rotate event is recevied
1381   */
1382   static Eina_Bool EcoreEventRotate( void* data, int type, void* event )
1383   {
1384     DALI_LOG_INFO( gSelectionEventLogFilter, Debug::Concise, "EcoreEventRotate\n" );
1385
1386     EventHandler* handler( (EventHandler*)data );
1387     Ecore_Wl_Event_Window_Rotate* ev( (Ecore_Wl_Event_Window_Rotate*)event );
1388
1389     if( ev->win != (unsigned int)ecore_wl_window_id_get( handler->mImpl->mWindow ) )
1390     {
1391       return ECORE_CALLBACK_PASS_ON;
1392     }
1393
1394     RotationEvent rotationEvent;
1395     rotationEvent.angle = ev->angle;
1396     rotationEvent.winResize = 0;
1397
1398     if( ev->angle == 0 || ev->angle == 180 )
1399     {
1400       rotationEvent.width = ev->w;
1401       rotationEvent.height = ev->h;
1402     }
1403     else
1404     {
1405       rotationEvent.width = ev->h;
1406       rotationEvent.height = ev->w;
1407     }
1408
1409     handler->SendRotationPrepareEvent( rotationEvent );
1410
1411     return ECORE_CALLBACK_PASS_ON;
1412   }
1413
1414   /*
1415   * Called when detent event is recevied
1416   */
1417   static Eina_Bool EcoreEventDetent( void* data, int type, void* event )
1418   {
1419     DALI_LOG_INFO(gSelectionEventLogFilter, Debug::Concise, "EcoreEventDetent\n" );
1420     EventHandler* handler( (EventHandler*)data );
1421     Ecore_Event_Detent_Rotate *e((Ecore_Event_Detent_Rotate *)event);
1422     int direction = (e->direction == ECORE_DETENT_DIRECTION_CLOCKWISE) ? 1 : -1;
1423     int timeStamp = e->timestamp;
1424
1425     WheelEvent wheelEvent( WheelEvent::CUSTOM_WHEEL, 0, 0, Vector2(0.0f, 0.0f), direction, timeStamp );
1426     handler->SendWheelEvent( wheelEvent );
1427     return ECORE_CALLBACK_PASS_ON;
1428   }
1429
1430   /////////////////////////////////////////////////////////////////////////////////////////////////
1431   // Font Callbacks
1432   /////////////////////////////////////////////////////////////////////////////////////////////////
1433   /**
1434    * Called when a font name is changed.
1435    */
1436   static void VconfNotifyFontNameChanged( keynode_t* node, void* data )
1437   {
1438     EventHandler* handler = static_cast<EventHandler*>( data );
1439     handler->SendEvent( StyleChange::DEFAULT_FONT_CHANGE );
1440   }
1441
1442   /**
1443    * Called when a font size is changed.
1444    */
1445   static void VconfNotifyFontSizeChanged( keynode_t* node, void* data )
1446   {
1447     EventHandler* handler = static_cast<EventHandler*>( data );
1448     handler->SendEvent( StyleChange::DEFAULT_FONT_SIZE_CHANGE );
1449   }
1450
1451   void ConvertTouchPosition( Integration::Point& point )
1452   {
1453     Vector2 position = point.GetScreenPosition();
1454     Vector2 convertedPosition;
1455
1456     switch( mRotationAngle )
1457     {
1458       case 90:
1459       {
1460         convertedPosition.x = mWindowWidth - position.y;
1461         convertedPosition.y = position.x;
1462         break;
1463       }
1464       case 180:
1465       {
1466         convertedPosition.x = mWindowWidth - position.x;
1467         convertedPosition.y = mWindowHeight - position.y;
1468         break;
1469       }
1470       case 270:
1471       {
1472         convertedPosition.x = position.y;
1473         convertedPosition.y = mWindowHeight - position.x;
1474         break;
1475       }
1476       default:
1477       {
1478         convertedPosition = position;
1479         break;
1480       }
1481     }
1482
1483     point.SetScreenPosition( convertedPosition );
1484   }
1485
1486   // Data
1487   EventHandler* mHandler;
1488   std::vector<Ecore_Event_Handler*> mEcoreEventHandler;
1489   Ecore_Wl_Window* mWindow;
1490   int mRotationAngle;
1491   int mWindowWidth;
1492   int mWindowHeight;
1493 #ifdef DALI_ELDBUS_AVAILABLE
1494   Eldbus_Connection* mSystemConnection;
1495 #endif // DALI_ELDBUS_AVAILABLE
1496 };
1497
1498 EventHandler::EventHandler( RenderSurface* surface, CoreEventInterface& coreEventInterface, GestureManager& gestureManager, DamageObserver& damageObserver, DragAndDropDetectorPtr dndDetector )
1499 : mCoreEventInterface( coreEventInterface ),
1500   mGestureManager( gestureManager ),
1501   mStyleMonitor( StyleMonitor::Get() ),
1502   mDamageObserver( damageObserver ),
1503   mRotationObserver( NULL ),
1504   mDragAndDropDetector( dndDetector ),
1505   mAccessibilityAdaptor( AccessibilityAdaptor::Get() ),
1506   mClipboardEventNotifier( ClipboardEventNotifier::Get() ),
1507   mClipboard( Clipboard::Get() ),
1508   mImpl( NULL ),
1509   mPaused( false )
1510 {
1511   Ecore_Wl_Window* window = 0;
1512
1513   // this code only works with the Ecore RenderSurface so need to downcast
1514   ECore::WindowRenderSurface* ecoreSurface = dynamic_cast< ECore::WindowRenderSurface* >( surface );
1515   if( ecoreSurface )
1516   {
1517     window = ecoreSurface->GetWlWindow();
1518   }
1519
1520   mImpl = new Impl(this, window);
1521 }
1522
1523 EventHandler::~EventHandler()
1524 {
1525   if(mImpl)
1526   {
1527     delete mImpl;
1528   }
1529
1530   mGestureManager.Stop();
1531 }
1532
1533 void EventHandler::SendEvent(Integration::Point& point, unsigned long timeStamp)
1534 {
1535   if(timeStamp < 1)
1536   {
1537     timeStamp = GetCurrentMilliSeconds();
1538   }
1539
1540   mImpl->ConvertTouchPosition( point );
1541
1542   Integration::TouchEvent touchEvent;
1543   Integration::HoverEvent hoverEvent;
1544   Integration::TouchEventCombiner::EventDispatchType type = mCombiner.GetNextTouchEvent(point, timeStamp, touchEvent, hoverEvent);
1545   if(type != Integration::TouchEventCombiner::DispatchNone )
1546   {
1547     DALI_LOG_INFO(gTouchEventLogFilter, Debug::General, "%d: Device %d: Button state %d (%.2f, %.2f)\n", timeStamp, point.GetDeviceId(), point.GetState(), point.GetScreenPosition().x, point.GetScreenPosition().y);
1548
1549     // First the touch and/or hover event & related gesture events are queued
1550     if(type == Integration::TouchEventCombiner::DispatchTouch || type == Integration::TouchEventCombiner::DispatchBoth)
1551     {
1552       mCoreEventInterface.QueueCoreEvent( touchEvent );
1553       mGestureManager.SendEvent(touchEvent);
1554     }
1555
1556     if(type == Integration::TouchEventCombiner::DispatchHover || type == Integration::TouchEventCombiner::DispatchBoth)
1557     {
1558       mCoreEventInterface.QueueCoreEvent( hoverEvent );
1559     }
1560
1561     // Next the events are processed with a single call into Core
1562     mCoreEventInterface.ProcessCoreEvents();
1563   }
1564 }
1565
1566 void EventHandler::SendEvent(Integration::KeyEvent& keyEvent)
1567 {
1568   Dali::PhysicalKeyboard physicalKeyboard = PhysicalKeyboard::Get();
1569   if ( physicalKeyboard )
1570   {
1571     if ( ! KeyLookup::IsDeviceButton( keyEvent.keyName.c_str() ) )
1572     {
1573       GetImplementation( physicalKeyboard ).KeyReceived( keyEvent.time > 1 );
1574     }
1575   }
1576
1577   // Create send KeyEvent to Core.
1578   mCoreEventInterface.QueueCoreEvent( keyEvent );
1579   mCoreEventInterface.ProcessCoreEvents();
1580 }
1581
1582 void EventHandler::SendWheelEvent( WheelEvent& wheelEvent )
1583 {
1584   // Create WheelEvent and send to Core.
1585   Integration::WheelEvent event( static_cast< Integration::WheelEvent::Type >(wheelEvent.type), wheelEvent.direction, wheelEvent.modifiers, wheelEvent.point, wheelEvent.z, wheelEvent.timeStamp );
1586   mCoreEventInterface.QueueCoreEvent( event );
1587   mCoreEventInterface.ProcessCoreEvents();
1588 }
1589
1590 void EventHandler::SendEvent( StyleChange::Type styleChange )
1591 {
1592   DALI_ASSERT_DEBUG( mStyleMonitor && "StyleMonitor Not Available" );
1593   GetImplementation( mStyleMonitor ).StyleChanged(styleChange);
1594 }
1595
1596 void EventHandler::SendEvent( const DamageArea& area )
1597 {
1598   mDamageObserver.OnDamaged( area );
1599 }
1600
1601 void EventHandler::SendRotationPrepareEvent( const RotationEvent& event )
1602 {
1603   if( mRotationObserver != NULL )
1604   {
1605     mImpl->mRotationAngle = event.angle;
1606     mImpl->mWindowWidth = event.width;
1607     mImpl->mWindowHeight = event.height;
1608
1609     mRotationObserver->OnRotationPrepare( event );
1610     mRotationObserver->OnRotationRequest();
1611   }
1612 }
1613
1614 void EventHandler::SendRotationRequestEvent( )
1615 {
1616   // No need to separate event into prepare and request in wayland
1617 }
1618
1619 void EventHandler::FeedTouchPoint( TouchPoint& point, int timeStamp)
1620 {
1621   Integration::Point convertedPoint( point );
1622   SendEvent(convertedPoint, timeStamp);
1623 }
1624
1625 void EventHandler::FeedWheelEvent( WheelEvent& wheelEvent )
1626 {
1627   SendWheelEvent( wheelEvent );
1628 }
1629
1630 void EventHandler::FeedKeyEvent( KeyEvent& event )
1631 {
1632   Integration::KeyEvent convertedEvent( event );
1633   SendEvent( convertedEvent );
1634 }
1635
1636 void EventHandler::FeedEvent( Integration::Event& event )
1637 {
1638   mCoreEventInterface.QueueCoreEvent( event );
1639   mCoreEventInterface.ProcessCoreEvents();
1640 }
1641
1642 void EventHandler::Reset()
1643 {
1644   mCombiner.Reset();
1645
1646   // Any touch listeners should be told of the interruption.
1647   Integration::TouchEvent event;
1648   Integration::Point point;
1649   point.SetState( PointState::INTERRUPTED );
1650   event.AddPoint( point );
1651
1652   // First the touch event & related gesture events are queued
1653   mCoreEventInterface.QueueCoreEvent( event );
1654   mGestureManager.SendEvent( event );
1655
1656   // Next the events are processed with a single call into Core
1657   mCoreEventInterface.ProcessCoreEvents();
1658 }
1659
1660 void EventHandler::Pause()
1661 {
1662   mPaused = true;
1663   Reset();
1664 }
1665
1666 void EventHandler::Resume()
1667 {
1668   mPaused = false;
1669   Reset();
1670 }
1671
1672 void EventHandler::SetDragAndDropDetector( DragAndDropDetectorPtr detector )
1673 {
1674   mDragAndDropDetector = detector;
1675 }
1676
1677 void EventHandler::SetRotationObserver( RotationObserver* observer )
1678 {
1679   mRotationObserver = observer;
1680 }
1681
1682 } // namespace Adaptor
1683
1684 } // namespace Internal
1685
1686 } // namespace Dali
1687
1688 #pragma GCC diagnostic pop