2 * Copyright (c) 2019 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include "evas-event-handler.h"
31 * Copied from x server
32 * @brief Retrieve the current milliseconds.
34 * @return the current milliseconds.
36 static unsigned int GetCurrentMilliSeconds(void)
41 static clockid_t clockid;
45 #ifdef CLOCK_MONOTONIC_COARSE
46 if (clock_getres(CLOCK_MONOTONIC_COARSE, &tp) == 0 &&
47 (tp.tv_nsec / 1000) <= 1000 && clock_gettime(CLOCK_MONOTONIC_COARSE, &tp) == 0)
49 clockid = CLOCK_MONOTONIC_COARSE;
53 if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
55 clockid = CLOCK_MONOTONIC;
62 if (clockid != ~0L && clock_gettime(clockid, &tp) == 0)
64 return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000L);
67 gettimeofday(&tv, NULL);
68 return (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
74 const int TOUCH_DEVICE_ID = 0;
76 const char* EVAS_OBJECT_FOCUSED_EVENT_NAME = "focused";
77 const char* EVAS_OBJECT_UNFOCUSED_EVENT_NAME = "unfocused";
80 * @brief Retrieve the dali screen touch point.
82 * @param[in] canvasX is the x of canvas position
83 * @param[in] canvasY is the y of canvas position
84 * @param[in] evasObject is rendered by dali
85 * @param[out] screenX is the x of local position of evasObject
86 * @param[out] screenY is the y of local position of evasObject
88 void GetScreenPosition(Evas_Coord canvasX, Evas_Coord canvasY, Evas_Object* evasObject, Evas_Coord &screenX, Evas_Coord &screenY)
90 Evas_Coord objX = 0, objY = 0, objW = 0, objH = 0;
91 evas_object_geometry_get(evasObject, &objX, &objY, &objW, &objH);
93 screenX = canvasX - objX;
94 screenY = canvasY - objY;
97 #ifdef DALI_EVASPLUGIN_USE_IMF_MANAGER
99 * @brief Evas_Modifier enums in Ecore_Input.h do not match Ecore_Event_Modifier in Ecore_Input.h.
100 * This function converts from Evas_Modifier to Ecore_Event_Modifier enums.
102 * @param[in] evasModifier the Evas_Modifier input.
103 * @return the Ecore_Event_Modifier output.
105 unsigned int EvasModifierToEcoreModifier(Evas_Modifier* evasModifier)
107 unsigned int modifier = 0; // If no other matches returns NONE.
109 if (evas_key_modifier_is_set(evasModifier, "Shift"))
111 modifier |= ECORE_EVENT_MODIFIER_SHIFT;
114 if (evas_key_modifier_is_set(evasModifier, "Alt"))
116 modifier |= ECORE_EVENT_MODIFIER_ALT;
119 if (evas_key_modifier_is_set(evasModifier, "AltGr"))
121 modifier |= ECORE_EVENT_MODIFIER_ALTGR;
124 if (evas_key_modifier_is_set(evasModifier, "Control"))
126 modifier |= ECORE_EVENT_MODIFIER_CTRL;
129 if (evas_key_modifier_is_set(evasModifier, "Win") ||
130 evas_key_modifier_is_set(evasModifier, "Super") ||
131 evas_key_modifier_is_set(evasModifier, "Hyper"))
133 modifier |= ECORE_EVENT_MODIFIER_WIN;
141 void ConvertActionInfo(Elm_Access_Action_Info* elmActionInfo, Dali::Extension::Internal::AccessActionInfo& daliActionInfo)
143 daliActionInfo.x = elmActionInfo->x;
144 daliActionInfo.y = elmActionInfo->y;
145 daliActionInfo.mouseType = elmActionInfo->mouse_type;
147 switch(elmActionInfo->action_type)
149 case ELM_ACCESS_ACTION_HIGHLIGHT:
151 daliActionInfo.actionType = ACCESS_ACTION_HIGHLIGHT;
155 case ELM_ACCESS_ACTION_READ:
157 daliActionInfo.actionType = ACCESS_ACTION_READ;
161 case ELM_ACCESS_ACTION_HIGHLIGHT_PREV:
163 daliActionInfo.actionType = ACCESS_ACTION_HIGHLIGHT_PREV;
167 case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT:
169 daliActionInfo.actionType = ACCESS_ACTION_HIGHLIGHT_NEXT;
173 case ELM_ACCESS_ACTION_ACTIVATE:
175 daliActionInfo.actionType = ACCESS_ACTION_ACTIVATE;
179 case ELM_ACCESS_ACTION_UNHIGHLIGHT:
181 daliActionInfo.actionType = ACCESS_ACTION_UNHIGHLIGHT;
185 case ELM_ACCESS_ACTION_SCROLL:
187 daliActionInfo.actionType = ACCESS_ACTION_SCROLL;
191 case ELM_ACCESS_ACTION_UP:
193 daliActionInfo.actionType = ACCESS_ACTION_UP;
197 case ELM_ACCESS_ACTION_DOWN:
199 daliActionInfo.actionType = ACCESS_ACTION_DOWN;
203 case ELM_ACCESS_ACTION_BACK:
205 daliActionInfo.actionType = ACCESS_ACTION_BACK;
214 switch(elmActionInfo->action_by)
216 case ELM_ACCESS_ACTION_HIGHLIGHT:
218 daliActionInfo.actionBy = ACCESS_ACTION_HIGHLIGHT;
222 case ELM_ACCESS_ACTION_READ:
224 daliActionInfo.actionBy = ACCESS_ACTION_READ;
228 case ELM_ACCESS_ACTION_HIGHLIGHT_PREV:
230 daliActionInfo.actionBy = ACCESS_ACTION_HIGHLIGHT_PREV;
234 case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT:
236 daliActionInfo.actionBy = ACCESS_ACTION_HIGHLIGHT_NEXT;
240 case ELM_ACCESS_ACTION_ACTIVATE:
242 daliActionInfo.actionBy = ACCESS_ACTION_ACTIVATE;
246 case ELM_ACCESS_ACTION_UNHIGHLIGHT:
248 daliActionInfo.actionBy = ACCESS_ACTION_UNHIGHLIGHT;
252 case ELM_ACCESS_ACTION_SCROLL:
254 daliActionInfo.actionBy = ACCESS_ACTION_SCROLL;
258 case ELM_ACCESS_ACTION_UP:
260 daliActionInfo.actionBy = ACCESS_ACTION_UP;
264 case ELM_ACCESS_ACTION_DOWN:
266 daliActionInfo.actionBy = ACCESS_ACTION_DOWN;
270 case ELM_ACCESS_ACTION_BACK:
272 daliActionInfo.actionBy = ACCESS_ACTION_BACK;
281 daliActionInfo.highlightCycle = elmActionInfo->highlight_cycle;
282 daliActionInfo.timeStamp = GetCurrentMilliSeconds();
287 EvasEventHandler::EvasEventHandler(Evas_Object* imageEvasObject,
288 Evas_Object* elmAccessEvasObject,
289 Evas_Object* elmFocusEvasObject,
290 EvasPluginEventInterface& evasPluginEventInterface)
291 : mEvasPluginEventInterface(evasPluginEventInterface)
292 , mEvas(evas_object_evas_get(imageEvasObject))
293 , mImageEvasObject(imageEvasObject)
294 , mElmAccessEvasObject(elmAccessEvasObject)
295 , mElmFocusEvasObject(elmFocusEvasObject)
297 // Register the evas event callbacks
298 evas_object_event_callback_add(mImageEvasObject, EVAS_CALLBACK_MOUSE_DOWN, OnEvasObjectMouseDown, &evasPluginEventInterface);
299 evas_object_event_callback_add(mImageEvasObject, EVAS_CALLBACK_MOUSE_UP, OnEvasObjectMouseUp, &evasPluginEventInterface);
300 evas_object_event_callback_add(mImageEvasObject, EVAS_CALLBACK_MOUSE_MOVE, OnEvasObjectMouseMove, &evasPluginEventInterface);
301 evas_object_event_callback_add(mImageEvasObject, EVAS_CALLBACK_MOUSE_WHEEL, OnEvasObjectMouseWheel, &evasPluginEventInterface);
302 evas_object_event_callback_add(mImageEvasObject, EVAS_CALLBACK_MULTI_DOWN, OnEvasObjectMultiTouchDown, &evasPluginEventInterface);
303 evas_object_event_callback_add(mImageEvasObject, EVAS_CALLBACK_MULTI_UP, OnEvasObjectMultiTouchUp, &evasPluginEventInterface);
304 evas_object_event_callback_add(mImageEvasObject, EVAS_CALLBACK_MULTI_MOVE, OnEvasObjectMultiTouchMove, &evasPluginEventInterface);
305 evas_object_event_callback_add(mImageEvasObject, EVAS_CALLBACK_KEY_DOWN, OnEvasObjectKeyDown, &evasPluginEventInterface);
306 evas_object_event_callback_add(mImageEvasObject, EVAS_CALLBACK_KEY_UP, OnEvasObjectKeyUp, &evasPluginEventInterface);
308 // Register the evas geometry callbacks
309 evas_object_event_callback_add(mImageEvasObject, EVAS_CALLBACK_MOVE, OnEvasObjectMove, &evasPluginEventInterface);
310 evas_object_event_callback_add(mImageEvasObject, EVAS_CALLBACK_RESIZE, OnEvasObjectResize, &evasPluginEventInterface);
312 // Register the evas focus callbacks
313 evas_object_event_callback_add(mImageEvasObject, EVAS_CALLBACK_FOCUS_IN, OnEvasObjectFocusIn, &evasPluginEventInterface);
314 evas_object_event_callback_add(mImageEvasObject, EVAS_CALLBACK_FOCUS_OUT, OnEvasObjectFocusOut, &evasPluginEventInterface);
316 evas_event_callback_add(mEvas, EVAS_CALLBACK_CANVAS_FOCUS_IN, OnEvasFocusIn, &evasPluginEventInterface);
317 evas_event_callback_add(mEvas, EVAS_CALLBACK_CANVAS_FOCUS_OUT, OnEvasFocusOut, &evasPluginEventInterface);
319 // Register the evas render callbacks
320 evas_event_callback_add(mEvas, EVAS_CALLBACK_RENDER_POST, OnEvasRenderPost, &evasPluginEventInterface);
322 // Register the elm access action callbacks and these callbacks are disconnected when mElmAccessEvasObject is unregistred
323 elm_access_action_cb_set(mElmAccessEvasObject, ELM_ACCESS_ACTION_HIGHLIGHT, OnElmAccessActionHighlight, &evasPluginEventInterface);
324 elm_access_action_cb_set(mElmAccessEvasObject, ELM_ACCESS_ACTION_UNHIGHLIGHT, OnElmAccessActionUnhighlight, &evasPluginEventInterface);
325 elm_access_action_cb_set(mElmAccessEvasObject, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, OnElmAccessActionHighlightNext, &evasPluginEventInterface);
326 elm_access_action_cb_set(mElmAccessEvasObject, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, OnElmAccessActionHighlightPrev, &evasPluginEventInterface);
327 elm_access_action_cb_set(mElmAccessEvasObject, ELM_ACCESS_ACTION_ACTIVATE, OnElmAccessActionActivate, &evasPluginEventInterface);
328 elm_access_action_cb_set(mElmAccessEvasObject, ELM_ACCESS_ACTION_UP, OnElmAccessActionUp, &evasPluginEventInterface);
329 elm_access_action_cb_set(mElmAccessEvasObject, ELM_ACCESS_ACTION_DOWN, OnElmAccessActionDown, &evasPluginEventInterface);
330 elm_access_action_cb_set(mElmAccessEvasObject, ELM_ACCESS_ACTION_SCROLL, OnElmAccessActionScroll, &evasPluginEventInterface);
331 elm_access_action_cb_set(mElmAccessEvasObject, ELM_ACCESS_ACTION_BACK, OnElmAccessActionBack, &evasPluginEventInterface);
332 elm_access_action_cb_set(mElmAccessEvasObject, ELM_ACCESS_ACTION_READ, OnElmAccessActionRead, &evasPluginEventInterface);
334 // Register the elm focus callbacks
335 evas_object_smart_callback_add(mElmFocusEvasObject, EVAS_OBJECT_FOCUSED_EVENT_NAME, OnEvasObjectSmartFocused, this);
336 evas_object_smart_callback_add(mElmFocusEvasObject, EVAS_OBJECT_UNFOCUSED_EVENT_NAME, OnEvasObjectSmartUnfocused, this);
339 EvasEventHandler::~EvasEventHandler()
341 // Unregister the evas event callbacks.
342 evas_object_event_callback_del(mImageEvasObject, EVAS_CALLBACK_MOUSE_DOWN, OnEvasObjectMouseDown);
343 evas_object_event_callback_del(mImageEvasObject, EVAS_CALLBACK_MOUSE_UP, OnEvasObjectMouseUp);
344 evas_object_event_callback_del(mImageEvasObject, EVAS_CALLBACK_MOUSE_MOVE, OnEvasObjectMouseMove);
345 evas_object_event_callback_del(mImageEvasObject, EVAS_CALLBACK_MOUSE_WHEEL, OnEvasObjectMouseWheel);
346 evas_object_event_callback_del(mImageEvasObject, EVAS_CALLBACK_MULTI_DOWN, OnEvasObjectMultiTouchDown);
347 evas_object_event_callback_del(mImageEvasObject, EVAS_CALLBACK_MULTI_UP, OnEvasObjectMultiTouchUp);
348 evas_object_event_callback_del(mImageEvasObject, EVAS_CALLBACK_MULTI_MOVE, OnEvasObjectMultiTouchMove);
349 evas_object_event_callback_del(mImageEvasObject, EVAS_CALLBACK_KEY_DOWN, OnEvasObjectKeyDown);
350 evas_object_event_callback_del(mImageEvasObject, EVAS_CALLBACK_KEY_UP, OnEvasObjectKeyUp);
352 // Unregister the evas geometry callbacks.
353 evas_object_event_callback_del(mImageEvasObject, EVAS_CALLBACK_MOVE, OnEvasObjectMove);
354 evas_object_event_callback_del(mImageEvasObject, EVAS_CALLBACK_RESIZE, OnEvasObjectResize);
356 // Unregister the evas focus callbacks
357 evas_object_event_callback_del(mImageEvasObject, EVAS_CALLBACK_FOCUS_IN, OnEvasObjectFocusIn);
358 evas_object_event_callback_del(mImageEvasObject, EVAS_CALLBACK_FOCUS_OUT, OnEvasObjectFocusOut);
360 evas_event_callback_del(mEvas, EVAS_CALLBACK_CANVAS_FOCUS_IN, OnEvasFocusIn);
361 evas_event_callback_del(mEvas, EVAS_CALLBACK_CANVAS_FOCUS_OUT, OnEvasFocusOut);
363 // Register the evas render callbacks
364 evas_event_callback_del(mEvas, EVAS_CALLBACK_RENDER_POST, OnEvasRenderPost);
366 // Unregister the elm focus callbacks
367 evas_object_smart_callback_del(mElmFocusEvasObject, EVAS_OBJECT_FOCUSED_EVENT_NAME, OnEvasObjectSmartFocused);
368 evas_object_smart_callback_del(mElmFocusEvasObject, EVAS_OBJECT_UNFOCUSED_EVENT_NAME, OnEvasObjectSmartUnfocused);
371 /////////////////////////////////////////////////////////////////////////////////////////////////////
373 /////////////////////////////////////////////////////////////////////////////////////////////////////
375 void EvasEventHandler::OnEvasObjectMouseDown(void *data, Evas* evas, Evas_Object* evasObject, void* event)
377 Evas_Event_Mouse_Down* eventMouseDown = static_cast<Evas_Event_Mouse_Down*>(event);
379 Evas_Coord screenX = 0.0f, screenY = 0.0f;
380 GetScreenPosition(eventMouseDown->canvas.x, eventMouseDown->canvas.y, evasObject, screenX, screenY);
382 TouchPoint touchPoint = TouchPoint(TOUCH_DEVICE_ID, TouchPoint::Down, screenX, screenY);
383 unsigned long timeStamp = eventMouseDown->timestamp;
386 timeStamp = GetCurrentMilliSeconds();
389 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
390 pEvasPlugin->OnEvasObjectTouchEvent(touchPoint, timeStamp);
393 void EvasEventHandler::OnEvasObjectMouseUp(void *data, Evas* evas, Evas_Object* evasObject, void* event)
395 Evas_Event_Mouse_Up* eventMouseUp = static_cast<Evas_Event_Mouse_Up*>(event);
397 Evas_Coord screenX = 0.0f, screenY = 0.0f;
398 GetScreenPosition(eventMouseUp->canvas.x, eventMouseUp->canvas.y, evasObject, screenX, screenY);
400 TouchPoint touchPoint = TouchPoint(TOUCH_DEVICE_ID, TouchPoint::Up, screenX, screenY);
401 unsigned long timeStamp = eventMouseUp->timestamp;
404 timeStamp = GetCurrentMilliSeconds();
407 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
408 pEvasPlugin->OnEvasObjectTouchEvent(touchPoint, timeStamp);
411 void EvasEventHandler::OnEvasObjectMouseMove(void *data, Evas* evas, Evas_Object* evasObject, void* event)
413 Evas_Event_Mouse_Move* eventMouseMove = static_cast<Evas_Event_Mouse_Move*>(event);
415 Evas_Coord screenX = 0.0f, screenY = 0.0f;
416 GetScreenPosition(eventMouseMove->cur.canvas.x, eventMouseMove->cur.canvas.y, evasObject, screenX, screenY);
418 TouchPoint touchPoint = TouchPoint(TOUCH_DEVICE_ID, TouchPoint::Motion, screenX, screenY);
419 unsigned long timeStamp = eventMouseMove->timestamp;
422 timeStamp = GetCurrentMilliSeconds();
425 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
426 pEvasPlugin->OnEvasObjectTouchEvent(touchPoint, timeStamp);
429 void EvasEventHandler::OnEvasObjectMouseWheel(void *data, Evas* evas, Evas_Object* evasObject, void* event)
431 Evas_Event_Mouse_Wheel* eventMouseWheel = static_cast<Evas_Event_Mouse_Wheel*>(event);
433 Evas_Coord screenX = 0.0f, screenY = 0.0f;
434 GetScreenPosition(eventMouseWheel->canvas.x, eventMouseWheel->canvas.y, evasObject, screenX, screenY);
436 int direction = eventMouseWheel->direction;
437 unsigned int modifiers = -1; // TODO: Need to check evas modifier
438 Vector2 point = Vector2(screenX, screenY);
439 int z = eventMouseWheel->z;
440 unsigned int timeStamp = eventMouseWheel->timestamp;
443 timeStamp = GetCurrentMilliSeconds();
446 WheelEvent wheelEvent(WheelEvent::MOUSE_WHEEL, direction, modifiers, point, z, timeStamp);
448 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
449 pEvasPlugin->OnEvasObjectWheelEvent(wheelEvent);
452 void EvasEventHandler::OnEvasObjectMultiTouchDown(void *data, Evas* evas, Evas_Object* evasObject, void* event)
454 Evas_Event_Multi_Down* eventMultiDown = static_cast<Evas_Event_Multi_Down*>(event);
456 Evas_Coord screenX = 0.0f, screenY = 0.0f;
457 GetScreenPosition(eventMultiDown->canvas.x, eventMultiDown->canvas.y, evasObject, screenX, screenY);
459 TouchPoint touchPoint = TouchPoint(eventMultiDown->device, TouchPoint::Down, screenX, screenY);
460 unsigned long timeStamp = eventMultiDown->timestamp;
463 timeStamp = GetCurrentMilliSeconds();
466 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
467 pEvasPlugin->OnEvasObjectTouchEvent(touchPoint, timeStamp);
470 void EvasEventHandler::OnEvasObjectMultiTouchUp(void *data, Evas* evas, Evas_Object* evasObject, void* event)
472 Evas_Event_Multi_Up* eventMultiUp = static_cast<Evas_Event_Multi_Up*>(event);
474 Evas_Coord screenX = 0.0f, screenY = 0.0f;
475 GetScreenPosition(eventMultiUp->canvas.x, eventMultiUp->canvas.y, evasObject, screenX, screenY);
477 TouchPoint touchPoint = TouchPoint(eventMultiUp->device, TouchPoint::Up, screenX, screenY);
478 unsigned long timeStamp = eventMultiUp->timestamp;
481 timeStamp = GetCurrentMilliSeconds();
484 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
485 pEvasPlugin->OnEvasObjectTouchEvent(touchPoint, timeStamp);
488 void EvasEventHandler::OnEvasObjectMultiTouchMove(void *data, Evas* evas, Evas_Object* evasObject, void* event)
490 Evas_Event_Multi_Move* eventMultiMove = static_cast<Evas_Event_Multi_Move*>(event);
492 Evas_Coord screenX = 0.0f, screenY = 0.0f;
493 GetScreenPosition(eventMultiMove->cur.canvas.x, eventMultiMove->cur.canvas.y, evasObject, screenX, screenY);
495 TouchPoint touchPoint = TouchPoint(eventMultiMove->device, TouchPoint::Motion, screenX, screenY);
496 unsigned long timeStamp = eventMultiMove->timestamp;
499 timeStamp = GetCurrentMilliSeconds();
502 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
503 pEvasPlugin->OnEvasObjectTouchEvent(touchPoint, timeStamp);
506 void EvasEventHandler::OnEvasObjectKeyDown(void *data, Evas* evas, Evas_Object* evasObject, void* event)
508 #ifdef DALI_EVASPLUGIN_USE_IMF_MANAGER
509 Evas_Event_Key_Down* eventKeyDown = static_cast<Evas_Event_Key_Down*>(event);
510 bool eventHandled = false;
512 // If a device key then skip ecore_imf_context_filter_event.
513 if (!KeyLookup::IsDeviceButton(eventKeyDown->keyname))
515 ImfManager imfManager = ImfManager::Get();
518 Ecore_IMF_Context* imfContext = Dali::Internal::Adaptor::ImfManager::GetImplementation(imfManager).GetContext();
521 // We're consuming key down event so we have to pass to IMF so that it can parse it as well.
522 Ecore_IMF_Event_Key_Down imfEventKeyDown;
523 ecore_imf_evas_event_key_down_wrap(eventKeyDown, &imfEventKeyDown);
525 eventHandled = ecore_imf_context_filter_event(imfContext, ECORE_IMF_EVENT_KEY_DOWN, reinterpret_cast<Ecore_IMF_Event*>(&imfEventKeyDown));
529 // Menu, home, back button must skip ecore_imf_context_filter_event.
530 static const char* escapeKeyName = KeyLookup::GetKeyName(DALI_KEY_ESCAPE);
531 static const char* returnKeyName = KeyLookup::GetKeyName(static_cast<Dali::KEY>(DALI_EXTENSION_INTERNAL_KEY_RETURN));
532 static const char* kpEnterKeyName = KeyLookup::GetKeyName(static_cast<Dali::KEY>(DALI_EXTENSION_INTERNAL_KEY_KP_ENTER));
533 if ((escapeKeyName && !strcmp(eventKeyDown->keyname, escapeKeyName)) ||
534 (returnKeyName && !strcmp(eventKeyDown->keyname, returnKeyName)) ||
535 (kpEnterKeyName && !strcmp(eventKeyDown->keyname, kpEnterKeyName)))
537 ecore_imf_context_reset(imfContext);
544 // If the event wasn't handled then we should send a key event.
547 std::string keyName = eventKeyDown->keyname;
548 std::string keyString = (eventKeyDown->string != NULL) ? eventKeyDown->string : "";
549 int keyCode = KeyLookup::GetDaliKeyCode(eventKeyDown->keyname);
550 int modifier = EvasModifierToEcoreModifier(eventKeyDown->modifiers);
551 unsigned long timeStamp = eventKeyDown->timestamp;
554 timeStamp = GetCurrentMilliSeconds();
557 KeyEvent keyEvent(keyName, keyString, keyCode, modifier, timeStamp, KeyEvent::Down);
559 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
560 pEvasPlugin->OnEvasObjectKeyEvent(keyEvent);
565 void EvasEventHandler::OnEvasObjectKeyUp(void *data, Evas* evas, Evas_Object* evasObject, void* event)
567 #ifdef DALI_EVASPLUGIN_USE_IMF_MANAGER
568 Evas_Event_Key_Up* eventKeyUp = static_cast<Evas_Event_Key_Up*>(event);
569 bool eventHandled = false;
571 // Menu, home, back button must skip ecore_imf_context_filter_event.
572 static const char* menuKeyName = KeyLookup::GetKeyName(DALI_KEY_MENU);
573 static const char* homeKeyName = KeyLookup::GetKeyName(DALI_KEY_HOME);
574 static const char* backKeyName = KeyLookup::GetKeyName(DALI_KEY_BACK);
575 if ((menuKeyName && !strcmp(eventKeyUp->keyname, menuKeyName)) &&
576 (homeKeyName && !strcmp(eventKeyUp->keyname, homeKeyName)) &&
577 (backKeyName && !strcmp(eventKeyUp->keyname, backKeyName)))
579 ImfManager imfManager = ImfManager::Get();
582 Ecore_IMF_Context* imfContext = Dali::Internal::Adaptor::ImfManager::GetImplementation(imfManager).GetContext();
586 Ecore_IMF_Event_Key_Up imfEventKeyUp;
587 ecore_imf_evas_event_key_up_wrap(eventKeyUp, &imfEventKeyUp);
589 eventHandled = ecore_imf_context_filter_event(imfContext, ECORE_IMF_EVENT_KEY_UP, reinterpret_cast<Ecore_IMF_Event*>(&imfEventKeyUp));
596 std::string keyName = eventKeyUp->keyname;
597 std::string keyString = (eventKeyUp->string != NULL) ? eventKeyUp->string : "";
598 int keyCode = KeyLookup::GetDaliKeyCode(eventKeyUp->keyname);
599 int modifier = EvasModifierToEcoreModifier(eventKeyUp->modifiers);
600 unsigned long timeStamp = eventKeyUp->timestamp;
603 timeStamp = GetCurrentMilliSeconds();
606 KeyEvent keyEvent(keyName, keyString, keyCode, modifier, timeStamp, KeyEvent::Up);
608 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
609 pEvasPlugin->OnEvasObjectKeyEvent(keyEvent);
614 /////////////////////////////////////////////////////////////////////////////////////////////////////
615 // Geometry callbacks
616 /////////////////////////////////////////////////////////////////////////////////////////////////////
618 void EvasEventHandler::OnEvasObjectMove(void *data, Evas* evas, Evas_Object* evasObject, void* event)
621 evas_object_geometry_get(evasObject, &geometry.x, &geometry.y, &geometry.width, &geometry.height);
623 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
624 pEvasPlugin->OnEvasObjectMove(geometry);
627 void EvasEventHandler::OnEvasObjectResize(void *data, Evas* evas, Evas_Object* evasObject, void* event)
630 evas_object_geometry_get(evasObject, &geometry.x, &geometry.y, &geometry.width, &geometry.height);
632 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
633 pEvasPlugin->OnEvasObjectResize(geometry);
636 /////////////////////////////////////////////////////////////////////////////////////////////////////
638 /////////////////////////////////////////////////////////////////////////////////////////////////////
640 void EvasEventHandler::OnEvasObjectFocusIn(void *data, Evas* evas, Evas_Object* evasObject, void* event)
642 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
643 pEvasPlugin->OnEvasObjectFocusIn();
646 void EvasEventHandler::OnEvasObjectFocusOut(void *data, Evas* evas, Evas_Object* evasObject, void* event)
648 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
649 pEvasPlugin->OnEvasObjectFocusOut();
652 void EvasEventHandler::OnEvasFocusIn(void *data, Evas* evas, void* event)
656 void EvasEventHandler::OnEvasFocusOut(void *data, Evas* evas, void* event)
660 /////////////////////////////////////////////////////////////////////////////////////////////////////
662 /////////////////////////////////////////////////////////////////////////////////////////////////////
664 void EvasEventHandler::OnEvasRenderPost(void *data, Evas* evas, void* event)
666 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
667 pEvasPlugin->OnEvasPostRender();
670 /////////////////////////////////////////////////////////////////////////////////////////////////////
671 // Elm Access callbacks
672 /////////////////////////////////////////////////////////////////////////////////////////////////////
674 Eina_Bool EvasEventHandler::OnElmAccessActionHighlight(void* data, Evas_Object* evasObject, Elm_Access_Action_Info* actionInfo)
676 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
677 Dali::Extension::Internal::AccessActionInfo daliActionInfo;
678 ConvertActionInfo(actionInfo, daliActionInfo);
680 return pEvasPlugin->OnElmAccessActionHighlight(daliActionInfo);
683 Eina_Bool EvasEventHandler::OnElmAccessActionUnhighlight(void* data, Evas_Object* evasObject, Elm_Access_Action_Info* actionInfo)
685 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
686 Dali::Extension::Internal::AccessActionInfo daliActionInfo;
687 ConvertActionInfo(actionInfo, daliActionInfo);
689 return pEvasPlugin->OnElmAccessActionUnhighlight(daliActionInfo);
692 Eina_Bool EvasEventHandler::OnElmAccessActionHighlightNext(void* data, Evas_Object* evasObject, Elm_Access_Action_Info* actionInfo)
694 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
695 Dali::Extension::Internal::AccessActionInfo daliActionInfo;
696 ConvertActionInfo(actionInfo, daliActionInfo);
698 return pEvasPlugin->OnElmAccessActionHighlightNext(daliActionInfo);
701 Eina_Bool EvasEventHandler::OnElmAccessActionHighlightPrev(void* data, Evas_Object* evasObject, Elm_Access_Action_Info* actionInfo)
703 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
704 Dali::Extension::Internal::AccessActionInfo daliActionInfo;
705 ConvertActionInfo(actionInfo, daliActionInfo);
707 return pEvasPlugin->OnElmAccessActionHighlightPrev(daliActionInfo);
710 Eina_Bool EvasEventHandler::OnElmAccessActionActivate(void* data, Evas_Object* evasObject, Elm_Access_Action_Info* actionInfo)
712 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
713 Dali::Extension::Internal::AccessActionInfo daliActionInfo;
714 ConvertActionInfo(actionInfo, daliActionInfo);
716 return pEvasPlugin->OnElmAccessActionActivate(daliActionInfo);
719 Eina_Bool EvasEventHandler::OnElmAccessActionScroll(void* data, Evas_Object* evasObject, Elm_Access_Action_Info* actionInfo)
721 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
722 Dali::Extension::Internal::AccessActionInfo daliActionInfo;
723 ConvertActionInfo(actionInfo, daliActionInfo);
725 return pEvasPlugin->OnElmAccessActionScroll(daliActionInfo);
728 Eina_Bool EvasEventHandler::OnElmAccessActionUp(void* data, Evas_Object* evasObject, Elm_Access_Action_Info* actionInfo)
730 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
731 Dali::Extension::Internal::AccessActionInfo daliActionInfo;
732 ConvertActionInfo(actionInfo, daliActionInfo);
734 return pEvasPlugin->OnElmAccessActionUp(daliActionInfo);
737 Eina_Bool EvasEventHandler::OnElmAccessActionDown(void* data, Evas_Object* evasObject, Elm_Access_Action_Info* actionInfo)
739 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
740 Dali::Extension::Internal::AccessActionInfo daliActionInfo;
741 ConvertActionInfo(actionInfo, daliActionInfo);
743 return pEvasPlugin->OnElmAccessActionDown(daliActionInfo);
746 Eina_Bool EvasEventHandler::OnElmAccessActionBack(void* data, Evas_Object* evasObject, Elm_Access_Action_Info* actionInfo)
748 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
749 Dali::Extension::Internal::AccessActionInfo daliActionInfo;
750 ConvertActionInfo(actionInfo, daliActionInfo);
752 return pEvasPlugin->OnElmAccessActionBack(daliActionInfo);
755 Eina_Bool EvasEventHandler::OnElmAccessActionRead(void* data, Evas_Object* evasObject, Elm_Access_Action_Info* actionInfo)
757 EvasPluginEventInterface* pEvasPlugin = static_cast<EvasPluginEventInterface*>(data);
758 Dali::Extension::Internal::AccessActionInfo daliActionInfo;
759 ConvertActionInfo(actionInfo, daliActionInfo);
761 return pEvasPlugin->OnElmAccessActionRead(daliActionInfo);
764 /////////////////////////////////////////////////////////////////////////////////////////////////////
765 // Elm Focus callbacks
766 /////////////////////////////////////////////////////////////////////////////////////////////////////
768 void EvasEventHandler::OnEvasObjectSmartFocused(void *data, Evas_Object* evasObject, void* event)
770 EvasEventHandler* eventHandler = static_cast<EvasEventHandler*>(data);
771 EvasPluginEventInterface& evasPlugin = eventHandler->GetEvasPluginInterface();
773 if (eventHandler->mElmFocusEvasObject == evasObject)
775 Evas_Object* topWidget = elm_object_top_widget_get(evasObject);
777 if (!strcmp("elm_win", elm_object_widget_type_get(topWidget)))
779 if (elm_win_focus_highlight_enabled_get(topWidget) == EINA_TRUE)
781 // To allow that KeyboardFocusManager can handle the keyboard focus
782 KeyEvent fakeKeyEvent("", "", 0, 0, 100, KeyEvent::Down);
784 evasPlugin.OnEvasObjectKeyEvent(fakeKeyEvent);
788 evas_object_focus_set(eventHandler->mImageEvasObject, EINA_TRUE);
792 void EvasEventHandler::OnEvasObjectSmartUnfocused(void *data, Evas_Object* evasObject, void* event)
794 EvasEventHandler* eventHandler = static_cast<EvasEventHandler*>(data);
795 if (eventHandler->mElmFocusEvasObject == evasObject)
797 evas_object_focus_set(eventHandler->mImageEvasObject, EINA_FALSE);
801 } // namespace Internal
803 } // namespace Extension