[4.0] Delete ime hide when KeyEvent is return or exit
[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                !strcmp( keyEvent->keyname, "XF86Exit" ) )
724           {
725             ecore_imf_context_reset( imfContext );
726           }
727         }
728       }
729     }
730
731     // If the event wasn't handled then we should send a key event.
732     if ( !eventHandled )
733     {
734       if ( keyEvent->window == (unsigned int)ecore_wl_window_id_get(handler->mImpl->mWindow) )
735       {
736         std::string keyName( keyEvent->keyname );
737         std::string keyString( "" );
738         int keyCode = KeyLookup::GetDaliKeyCode( keyEvent->keyname);
739         keyCode = (keyCode == -1) ? 0 : keyCode;
740         int modifier( keyEvent->modifiers );
741         unsigned long time = keyEvent->timestamp;
742         if (!strncmp(keyEvent->keyname, "Keycode-", 8))
743           keyCode = atoi(keyEvent->keyname + 8);
744
745         // Ensure key event string is not NULL as keys like SHIFT have a null string.
746         if ( keyEvent->string )
747         {
748           keyString = keyEvent->string;
749         }
750
751         std::string deviceName;
752         Device::Class::Type deviceClass;
753         Device::Subclass::Type deviceSubclass;
754
755         GetDeviceName( keyEvent, deviceName );
756         GetDeviceClass( ecore_device_class_get( keyEvent->dev ), deviceClass );
757         GetDeviceSubclass( ecore_device_subclass_get( keyEvent->dev ), deviceSubclass );
758
759         DALI_LOG_INFO( gImfLogging, Debug::Verbose, "EVENT EcoreEventKeyDown - >>EcoreEventKeyDown deviceName(%s) deviceClass(%d)\n", deviceName.c_str(), deviceClass );
760
761         Integration::KeyEvent keyEvent(keyName, keyString, keyCode, modifier, time, Integration::KeyEvent::Down, deviceName, deviceClass, deviceSubclass );
762         handler->SendEvent( keyEvent );
763       }
764     }
765
766     return ECORE_CALLBACK_PASS_ON;
767   }
768
769   /**
770    * Called when a key up is received.
771    */
772   static Eina_Bool EcoreEventKeyUp( void* data, int type, void* event )
773   {
774     DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT >>EcoreEventKeyUp\n" );
775
776     EventHandler* handler( (EventHandler*)data );
777     Ecore_Event_Key *keyEvent( (Ecore_Event_Key*)event );
778     bool eventHandled( false );
779
780     // Device keys like Menu, home, back button must skip ecore_imf_context_filter_event.
781     if ( ! KeyLookup::IsDeviceButton( keyEvent->keyname ) )
782     {
783       Ecore_IMF_Context* imfContext = NULL;
784       Dali::ImfManager imfManager( ImfManager::Get() );
785       if ( imfManager )
786       {
787         imfContext = ImfManager::GetImplementation( imfManager ).GetContext();
788       }
789
790       if ( imfContext )
791       {
792         // We're consuming key up event so we have to pass to IMF so that it can parse it as well.
793         Ecore_IMF_Event_Key_Up ecoreKeyUpEvent;
794         ecoreKeyUpEvent.keyname   = keyEvent->keyname;
795         ecoreKeyUpEvent.key       = keyEvent->key;
796         ecoreKeyUpEvent.string    = keyEvent->string;
797         ecoreKeyUpEvent.compose   = keyEvent->compose;
798         ecoreKeyUpEvent.timestamp = keyEvent->timestamp;
799         ecoreKeyUpEvent.modifiers = EcoreInputModifierToEcoreIMFModifier ( keyEvent->modifiers );
800         ecoreKeyUpEvent.locks     = EcoreInputModifierToEcoreIMFLock( keyEvent->modifiers );
801         ecoreKeyUpEvent.dev_name  = ecore_device_name_get( keyEvent->dev );
802         ecoreKeyUpEvent.dev_class = static_cast<Ecore_IMF_Device_Class>( ecore_device_class_get( keyEvent->dev ) );
803         ecoreKeyUpEvent.dev_subclass = static_cast<Ecore_IMF_Device_Subclass>( ecore_device_subclass_get( keyEvent->dev ) );
804
805         eventHandled = ecore_imf_context_filter_event( imfContext,
806                                                        ECORE_IMF_EVENT_KEY_UP,
807                                                        (Ecore_IMF_Event *) &ecoreKeyUpEvent );
808       }
809     }
810
811     // If the event wasn't handled then we should send a key event.
812     if ( !eventHandled )
813     {
814       if ( keyEvent->window == (unsigned int)ecore_wl_window_id_get(handler->mImpl->mWindow) )
815       {
816         std::string keyName( keyEvent->keyname );
817         std::string keyString( "" );
818         int keyCode = KeyLookup::GetDaliKeyCode( keyEvent->keyname);
819         keyCode = (keyCode == -1) ? 0 : keyCode;
820         int modifier( keyEvent->modifiers );
821         unsigned long time = keyEvent->timestamp;
822         if (!strncmp(keyEvent->keyname, "Keycode-", 8))
823           keyCode = atoi(keyEvent->keyname + 8);
824
825         // Ensure key event string is not NULL as keys like SHIFT have a null string.
826         if ( keyEvent->string )
827         {
828           keyString = keyEvent->string;
829         }
830
831         std::string deviceName;
832         Device::Class::Type deviceClass;
833         Device::Subclass::Type deviceSubclass;
834
835         GetDeviceName( keyEvent, deviceName );
836         GetDeviceClass( ecore_device_class_get( keyEvent->dev ), deviceClass );
837         GetDeviceSubclass( ecore_device_subclass_get( keyEvent->dev ), deviceSubclass );
838
839         Integration::KeyEvent keyEvent(keyName, keyString, keyCode, modifier, time, Integration::KeyEvent::Up, deviceName, deviceClass, deviceSubclass );
840         handler->SendEvent( keyEvent );
841       }
842     }
843
844     return ECORE_CALLBACK_PASS_ON;
845   }
846
847   /////////////////////////////////////////////////////////////////////////////////////////////////
848   // Window Callbacks
849   /////////////////////////////////////////////////////////////////////////////////////////////////
850
851   /**
852    * Called when the window gains focus.
853    */
854   static Eina_Bool EcoreEventWindowFocusIn( void* data, int type, void* event )
855   {
856     Ecore_Wl_Event_Focus_In* focusInEvent( (Ecore_Wl_Event_Focus_In*)event );
857     EventHandler* handler( (EventHandler*)data );
858
859     DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT >>EcoreEventWindowFocusIn \n" );
860
861     // If the window gains focus and we hid the keyboard then show it again.
862     if ( focusInEvent->win == (unsigned int)ecore_wl_window_id_get(handler->mImpl->mWindow) )
863     {
864       DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT EcoreEventWindowFocusIn - >>WindowFocusGained \n" );
865
866       if ( ImfManager::IsAvailable() /* Only get the ImfManager if it's available as we do not want to create it */ )
867       {
868         Dali::ImfManager imfManager( ImfManager::Get() );
869         if ( imfManager )
870         {
871           ImfManager& imfManagerImpl( ImfManager::GetImplementation( imfManager ) );
872           if( imfManagerImpl.RestoreAfterFocusLost() )
873           {
874             imfManagerImpl.Activate();
875           }
876         }
877       }
878       Dali::Clipboard clipboard = Clipboard::Get();
879       clipboard.HideClipboard();
880     }
881
882     return ECORE_CALLBACK_PASS_ON;
883   }
884
885   /**
886    * Called when the window loses focus.
887    */
888   static Eina_Bool EcoreEventWindowFocusOut( void* data, int type, void* event )
889   {
890     Ecore_Wl_Event_Focus_Out* focusOutEvent( (Ecore_Wl_Event_Focus_Out*)event );
891     EventHandler* handler( (EventHandler*)data );
892
893     DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT >>EcoreEventWindowFocusOut \n" );
894
895     // If the window loses focus then hide the keyboard.
896     if ( focusOutEvent->win == (unsigned int)ecore_wl_window_id_get(handler->mImpl->mWindow) )
897     {
898       if ( ImfManager::IsAvailable() /* Only get the ImfManager if it's available as we do not want to create it */ )
899       {
900         Dali::ImfManager imfManager( ImfManager::Get() );
901         if ( imfManager )
902         {
903           ImfManager& imfManagerImpl( ImfManager::GetImplementation( imfManager ) );
904           if( imfManagerImpl.RestoreAfterFocusLost() )
905           {
906             imfManagerImpl.Deactivate();
907           }
908         }
909       }
910
911       // Hiding clipboard event will be ignored once because window focus out event is always received on showing clipboard
912       Dali::Clipboard clipboard = Clipboard::Get();
913       if ( clipboard )
914       {
915         Clipboard& clipBoardImpl( GetImplementation( clipboard ) );
916         clipBoardImpl.HideClipboard(true);
917       }
918     }
919
920     return ECORE_CALLBACK_PASS_ON;
921   }
922
923   /**
924    * Called when the window is damaged.
925    */
926   static Eina_Bool EcoreEventWindowDamaged(void *data, int type, void *event)
927   {
928     return ECORE_CALLBACK_PASS_ON;
929   }
930
931   /**
932    * Called when the window properties are changed.
933    * We are only interested in the font change.
934    */
935
936
937   /////////////////////////////////////////////////////////////////////////////////////////////////
938   // Drag & Drop Callbacks
939   /////////////////////////////////////////////////////////////////////////////////////////////////
940
941   /**
942    * Called when a dragged item enters our window's bounds.
943    * This is when items are dragged INTO our window.
944    */
945   static Eina_Bool EcoreEventDndEnter( void* data, int type, void* event )
946   {
947     DALI_LOG_INFO( gDragAndDropLogFilter, Debug::Concise, "EcoreEventDndEnter\n" );
948
949     return ECORE_CALLBACK_PASS_ON;
950   }
951
952   /**
953    * Called when a dragged item is moved within our window.
954    * This is when items are dragged INTO our window.
955    */
956   static Eina_Bool EcoreEventDndPosition( void* data, int type, void* event )
957   {
958     DALI_LOG_INFO(gDragAndDropLogFilter, Debug::Concise, "EcoreEventDndPosition\n" );
959
960     return ECORE_CALLBACK_PASS_ON;
961   }
962
963   /**
964    * Called when a dragged item leaves our window's bounds.
965    * This is when items are dragged INTO our window.
966    */
967   static Eina_Bool EcoreEventDndLeave( void* data, int type, void* event )
968   {
969     DALI_LOG_INFO(gDragAndDropLogFilter, Debug::Concise, "EcoreEventDndLeave\n" );
970
971     return ECORE_CALLBACK_PASS_ON;
972   }
973
974   /**
975    * Called when the dragged item is dropped within our window's bounds.
976    * This is when items are dragged INTO our window.
977    */
978   static Eina_Bool EcoreEventDndDrop( void* data, int type, void* event )
979   {
980     DALI_LOG_INFO(gDragAndDropLogFilter, Debug::Concise, "EcoreEventDndDrop\n" );
981
982     return ECORE_CALLBACK_PASS_ON;
983   }
984
985   /**
986    * Called when a dragged item is moved from our window and the target window has done processing it.
987    * This is when items are dragged FROM our window.
988    */
989   static Eina_Bool EcoreEventDndFinished( void* data, int type, void* event )
990   {
991     DALI_LOG_INFO(gDragAndDropLogFilter, Debug::Concise, "EcoreEventDndFinished\n" );
992     return ECORE_CALLBACK_PASS_ON;
993   }
994
995   /**
996    * Called when a dragged item is moved from our window and the target window has sent us a status.
997    * This is when items are dragged FROM our window.
998    */
999   static Eina_Bool EcoreEventDndStatus( void* data, int type, void* event )
1000   {
1001     DALI_LOG_INFO(gDragAndDropLogFilter, Debug::Concise, "EcoreEventDndStatus\n" );
1002     return ECORE_CALLBACK_PASS_ON;
1003   }
1004
1005   /**
1006    * Called when the client messages (i.e. the accessibility events) are received.
1007    */
1008   static Eina_Bool EcoreEventClientMessage( void* data, int type, void* event )
1009   {
1010     return ECORE_CALLBACK_PASS_ON;
1011   }
1012
1013
1014   /////////////////////////////////////////////////////////////////////////////////////////////////
1015   // ElDBus Accessibility Callbacks
1016   /////////////////////////////////////////////////////////////////////////////////////////////////
1017
1018 #ifdef DALI_ELDBUS_AVAILABLE
1019   // Callback for Ecore ElDBus accessibility events.
1020   static void OnEcoreElDBusAccessibilityNotification( void *context EINA_UNUSED, const Eldbus_Message *message )
1021   {
1022     EventHandler* handler = static_cast< EventHandler* >( context );
1023     // Ignore any accessibility events when paused.
1024     if( handler->mPaused )
1025     {
1026       return;
1027     }
1028
1029     if( !handler->mAccessibilityAdaptor )
1030     {
1031       DALI_LOG_ERROR( "Invalid accessibility adaptor\n" );
1032       return;
1033     }
1034
1035     AccessibilityAdaptor* accessibilityAdaptor( &AccessibilityAdaptor::GetImplementation( handler->mAccessibilityAdaptor ) );
1036     if( !accessibilityAdaptor )
1037     {
1038       DALI_LOG_ERROR( "Cannot access accessibility adaptor\n" );
1039       return;
1040     }
1041
1042     int gestureValue;
1043     int xS, yS, xE, yE;
1044     int state; // 0 - begin, 1 - ongoing, 2 - ended, 3 - aborted
1045     int eventTime;
1046
1047     // The string defines the arg-list's respective types.
1048     if( !eldbus_message_arguments_get( message, "iiiiiiu", &gestureValue, &xS, &yS, &xE, &yE, &state, &eventTime ) )
1049     {
1050       DALI_LOG_ERROR( "OnEcoreElDBusAccessibilityNotification: Error getting arguments\n" );
1051     }
1052
1053     DALI_LOG_INFO( gImfLogging, Debug::General, "Got gesture: Name: %d  Args: %d,%d,%d,%d  State: %d\n", gestureValue, xS, yS, xE, yE );
1054
1055     // Create a touch point object.
1056     TouchPoint::State touchPointState( TouchPoint::Down );
1057     if( state == 0 )
1058     {
1059       touchPointState = TouchPoint::Down; // Mouse down.
1060     }
1061     else if( state == 1 )
1062     {
1063       touchPointState = TouchPoint::Motion; // Mouse move.
1064     }
1065     else if( state == 2 )
1066     {
1067       touchPointState = TouchPoint::Up; // Mouse up.
1068     }
1069     else
1070     {
1071       touchPointState = TouchPoint::Interrupted; // Error.
1072     }
1073
1074     // Send touch event to accessibility adaptor.
1075     TouchPoint point( 0, touchPointState, (float)xS, (float)yS );
1076
1077     // Perform actions based on received gestures.
1078     // Note: This is seperated from the reading so we can have other input readers without changing the below code.
1079     switch( gestureValue )
1080     {
1081       case 0: // OneFingerHover
1082       {
1083         // Focus, read out.
1084         accessibilityAdaptor->HandleActionReadEvent( (unsigned int)xS, (unsigned int)yS, true /* allow read again */ );
1085         break;
1086       }
1087       case 1: // TwoFingersHover
1088       {
1089         // In accessibility mode, scroll action should be handled when the currently focused actor is contained in scrollable control
1090         accessibilityAdaptor->HandleActionScrollEvent( point, GetCurrentMilliSeconds() );
1091         break;
1092       }
1093       case 2: // ThreeFingersHover
1094       {
1095         // Read from top item on screen continuously.
1096         accessibilityAdaptor->HandleActionReadFromTopEvent();
1097         break;
1098       }
1099       case 3: // OneFingerFlickLeft
1100       {
1101         // Move to previous item.
1102         accessibilityAdaptor->HandleActionReadPreviousEvent();
1103         break;
1104       }
1105       case 4: // OneFingerFlickRight
1106       {
1107         // Move to next item.
1108         accessibilityAdaptor->HandleActionReadNextEvent();
1109         break;
1110       }
1111       case 5: // OneFingerFlickUp
1112       {
1113         // Move to previous item.
1114         accessibilityAdaptor->HandleActionPreviousEvent();
1115         break;
1116       }
1117       case 6: // OneFingerFlickDown
1118       {
1119         // Move to next item.
1120         accessibilityAdaptor->HandleActionNextEvent();
1121         break;
1122       }
1123       case 7: // TwoFingersFlickUp
1124       {
1125         // Scroll up the list.
1126         accessibilityAdaptor->HandleActionScrollUpEvent();
1127         break;
1128       }
1129       case 8: // TwoFingersFlickDown
1130       {
1131         // Scroll down the list.
1132         accessibilityAdaptor->HandleActionScrollDownEvent();
1133         break;
1134       }
1135       case 9: // TwoFingersFlickLeft
1136       {
1137         // Scroll left to the previous page
1138         accessibilityAdaptor->HandleActionPageLeftEvent();
1139         break;
1140       }
1141       case 10: // TwoFingersFlickRight
1142       {
1143         // Scroll right to the next page
1144         accessibilityAdaptor->HandleActionPageRightEvent();
1145         break;
1146       }
1147       case 11: // ThreeFingersFlickLeft
1148       {
1149         // Not exist yet
1150         break;
1151       }
1152       case 12: // ThreeFingersFlickRight
1153       {
1154         // Not exist yet
1155         break;
1156       }
1157       case 13: // ThreeFingersFlickUp
1158       {
1159         // Not exist yet
1160         break;
1161       }
1162       case 14: // ThreeFingersFlickDown
1163       {
1164         // Not exist yet
1165         break;
1166       }
1167       case 15: // OneFingerSingleTap
1168       {
1169         // Focus, read out.
1170         accessibilityAdaptor->HandleActionReadEvent( (unsigned int)xS, (unsigned int)yS, true /* allow read again */ );
1171         break;
1172       }
1173       case 16: // OneFingerDoubleTap
1174       {
1175         // Activate selected item / active edit mode.
1176         accessibilityAdaptor->HandleActionActivateEvent();
1177         break;
1178       }
1179       case 17: // OneFingerTripleTap
1180       {
1181         // Zoom
1182         accessibilityAdaptor->HandleActionZoomEvent();
1183         break;
1184       }
1185       case 18: // TwoFingersSingleTap
1186       {
1187         // Pause/Resume current speech
1188         accessibilityAdaptor->HandleActionReadPauseResumeEvent();
1189         break;
1190       }
1191       case 19: // TwoFingersDoubleTap
1192       {
1193         // Start/Stop current action
1194         accessibilityAdaptor->HandleActionStartStopEvent();
1195         break;
1196       }
1197       case 20: // TwoFingersTripleTap
1198       {
1199         // Read information from indicator
1200         accessibilityAdaptor->HandleActionReadIndicatorInformationEvent();
1201         break;
1202       }
1203       case 21: // ThreeFingersSingleTap
1204       {
1205         // Read from top item on screen continuously.
1206         accessibilityAdaptor->HandleActionReadFromTopEvent();
1207         break;
1208       }
1209       case 22: // ThreeFingersDoubleTap
1210       {
1211         // Read from next item continuously.
1212         accessibilityAdaptor->HandleActionReadFromNextEvent();
1213         break;
1214       }
1215       case 23: // ThreeFingersTripleTap
1216       {
1217         // Not exist yet
1218         break;
1219       }
1220       case 24: // OneFingerFlickLeftReturn
1221       {
1222         // Scroll up to the previous page
1223         accessibilityAdaptor->HandleActionPageUpEvent();
1224         break;
1225       }
1226       case 25: // OneFingerFlickRightReturn
1227       {
1228         // Scroll down to the next page
1229         accessibilityAdaptor->HandleActionPageDownEvent();
1230         break;
1231       }
1232       case 26: // OneFingerFlickUpReturn
1233       {
1234         // Move to the first item on screen
1235         accessibilityAdaptor->HandleActionMoveToFirstEvent();
1236         break;
1237       }
1238       case 27: // OneFingerFlickDownReturn
1239       {
1240         // Move to the last item on screen
1241         accessibilityAdaptor->HandleActionMoveToLastEvent();
1242         break;
1243       }
1244       case 28: // TwoFingersFlickLeftReturn
1245       {
1246         // Not exist yet
1247         break;
1248       }
1249       case 29: // TwoFingersFlickRightReturn
1250       {
1251         // Not exist yet
1252         break;
1253       }
1254       case 30: // TwoFingersFlickUpReturn
1255       {
1256         // Not exist yet
1257         break;
1258       }
1259       case 31: // TwoFingersFlickDownReturn
1260       {
1261         // Not exist yet
1262         break;
1263       }
1264       case 32: // ThreeFingersFlickLeftReturn
1265       {
1266         // Not exist yet
1267         break;
1268       }
1269       case 33: // ThreeFingersFlickRightReturn
1270       {
1271         // Not exist yet
1272         break;
1273       }
1274       case 34: // ThreeFingersFlickUpReturn
1275       {
1276         // Not exist yet
1277         break;
1278       }
1279       case 35: // ThreeFingersFlickDownReturn
1280       {
1281         // Not exist yet
1282         break;
1283       }
1284     }
1285   }
1286
1287   void EcoreElDBusInitialisation( void *handle )
1288   {
1289     Eldbus_Object *object;
1290     Eldbus_Proxy *manager;
1291
1292     if( !( mSystemConnection = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM) ) )
1293     {
1294       DALI_LOG_ERROR( "Unable to get system bus\n" );
1295     }
1296
1297     object = eldbus_object_get( mSystemConnection, BUS, PATH );
1298     if( !object )
1299     {
1300       DALI_LOG_ERROR( "Getting object failed\n" );
1301       return;
1302     }
1303
1304     manager = eldbus_proxy_get( object, INTERFACE );
1305     if( !manager )
1306     {
1307       DALI_LOG_ERROR( "Getting proxy failed\n" );
1308       return;
1309     }
1310
1311     if( !eldbus_proxy_signal_handler_add( manager, "GestureDetected", OnEcoreElDBusAccessibilityNotification, handle ) )
1312     {
1313       DALI_LOG_ERROR( "No signal handler returned\n" );
1314     }
1315   }
1316 #endif // DALI_ELDBUS_AVAILABLE
1317
1318   /**
1319    * Called when the source window notifies us the content in clipboard is selected.
1320    */
1321   static Eina_Bool EcoreEventSelectionClear( void* data, int type, void* event )
1322   {
1323     DALI_LOG_INFO(gSelectionEventLogFilter, Debug::Concise, "EcoreEventSelectionClear\n" );
1324     return ECORE_CALLBACK_PASS_ON;
1325   }
1326
1327   /**
1328    * Called when the source window sends us about the selected content.
1329    * For example, when dragged items are dragged INTO our window or when items are selected in the clipboard.
1330    */
1331   static Eina_Bool EcoreEventSelectionNotify( void* data, int type, void* event )
1332   {
1333     DALI_LOG_INFO(gSelectionEventLogFilter, Debug::Concise, "EcoreEventSelectionNotify\n" );
1334     return ECORE_CALLBACK_PASS_ON;
1335   }
1336
1337   /**
1338   * Called when the source window notifies us the content in clipboard is selected.
1339   */
1340   static Eina_Bool EcoreEventDataSend( void* data, int type, void* event )
1341   {
1342     DALI_LOG_INFO(gSelectionEventLogFilter, Debug::Concise, "EcoreEventDataSend\n" );
1343
1344     Dali::Clipboard clipboard = Clipboard::Get();
1345     if ( clipboard )
1346     {
1347       Clipboard& clipBoardImpl( GetImplementation( clipboard ) );
1348       clipBoardImpl.ExcuteBuffered( true, event );
1349     }
1350     return ECORE_CALLBACK_PASS_ON;
1351   }
1352
1353    /**
1354     * Called when the source window sends us about the selected content.
1355     * For example, when item is selected in the clipboard.
1356     */
1357    static Eina_Bool EcoreEventDataReceive( void* data, int type, void* event )
1358    {
1359      DALI_LOG_INFO(gSelectionEventLogFilter, Debug::Concise, "EcoreEventDataReceive\n" );
1360
1361      EventHandler* handler( (EventHandler*)data );
1362       Dali::Clipboard clipboard = Clipboard::Get();
1363       char *selectionData = NULL;
1364       if ( clipboard )
1365       {
1366         Clipboard& clipBoardImpl( GetImplementation( clipboard ) );
1367         selectionData = clipBoardImpl.ExcuteBuffered( false, event );
1368       }
1369       if ( selectionData && handler->mClipboardEventNotifier )
1370       {
1371         ClipboardEventNotifier& clipboardEventNotifier( ClipboardEventNotifier::GetImplementation( handler->mClipboardEventNotifier ) );
1372         std::string content( selectionData, strlen(selectionData) );
1373
1374         clipboardEventNotifier.SetContent( content );
1375         clipboardEventNotifier.EmitContentSelectedSignal();
1376       }
1377      return ECORE_CALLBACK_PASS_ON;
1378    }
1379
1380   /*
1381   * Called when rotate event is recevied
1382   */
1383   static Eina_Bool EcoreEventRotate( void* data, int type, void* event )
1384   {
1385     DALI_LOG_INFO( gSelectionEventLogFilter, Debug::Concise, "EcoreEventRotate\n" );
1386
1387     EventHandler* handler( (EventHandler*)data );
1388     Ecore_Wl_Event_Window_Rotate* ev( (Ecore_Wl_Event_Window_Rotate*)event );
1389
1390     if( ev->win != (unsigned int)ecore_wl_window_id_get( handler->mImpl->mWindow ) )
1391     {
1392       return ECORE_CALLBACK_PASS_ON;
1393     }
1394
1395     RotationEvent rotationEvent;
1396     rotationEvent.angle = ev->angle;
1397     rotationEvent.winResize = 0;
1398
1399     if( ev->angle == 0 || ev->angle == 180 )
1400     {
1401       rotationEvent.width = ev->w;
1402       rotationEvent.height = ev->h;
1403     }
1404     else
1405     {
1406       rotationEvent.width = ev->h;
1407       rotationEvent.height = ev->w;
1408     }
1409
1410     handler->SendRotationPrepareEvent( rotationEvent );
1411
1412     return ECORE_CALLBACK_PASS_ON;
1413   }
1414
1415   /*
1416   * Called when detent event is recevied
1417   */
1418   static Eina_Bool EcoreEventDetent( void* data, int type, void* event )
1419   {
1420     DALI_LOG_INFO(gSelectionEventLogFilter, Debug::Concise, "EcoreEventDetent\n" );
1421     EventHandler* handler( (EventHandler*)data );
1422     Ecore_Event_Detent_Rotate *e((Ecore_Event_Detent_Rotate *)event);
1423     int direction = (e->direction == ECORE_DETENT_DIRECTION_CLOCKWISE) ? 1 : -1;
1424     int timeStamp = e->timestamp;
1425
1426     WheelEvent wheelEvent( WheelEvent::CUSTOM_WHEEL, 0, 0, Vector2(0.0f, 0.0f), direction, timeStamp );
1427     handler->SendWheelEvent( wheelEvent );
1428     return ECORE_CALLBACK_PASS_ON;
1429   }
1430
1431   /////////////////////////////////////////////////////////////////////////////////////////////////
1432   // Font Callbacks
1433   /////////////////////////////////////////////////////////////////////////////////////////////////
1434   /**
1435    * Called when a font name is changed.
1436    */
1437   static void VconfNotifyFontNameChanged( keynode_t* node, void* data )
1438   {
1439     EventHandler* handler = static_cast<EventHandler*>( data );
1440     handler->SendEvent( StyleChange::DEFAULT_FONT_CHANGE );
1441   }
1442
1443   /**
1444    * Called when a font size is changed.
1445    */
1446   static void VconfNotifyFontSizeChanged( keynode_t* node, void* data )
1447   {
1448     EventHandler* handler = static_cast<EventHandler*>( data );
1449     handler->SendEvent( StyleChange::DEFAULT_FONT_SIZE_CHANGE );
1450   }
1451
1452   void ConvertTouchPosition( Integration::Point& point )
1453   {
1454     Vector2 position = point.GetScreenPosition();
1455     Vector2 convertedPosition;
1456
1457     switch( mRotationAngle )
1458     {
1459       case 90:
1460       {
1461         convertedPosition.x = mWindowWidth - position.y;
1462         convertedPosition.y = position.x;
1463         break;
1464       }
1465       case 180:
1466       {
1467         convertedPosition.x = mWindowWidth - position.x;
1468         convertedPosition.y = mWindowHeight - position.y;
1469         break;
1470       }
1471       case 270:
1472       {
1473         convertedPosition.x = position.y;
1474         convertedPosition.y = mWindowHeight - position.x;
1475         break;
1476       }
1477       default:
1478       {
1479         convertedPosition = position;
1480         break;
1481       }
1482     }
1483
1484     point.SetScreenPosition( convertedPosition );
1485   }
1486
1487   // Data
1488   EventHandler* mHandler;
1489   std::vector<Ecore_Event_Handler*> mEcoreEventHandler;
1490   Ecore_Wl_Window* mWindow;
1491   int mRotationAngle;
1492   int mWindowWidth;
1493   int mWindowHeight;
1494 #ifdef DALI_ELDBUS_AVAILABLE
1495   Eldbus_Connection* mSystemConnection;
1496 #endif // DALI_ELDBUS_AVAILABLE
1497 };
1498
1499 EventHandler::EventHandler( RenderSurface* surface, CoreEventInterface& coreEventInterface, GestureManager& gestureManager, DamageObserver& damageObserver, DragAndDropDetectorPtr dndDetector )
1500 : mCoreEventInterface( coreEventInterface ),
1501   mGestureManager( gestureManager ),
1502   mStyleMonitor( StyleMonitor::Get() ),
1503   mDamageObserver( damageObserver ),
1504   mRotationObserver( NULL ),
1505   mDragAndDropDetector( dndDetector ),
1506   mAccessibilityAdaptor( AccessibilityAdaptor::Get() ),
1507   mClipboardEventNotifier( ClipboardEventNotifier::Get() ),
1508   mClipboard( Clipboard::Get() ),
1509   mImpl( NULL ),
1510   mPaused( false )
1511 {
1512   Ecore_Wl_Window* window = 0;
1513
1514   // this code only works with the Ecore RenderSurface so need to downcast
1515   ECore::WindowRenderSurface* ecoreSurface = dynamic_cast< ECore::WindowRenderSurface* >( surface );
1516   if( ecoreSurface )
1517   {
1518     window = ecoreSurface->GetWlWindow();
1519   }
1520
1521   mImpl = new Impl(this, window);
1522 }
1523
1524 EventHandler::~EventHandler()
1525 {
1526   if(mImpl)
1527   {
1528     delete mImpl;
1529   }
1530
1531   mGestureManager.Stop();
1532 }
1533
1534 void EventHandler::SendEvent(Integration::Point& point, unsigned long timeStamp)
1535 {
1536   if(timeStamp < 1)
1537   {
1538     timeStamp = GetCurrentMilliSeconds();
1539   }
1540
1541   mImpl->ConvertTouchPosition( point );
1542
1543   Integration::TouchEvent touchEvent;
1544   Integration::HoverEvent hoverEvent;
1545   Integration::TouchEventCombiner::EventDispatchType type = mCombiner.GetNextTouchEvent(point, timeStamp, touchEvent, hoverEvent);
1546   if(type != Integration::TouchEventCombiner::DispatchNone )
1547   {
1548     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);
1549
1550     // First the touch and/or hover event & related gesture events are queued
1551     if(type == Integration::TouchEventCombiner::DispatchTouch || type == Integration::TouchEventCombiner::DispatchBoth)
1552     {
1553       mCoreEventInterface.QueueCoreEvent( touchEvent );
1554       mGestureManager.SendEvent(touchEvent);
1555     }
1556
1557     if(type == Integration::TouchEventCombiner::DispatchHover || type == Integration::TouchEventCombiner::DispatchBoth)
1558     {
1559       mCoreEventInterface.QueueCoreEvent( hoverEvent );
1560     }
1561
1562     // Next the events are processed with a single call into Core
1563     mCoreEventInterface.ProcessCoreEvents();
1564   }
1565 }
1566
1567 void EventHandler::SendEvent(Integration::KeyEvent& keyEvent)
1568 {
1569   Dali::PhysicalKeyboard physicalKeyboard = PhysicalKeyboard::Get();
1570   if ( physicalKeyboard )
1571   {
1572     if ( ! KeyLookup::IsDeviceButton( keyEvent.keyName.c_str() ) )
1573     {
1574       GetImplementation( physicalKeyboard ).KeyReceived( keyEvent.time > 1 );
1575     }
1576   }
1577
1578   // Create send KeyEvent to Core.
1579   mCoreEventInterface.QueueCoreEvent( keyEvent );
1580   mCoreEventInterface.ProcessCoreEvents();
1581 }
1582
1583 void EventHandler::SendWheelEvent( WheelEvent& wheelEvent )
1584 {
1585   // Create WheelEvent and send to Core.
1586   Integration::WheelEvent event( static_cast< Integration::WheelEvent::Type >(wheelEvent.type), wheelEvent.direction, wheelEvent.modifiers, wheelEvent.point, wheelEvent.z, wheelEvent.timeStamp );
1587   mCoreEventInterface.QueueCoreEvent( event );
1588   mCoreEventInterface.ProcessCoreEvents();
1589 }
1590
1591 void EventHandler::SendEvent( StyleChange::Type styleChange )
1592 {
1593   DALI_ASSERT_DEBUG( mStyleMonitor && "StyleMonitor Not Available" );
1594   GetImplementation( mStyleMonitor ).StyleChanged(styleChange);
1595 }
1596
1597 void EventHandler::SendEvent( const DamageArea& area )
1598 {
1599   mDamageObserver.OnDamaged( area );
1600 }
1601
1602 void EventHandler::SendRotationPrepareEvent( const RotationEvent& event )
1603 {
1604   if( mRotationObserver != NULL )
1605   {
1606     mImpl->mRotationAngle = event.angle;
1607     mImpl->mWindowWidth = event.width;
1608     mImpl->mWindowHeight = event.height;
1609
1610     mRotationObserver->OnRotationPrepare( event );
1611     mRotationObserver->OnRotationRequest();
1612   }
1613 }
1614
1615 void EventHandler::SendRotationRequestEvent( )
1616 {
1617   // No need to separate event into prepare and request in wayland
1618 }
1619
1620 void EventHandler::FeedTouchPoint( TouchPoint& point, int timeStamp)
1621 {
1622   Integration::Point convertedPoint( point );
1623   SendEvent(convertedPoint, timeStamp);
1624 }
1625
1626 void EventHandler::FeedWheelEvent( WheelEvent& wheelEvent )
1627 {
1628   SendWheelEvent( wheelEvent );
1629 }
1630
1631 void EventHandler::FeedKeyEvent( KeyEvent& event )
1632 {
1633   Integration::KeyEvent convertedEvent( event );
1634   SendEvent( convertedEvent );
1635 }
1636
1637 void EventHandler::FeedEvent( Integration::Event& event )
1638 {
1639   mCoreEventInterface.QueueCoreEvent( event );
1640   mCoreEventInterface.ProcessCoreEvents();
1641 }
1642
1643 void EventHandler::Reset()
1644 {
1645   mCombiner.Reset();
1646
1647   // Any touch listeners should be told of the interruption.
1648   Integration::TouchEvent event;
1649   Integration::Point point;
1650   point.SetState( PointState::INTERRUPTED );
1651   event.AddPoint( point );
1652
1653   // First the touch event & related gesture events are queued
1654   mCoreEventInterface.QueueCoreEvent( event );
1655   mGestureManager.SendEvent( event );
1656
1657   // Next the events are processed with a single call into Core
1658   mCoreEventInterface.ProcessCoreEvents();
1659 }
1660
1661 void EventHandler::Pause()
1662 {
1663   mPaused = true;
1664   Reset();
1665 }
1666
1667 void EventHandler::Resume()
1668 {
1669   mPaused = false;
1670   Reset();
1671 }
1672
1673 void EventHandler::SetDragAndDropDetector( DragAndDropDetectorPtr detector )
1674 {
1675   mDragAndDropDetector = detector;
1676 }
1677
1678 void EventHandler::SetRotationObserver( RotationObserver* observer )
1679 {
1680   mRotationObserver = observer;
1681 }
1682
1683 } // namespace Adaptor
1684
1685 } // namespace Internal
1686
1687 } // namespace Dali
1688
1689 #pragma GCC diagnostic pop