2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0/
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 * @file FUi_EflUiEventManager.cpp
19 * @brief This is the implementation file for _EflUiEventManager class.
23 #include <Ecore_Evas.h>
24 #include <Ecore_Ipc.h>
56 #include <FBaseColIEnumeratorT.h>
57 #include <FBaseSysLog.h>
58 #include "FUi_CoordinateSystemUtils.h"
59 #include "FUi_Control.h"
60 #include "FUi_ControlManager.h"
61 #include "FUi_KeyEventManager.h"
62 #include "FUi_Window.h"
63 #include "FUi_UiEventManager.h"
64 #include "FUi_EflUiEventManager.h"
65 #include "FUi_UiTouchEvent.h"
66 #include "FUi_UiNotificationEvent.h"
67 #include "FUi_UiKeyEvent.h"
68 #include "FUi_UiFocusEvent.h"
69 #include "FUi_EcoreEvasMgr.h"
70 #include "FUi_EcoreEvas.h"
71 #include "FUi_TouchManager.h"
72 #include "FUiAnim_EflNode.h"
73 #include "FUiAnim_ControlVisualElement.h"
74 #include "FUiAnim_RootVisualElement.h"
75 #include "FUiAnim_EflLayer.h"
76 #include "FUi_AccessibilityManager.h"
79 using namespace Tizen::Ui;
80 using namespace Tizen::Ui::Animations;
81 using namespace Tizen::Graphics;
82 using namespace Tizen::Base::Collection;
83 using namespace Tizen::Base;
84 using namespace Tizen::Ui::Controls;
90 int __touchTailCount = 0;
91 const int KEY_COUNT = 300;
92 const int DEVICE_COUNT = 999;
93 const wchar_t* KEYBOARD_INSERTED_EVENT = L"KEYBOARD_INSERTED";
94 bool __evasTouchPressed = false;
95 bool __keyPressed[KEY_COUNT] = {false,};
96 bool __touchPressed[DEVICE_COUNT] = {false,};
97 Ecore_X_Atom __keyboardExist = 0;
98 Ecore_Timer* __pVSyncTimer = null;
107 unsigned int timeStamp;
109 std::list<RawTouchInfo>* __pRawTouchInfoList = null;
111 bool QueueTouchPressEvent(void* pEventInfo);
112 bool QueueTouchReleaseEvent(void* pEventInfo);
113 bool QueueTouchMoveEvent(void* pEventInfo);
114 bool DequeueTouchPressEvent(unsigned int& window, int& x, int& y, int& device, unsigned int& timeStamp, int& buttons, int& type);
116 Eina_Bool OnTouchPressedReal(Ecore_Event_Mouse_Button* pEventInfo);
117 Eina_Bool OnTouchReleasedReal(Ecore_Event_Mouse_Button* pEventInfo);
118 Eina_Bool OnTouchMovedReal(Ecore_Event_Mouse_Move* pEventInfo);
119 Eina_Bool TouchEventHandlerVSync(void* pData);
122 GetEvasObject(const _Control& control)
124 _VisualElement* pVisualElement = control.GetVisualElement();
125 SysTryReturn(NID_UI, pVisualElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
127 _EflNode* pEflNode = dynamic_cast<_EflNode*>(pVisualElement->GetNativeNode());
128 SysTryReturn(NID_UI, pEflNode, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
130 return (Evas_Object*)pEflNode->GetGroupContainer();
134 GetEvas(const _Control& control)
137 Evas_Object* pEvasObject = GetEvasObject(control);
140 pEvas = evas_object_evas_get(pEvasObject);
141 SysTryReturn(NID_UI, pEvas, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
151 : _pEventManager(null)
153 _pEventManager = _UiEventManager::GetInstance();
154 SysTryReturnVoidResult(NID_UI, _pEventManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
156 SetLastResult(E_SUCCESS);
159 virtual ~_Event(void)
164 _Event(const _Event& rhs);
165 _Event& operator =(const _Event& rhs);
167 virtual result SendImpl(void) = 0;
176 _UiEventManager* _pEventManager;
179 struct _EvasConvertKeys
185 const _EvasConvertKeys keyTable[] =
187 { _KEY_ESC, "Escape" },
188 { _KEY_GRAVE, "grave" },
199 { _KEY_MINUS, "minus" },
200 { _KEY_EQUAL, "equal" },
201 { _KEY_BACKSLASH, "backslash" },
202 { _KEY_BACKSPACE, "BackSpace" },
214 { _KEY_LBRACKET, "bracketleft" },
215 { _KEY_RBRACKET, "bracketright" },
216 { _KEY_ENTER, "Return" },
217 { _KEY_CAPSLOCK, "Caps_Lock" },
227 { _KEY_SEMICOLON, "semicolon" },
228 { _KEY_APOSTROPHE, "apostrophe" },
229 { _KEY_SHIFT_L, "Shift_L" },
237 { _KEY_COMMA, "comma" },
238 { _KEY_DOT, "period" },
239 { _KEY_SLASH, "slash" },
240 { _KEY_SHIFT_R, "Shift_R" },
241 { _KEY_CTRL_L, "Control_L" },
242 { _KEY_LALT, "Alt_L" },
243 { _KEY_SPACE, "space" },
244 { _KEY_RALT, "Alt_R" },
245 { _KEY_CTRL_R, "Control_R" },
255 { _KEY_FN_10, "F10" },
256 { _KEY_FN_11, "F11" },
257 { _KEY_FN_12, "F12" },
258 { _KEY_NUM_LOCK, "Num_Lock" },
259 { _KEY_NUMPAD_DIVIDE, "KP_Divide" },
260 { _KEY_NUMPAD_MULTIPLY, "KP_Multiply" },
261 { _KEY_NUMPAD_SUBTRACT, "KP_Subtract" },
262 { _KEY_NUMPAD_7, "KP_Home" },
263 { _KEY_NUMPAD_8, "KP_Up" },
264 { _KEY_NUMPAD_9, "KP_Prior" },
265 { _KEY_NUMPAD_4, "KP_Left" },
266 { _KEY_NUMPAD_5, "KP_Begin" },
267 { _KEY_NUMPAD_6, "KP_Right" },
268 { _KEY_NUMPAD_ADD, "KP_Add" },
269 { _KEY_NUMPAD_1, "KP_End" },
270 { _KEY_NUMPAD_2, "KP_Down" },
271 { _KEY_NUMPAD_3, "KP_Next" },
272 { _KEY_NUMPAD_0, "KP_Insert" },
273 { _KEY_NUMPAD_DOT, "KP_Delete" },
274 { _KEY_NUMPAD_ENTER, "KP_Enter" },
275 { _KEY_PRINT, "Print" },
276 { _KEY_SCROLL_LOCK, "Scroll_Lock" },
277 { _KEY_PAUSEBREAK, "Pause" },
278 { _KEY_INSERT, "Insert" },
279 { _KEY_HOME_BUTTON, "Home" },
280 { _KEY_PAGE_UP, "Prior" },
281 { _KEY_DELETE, "Delete" },
282 { _KEY_END_BUTTON, "End" },
283 { _KEY_PAGE_DOWN, "Next" },
285 { _KEY_LEFT, "Left" },
286 { _KEY_DOWN, "Down" },
287 { _KEY_RIGHT, "Right" },
288 { _KEY_CONTEXT_MENU, "Menu" },
289 { _KEY_MENU, "XF86Send" },
291 { _KEY_COMMA, "less" }, /*virtual keypad <*/
292 { _KEY_9, "parenleft" }, /*virtual keypad (*/
293 { _KEY_0, "parenright" }, /*virtual keypad )*/
295 { _KEY_BACK, "XF86Stop" },
296 // { _KEY_HOME, "XF86Phone" },
297 { _KEY_WEB_PAGE, "XF86WWW" },
298 { _KEY_MAIL, "XF86Mail" },
299 { _KEY_SCREEN_SAVER, "XF86ScreenSaver" },
300 { _KEY_BRIGHTNESS_DOWN, "XF86MonBrightnessDown" },
301 { _KEY_BRIGHTNESS_UP, "XF86MonBrightnessUp" },
302 { _KEY_MUTE, "XF86AudioMute" },
303 // { _KEY_VOLUME_DOWN, "XF86AudioLowerVolume" },
304 // { _KEY_VOLUME_UP, "XF86AudioRaiseVolume" },
305 { _KEY_PLAY_PAUSE, "XF86AudioPlay" },
306 { _KEY_NEXT_SONG, "XF86AudioNext" },
307 { _KEY_PREVIOUS_SONG, "XF86AudioPrev" },
308 { _KEY_APPS, "XF86Launch0" },
309 { _KEY_MENU, "XF86Send" },
310 { _KEY_SOFT_KEYBOARD, "XF86MenuKB" },
311 { _KEY_SEARCH, "XF86Search" },
312 { _KEY_VOICE, "XF86Launch2" },
313 { _KEY_QUICK_PANEL, "XF86Tools" }
320 _KeyEvent(KeyState keyState, _KeyCode keyCode, int keyModifier, void* pUserData)
322 , __keyInfo(keyState, keyCode, keyModifier, pUserData)
324 __pTarget = GetTarget(keyCode);
325 if (IsNativeWindowActivated(__pTarget) == false)
327 SysTryReturnVoidResult(NID_UI, IsNativeWindowActivated(__pTarget), E_SYSTEM, "[E_SYSTEM] NativeWindow is not activated yet");
331 virtual ~_KeyEvent(void)
335 static _KeyCode GetKeyCode(const char* pKeyName)
339 SysTryReturn(NID_UI, pKeyName, _KEY_INVALID, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
341 for (unsigned int i = 0; i < sizeof(keyTable) / sizeof(_EvasConvertKeys); ++i)
343 if (strcmp(keyTable[i].pName, pKeyName) == 0)
345 return keyTable[i].code;
352 static int GetKeyModifier(const int keyModifier)
355 unsigned int modifier = _KEY_MODIFIER_NONE;
357 if(ECORE_EVENT_MODIFIER_SHIFT & keyModifier)
359 modifier |= _KEY_MODIFIER_SHIFT;
361 if(ECORE_EVENT_MODIFIER_CTRL & keyModifier)
363 modifier |= _KEY_MODIFIER_CTRL;
365 if(ECORE_EVENT_MODIFIER_ALT & keyModifier)
367 modifier |= _KEY_MODIFIER_ALT;
369 if(ECORE_EVENT_MODIFIER_WIN & keyModifier)
371 modifier |= _KEY_MODIFIER_WIN;
373 if(ECORE_EVENT_MODIFIER_SCROLL & keyModifier)
375 modifier |= _KEY_MODIFIER_SCROLL;
377 if(ECORE_EVENT_MODIFIER_NUM & keyModifier)
379 modifier |= _KEY_MODIFIER_NUM;
381 if(ECORE_EVENT_MODIFIER_CAPS & keyModifier)
383 modifier |= _KEY_MODIFIER_CAPS;
385 if(ECORE_EVENT_LOCK_SCROLL & keyModifier)
387 modifier |= _KEY_LOCK_SCROLL;
389 if(ECORE_EVENT_LOCK_NUM & keyModifier)
391 modifier |= _KEY_LOCK_NUM;
393 if(ECORE_EVENT_LOCK_CAPS & keyModifier)
395 modifier |= _KEY_LOCK_CAPS;
397 if(ECORE_EVENT_LOCK_SHIFT & keyModifier)
399 modifier |= _KEY_LOCK_SHIFT;
401 if(ECORE_EVENT_MODIFIER_ALTGR & keyModifier)
403 modifier |= _KEY_MODIFIER_ALTGR;
410 _KeyEvent(const _KeyEvent& rhs);
411 _KeyEvent& operator =(const _KeyEvent& rhs);
413 virtual result SendImpl(void)
415 SysTryReturn(NID_UI, __pTarget, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
417 _UiKeyEvent event(__pTarget->GetHandle(), __keyInfo);
419 return _pEventManager->SendEvent(event);
422 _Control* GetTarget(_KeyCode keyCode) const
424 _KeyEventManager* pKeyEventManager = _KeyEventManager::GetInstance();
425 SysTryReturn(NID_UI, pKeyEventManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
427 _ControlManager* pControlManager = _ControlManager::GetInstance();
428 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
430 _Control* pControl = pControlManager->GetFocusControl();
433 pControl = pControlManager->GetCurrentFrame();
435 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
437 SetLastResult(E_SUCCESS);
443 IsNativeWindowActivated(_Control* pControl)
445 bool nativeWindowActivated = false;
446 _Control* pParent = pControl;
450 _Window* pWindow = dynamic_cast<_Window*>(pParent);
451 if (pWindow && (pWindow->GetNativeWindowActivated() == true))
453 nativeWindowActivated = true;
457 pParent = pParent->GetParent();
459 return nativeWindowActivated;
467 class _TouchEventManager
470 static _TouchEventManager* GetInstance(void)
472 if (__pInstance == null)
474 __pInstance = new (std::nothrow) _TouchEventManager;
475 SysTryReturn(NID_UI, __pInstance, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
478 SetLastResult(E_SUCCESS);
483 result AddControl(int pointId, const _ControlHandle& controlHandle)
486 result r = E_SUCCESS;
488 __pTargetMap->ContainsKey(pointId, exist);
492 r = __pTargetMap->Remove(pointId);
493 SysTryReturnResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "A system error occurred.");
496 r = __pTargetMap->Add(pointId, controlHandle);
497 SysTryReturnResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "A system error occurred.");
502 _Control* GetControl(int pointId)
504 SysTryReturn(NID_UI, __pTargetMap, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
506 _ControlHandle controlHandle;
508 __pTargetMap->GetValue(pointId, controlHandle);
510 _ControlManager* pControlManager = _ControlManager::GetInstance();
511 result r = GetLastResult();
512 SysTryReturn(NID_UI, pControlManager, null, r, "[%s] Propagating.", GetErrorMessage(r));
514 return pControlManager->GetObject(controlHandle);
518 _TouchEventManager(void)
520 result r = E_SUCCESS;
521 unique_ptr<HashMapT<int, _ControlHandle> > pTargetMap(new (std::nothrow) HashMapT<int, _ControlHandle>);
522 SysTryReturnVoidResult(NID_UI, pTargetMap, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
524 r = pTargetMap->Construct();
525 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
527 __pTargetMap = move(pTargetMap);
529 SetLastResult(E_SUCCESS);
532 ~_TouchEventManager(void)
536 _TouchEventManager(const _TouchEventManager& rhs);
537 _TouchEventManager& operator =(const _TouchEventManager& rhs);
540 static _TouchEventManager* __pInstance;
541 unique_ptr<HashMapT<int, _ControlHandle> > __pTargetMap;
544 _TouchEventManager* _TouchEventManager::__pInstance = null;
550 _TouchEvent(int deviceId, _TouchStatus status, int x, int y, unsigned int timeStamp, const _Control* pRootControl, int z = 0, unsigned int buttons = _TOUCH_BUTTON_NONE)
551 : __pTouchEventManager(null)
553 __pTouchEventManager = _TouchEventManager::GetInstance();
554 SysTryReturnVoidResult(NID_UI, __pTouchEventManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
556 result r = E_SUCCESS;
557 Tizen::Graphics::Point current(x, y);
559 _TouchManager* pTouchManager = _TouchManager::GetInstance();
560 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
562 unsigned int pointId = 0;
564 if (status == _TOUCH_PRESSED)
566 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
567 SysTryReturnVoidResult(NID_UI, pFingerInfoList, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
569 const int count = pFingerInfoList->GetCount();
571 for (int i = 0; i < count; i++)
573 _FingerInfo* pFingerInfo = null;
574 pFingerInfoList->GetAt(i, pFingerInfo);
575 if (pFingerInfo == null)
580 if (static_cast<int>(pFingerInfo->GetDeviceId()) == deviceId && pFingerInfo->GetStatus() == _TOUCH_PRESSED)
582 pTouchManager->ResetTouchInfo();
583 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pFingerInfo->GetPointId());
587 delete pFingerInfoList;
589 pointId = pTouchManager->GeneratePointId(deviceId);
590 SysSecureLog(NID_UI, "OnTouchPressed pointId = %d", pointId);
594 pointId = pTouchManager->GetPointId(deviceId);
597 if (status == _TOUCH_RELEASED)
599 SysSecureLog(NID_UI, "OnTouchReleased pointId = %d", pointId);
602 if (pointId == INVALID_POINT_ID)
604 if (status == _TOUCH_RELEASED)
606 _ControlManager* pControlManager = _ControlManager::GetInstance();
607 SysTryReturnVoidResult(NID_UI, pControlManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
609 _Window* pWindow = pControlManager->GetTouchedWindow();
612 _TouchManager* pTouchManager = _TouchManager::GetInstance();
615 pTouchManager->ResetTouchInfo();
616 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
620 SetLastResult(E_INVALID_CONDITION);
626 r = GetPosition(status, x, y, current);
627 SysTryReturnVoidResult(NID_UI, r != E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
630 SetLastResult(E_SYSTEM);
636 current = _CoordinateSystemUtils::InverseTransform(current);
639 __touchInfo.SetTouchInfo(pointId, status, current, false, timeStamp, z, buttons);
641 if (status == _TOUCH_PRESSED)
643 pTouchManager->SetListenerOnly(pointId, false);
644 _Control* pControl = GetTarget(current.x, current.y, pRootControl, pointId);
646 if (pControl == null)
648 pTouchManager->ResetTouchInfo();
649 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pointId);
650 SetLastResult(E_SYSTEM);
655 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
658 SetLastResult(E_SYSTEM);
665 _Control* pControl = pTouchManager->GetChangedTouchableTarget();
666 if (pControl == null)
672 if (pControl->GetChangingEventTarget() == true && pControl->GetVisibleState() == true)
674 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
675 SysSecureLog(NID_UI, "touch_moved, touch_released : pointId = %d, AddControl = 0x%x", pointId, pControl);
678 SetLastResult(E_SYSTEM);
686 virtual ~_TouchEvent(void)
691 virtual result SendImpl(void)
693 _Control* pTarget = __pTouchEventManager->GetControl(__touchInfo.GetPointId());
696 if (__touchInfo.GetTouchStatus() == _TOUCH_MOVED)
698 SysLog(NID_UI, "Target is null for the move event, skip sendImpl");
702 _TouchManager* pTouchManager = _TouchManager::GetInstance();
703 pTouchManager->SetTouchCanceled(null);
704 pTouchManager->ResetTouchInfo();
706 SysLog(NID_UI, "ResetTouchInfo");
710 _UiTouchEvent event(pTarget->GetHandle(), __touchInfo);
712 return _pEventManager->SendEvent(event);
716 _TouchEvent(const _TouchEvent& rhs);
717 _TouchEvent& operator =(const _TouchEvent& rhs);
719 _Control* GetTarget(int x, int y, const _Control* pRootControl, int pointId) const
723 _TouchManager* pTouchManager = _TouchManager::GetInstance();
724 SysTryReturn(NID_UI, pTouchManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
726 _ControlManager* pControlManager = _ControlManager::GetInstance();
727 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
729 _Control* pControl = null;
731 Tizen::Graphics::FloatPoint ptf(static_cast<float>(x), static_cast<float>(y));
735 _ControlVisualElement* pRootControlElement = dynamic_cast<_ControlVisualElement*>(pRootControl->GetVisualElement());
736 if (pRootControlElement == null)
738 SetLastResult(E_SYSTEM);
742 _ControlVisualElement* pControlVisualElement = pRootControlElement->GetControlChildAtPoint(ptf);
743 if (pControlVisualElement)
745 pControl = static_cast <_Control*>(pControlVisualElement->GetUserData());
750 _Window* pTouchedWindow = pControlManager->GetTouchedWindow();
751 if (pTouchedWindow == null)
753 SetLastResult(E_SYSTEM);
757 _RootVisualElement* pRootVisualElement = pTouchedWindow->GetRootVisualElement();
758 if (pRootVisualElement == null)
760 SetLastResult(E_SYSTEM);
764 Tizen::Graphics::Rectangle touchedWindowBounds = pTouchedWindow->GetBounds();
765 /*ptf.x = static_cast<float>(x - touchedWindowBounds.x);
766 ptf.y = static_cast<float>(y - touchedWindowBounds.y);*/
768 Tizen::Base::Collection::IList* pList = pRootVisualElement->GetChildrenN();
771 SetLastResult(E_SYSTEM);
775 int count = pList->GetCount();
776 for (int i = count-1; i>=0; i--)
778 _ControlVisualElement* pChildControlVisualElement = dynamic_cast<_ControlVisualElement*>(pList->GetAt(i));
779 if (pChildControlVisualElement)
781 _Control* pChildControl = static_cast<_Control*>(pChildControlVisualElement->GetUserData());
782 if (pChildControl == null)
787 _Window* pChildWindow = dynamic_cast<_Window*>(pChildControl);
788 if (pChildWindow == null)
793 Tizen::Graphics::FloatPoint tempPoint(ptf);
795 if (pChildWindow && pChildWindow->GetWindowType() == _WINDOW_TYPE_VE)
797 Tizen::Graphics::Rectangle windowBounds = pChildWindow->GetBounds();
798 tempPoint.x = static_cast<float>(tempPoint.x - windowBounds.x);
799 tempPoint.y = static_cast<float>(tempPoint.y - windowBounds.y);
803 tempPoint.x = static_cast<float>(tempPoint.x - touchedWindowBounds.x);
804 tempPoint.y = static_cast<float>(tempPoint.y - touchedWindowBounds.y);
807 _ControlVisualElement* pControlVisualElement = pChildControlVisualElement->GetControlChildAtPoint(tempPoint);
808 if (pControlVisualElement)
810 pControl = static_cast <_Control*>(pControlVisualElement->GetUserData());
811 if (pControl == null)
813 pControl = dynamic_cast<_Control*>(pTouchedWindow);
814 pTouchManager->SetListenerOnly(pointId, true);
831 _Control* pCapturedControl = pTouchManager->GetCapturedControl();
832 if (pCapturedControl)
834 if (pTouchManager->IsCaptureAllowedOwnerBounds())
836 if (pTouchManager->IsCaptureAllowedOutOfBounds())
838 pControl = pCapturedControl;
841 _Window * pWindow = dynamic_cast<_Window*>(pCapturedControl);
844 _Control* pOwner = pWindow->GetOwner();
847 Tizen::Graphics::Rectangle ownerRc(pOwner->GetAbsoluteBounds(true));
848 if ((x >= ownerRc.x) && (x <= (ownerRc.x + ownerRc.width)) && (y >= ownerRc.y) && (y <= (ownerRc.y + ownerRc.height)))
855 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds(true));
856 if ((x >= rc.x) && (x <= (rc.x + rc.width)) && (y >= rc.y) && (y <= (rc.y + rc.height)))
858 pControl = pCapturedControl;
863 if (pTouchManager->IsCaptureAllowedOutOfBounds())
865 pControl = pCapturedControl;
869 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds(true));
871 if ((x < rc.x) || (x > (rc.x + rc.width)) || (y < rc.y) || (y > (rc.y + rc.height)))
873 pControl = pCapturedControl;
878 if (pControl != null)
887 result GetPosition(_TouchStatus status, int x, int y, Point& point) const
889 result r = E_SUCCESS;
891 _ControlManager* pControlManager = _ControlManager::GetInstance();
892 SysTryReturn(NID_UI, pControlManager, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
894 _Window* pWindow = pControlManager->GetTouchedWindow();
897 _TouchManager* pTouchManager = _TouchManager::GetInstance();
900 pTouchManager->ResetTouchInfo();
901 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
904 SysTryReturn(NID_UI, pWindow, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
906 _RootVisualElement* pRootVE = pWindow->GetRootVisualElement();
907 SysTryReturn(NID_UI, pRootVE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
909 _EflLayer* pLayer = static_cast<_EflLayer*>(pRootVE->GetNativeLayer());
910 SysTryReturn(NID_UI, pLayer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
912 Ecore_Evas* pEE = pLayer->GetEcoreEvas();
913 SysTryReturn(NID_UI, pEE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
915 const int PORTRAIT = 0;
916 const int LANDSCAPE = 270;
917 const int PORTRAIT_REVERSE = 180;
918 const int LANDSCAPE_REVERSE = 90;
920 Dimension dimension = pControlManager->GetScreenSize();
921 Point output(_CoordinateSystemUtils::InverseTransform(point));
922 int rotation = ecore_evas_rotation_get(pEE);
933 point.y = dimension.width - output.x;
936 case PORTRAIT_REVERSE:
937 point.x = dimension.width - output.x;
938 point.y = dimension.height - output.y;
941 case LANDSCAPE_REVERSE:
942 point.x = dimension.height - output.y;
947 SysAssertf(0, "[E_SYSTEM][%d]", rotation);
956 _TouchInfo __touchInfo;
957 _TouchEventManager* __pTouchEventManager;
961 OnNotified(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
965 _UiEvent* pUiEvent = static_cast <_UiEvent*>(pEventInfo);
966 SysTryReturn(NID_UI, pUiEvent, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
968 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
969 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
971 result r = pEventManager->SendEvent(*pUiEvent);
972 SysTryReturn(NID_UI, r == E_SUCCESS, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
975 SetLastResult(E_SUCCESS);
977 return ECORE_CALLBACK_PASS_ON;
981 FreeEvent(void* pData __UNUSED__, void* pEventInfo)
983 _UiEvent* pUiEvent = static_cast <_UiEvent*>(pEventInfo);
991 OnKeyPressed(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
993 Ecore_Event_Key* pEv = static_cast <Ecore_Event_Key*>(pEventInfo);
994 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
996 if (_KeyEvent::GetKeyCode(pEv->keyname) == _KEY_INVALID)
998 SysLog(NID_UI, "KeyCode %s is invalid", pEv->keyname);
999 return ECORE_CALLBACK_PASS_ON;
1002 _KeyEvent event(KEY_PRESSED, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers), pEv);
1003 result r = GetLastResult();
1006 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1007 return ECORE_CALLBACK_PASS_ON;
1009 SysSecureLog(NID_UI, "KeyName = %s, KeyCode = %d, KeyModifier = %x", pEv->keyname, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers));
1012 __keyPressed[_KeyEvent::GetKeyCode(pEv->keyname)] = true;
1014 SetLastResult(E_SUCCESS);
1016 return ECORE_CALLBACK_PASS_ON;
1020 OnKeyReleased(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1022 Ecore_Event_Key* pEv = static_cast <Ecore_Event_Key*>(pEventInfo);
1023 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1025 if (_KeyEvent::GetKeyCode(pEv->keyname) == _KEY_INVALID)
1027 SysLog(NID_UI, "KeyCode %s is invalid", pEv->keyname);
1028 return ECORE_CALLBACK_PASS_ON;
1031 if (__keyPressed[_KeyEvent::GetKeyCode(pEv->keyname)] != true)
1033 SysLog(NID_UI, "KeyCode %s is not pressed", pEv->keyname);
1034 return ECORE_CALLBACK_PASS_ON;
1037 _KeyEvent event(KEY_RELEASED, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers), pEv);
1038 result r = GetLastResult();
1041 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1042 return ECORE_CALLBACK_PASS_ON;
1044 SysSecureLog(NID_UI, "KeyName = %s, KeyCode = %d, KeyModifier = %x", pEv->keyname, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers));
1047 __keyPressed[_KeyEvent::GetKeyCode(pEv->keyname)] = false;
1049 SetLastResult(E_SUCCESS);
1051 return ECORE_CALLBACK_PASS_ON;
1055 OnClipboardMessageReceived(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1057 Ecore_X_Event_Client_Message *pEv = static_cast<Ecore_X_Event_Client_Message*>(pEventInfo);
1059 if (pEv->message_type != ecore_x_atom_get("CBHM_MSG"))
1061 return ECORE_CALLBACK_PASS_ON;
1064 if (!strcmp("SET_OWNER", pEv->data.b))
1066 _KeyEvent event(KEY_PRESSED, _KEY_CLIPBOARD, 0, pEv);
1067 SysSecureLog(NID_UI, "KeyName = clipboard, KeyCode = _KEY_CLIPBOARD, KeyModifier = 0");
1070 SetLastResult(E_SUCCESS);
1073 return ECORE_CALLBACK_PASS_ON;
1078 ResetTouchQueueStatus(void)
1080 __touchTailCount = 20;
1083 __pVSyncTimer = ecore_timer_add(1.0 / 60.0, TouchEventHandlerVSync, null);
1088 QueueTouchPressEvent(Ecore_Event_Mouse_Button* pEv)
1090 SysTryReturn(NID_UI, pEv, false, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1091 SysTryReturn(NID_UI, __pRawTouchInfoList, false, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1093 RawTouchInfo rawInfo;
1094 rawInfo.window = pEv->window;
1095 rawInfo.device = pEv->multi.device;
1096 rawInfo.buttons = pEv->buttons;
1097 rawInfo.x = pEv->root.x;
1098 rawInfo.y = pEv->root.y;
1099 rawInfo.type = Tizen::Ui::_TOUCH_PRESSED;
1100 rawInfo.timeStamp = pEv->timestamp;
1102 __pRawTouchInfoList->push_back(rawInfo);
1103 ResetTouchQueueStatus();
1109 QueueTouchReleaseEvent(Ecore_Event_Mouse_Button* pEv)
1111 SysTryReturn(NID_UI, pEv, false, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1112 SysTryReturn(NID_UI, __pRawTouchInfoList, false, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1114 RawTouchInfo rawInfo;
1115 rawInfo.window = pEv->window;
1116 rawInfo.device = pEv->multi.device;
1117 rawInfo.buttons = pEv->buttons;
1118 rawInfo.x = pEv->root.x;
1119 rawInfo.y = pEv->root.y;
1120 rawInfo.type = Tizen::Ui::_TOUCH_RELEASED;
1121 rawInfo.timeStamp = pEv->timestamp;
1123 __pRawTouchInfoList->push_back(rawInfo);
1124 ResetTouchQueueStatus();
1130 QueueTouchMoveEvent(Ecore_Event_Mouse_Move* pEv)
1132 SysTryReturn(NID_UI, pEv, false, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1133 SysTryReturn(NID_UI, __pRawTouchInfoList, false, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1135 RawTouchInfo rawInfo;
1136 rawInfo.window = pEv->window;
1137 rawInfo.device = pEv->multi.device;
1138 rawInfo.buttons = 0;
1139 rawInfo.x = pEv->root.x;
1140 rawInfo.y = pEv->root.y;
1141 rawInfo.type = Tizen::Ui::_TOUCH_MOVED;
1142 rawInfo.timeStamp = pEv->timestamp;
1144 __pRawTouchInfoList->push_back(rawInfo);
1145 ResetTouchQueueStatus();
1151 FindTouchEventAtTime(RawTouchInfo* pRawInfo, unsigned int timeStamp)
1153 SysTryReturn(NID_UI, __pRawTouchInfoList, false, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1155 int count = __pRawTouchInfoList->size();
1162 std::list<RawTouchInfo>::iterator pos = __pRawTouchInfoList->begin();
1163 RawTouchInfo cur = *pos;
1164 if (cur.timeStamp >= timeStamp)
1169 std::list<RawTouchInfo>::iterator iter = __pRawTouchInfoList->erase(pos);
1170 int devId = cur.device;
1172 for (; iter != __pRawTouchInfoList->end(); iter++)
1174 if (cur.timeStamp >= timeStamp)
1182 case Tizen::Ui::_TOUCH_PRESSED:
1183 case Tizen::Ui::_TOUCH_RELEASED:
1188 case Tizen::Ui::_TOUCH_MOVED:
1189 if ((*iter).device != devId)
1194 if (cur.type != (*iter).type || cur.window != (*iter).window || cur.buttons != (*iter).buttons)
1200 if ((*iter).timeStamp >= timeStamp)
1202 float ratio = (float)(timeStamp - cur.timeStamp) / (float)((*iter).timeStamp - cur.timeStamp);
1210 pRawInfo->x = cur.x + ((*iter).x - cur.x) * ratio;
1211 pRawInfo->y = cur.y + ((*iter).y - cur.y) * ratio;
1212 pRawInfo->timeStamp = cur.timeStamp;
1213 pRawInfo->buttons = cur.buttons; // 0 ?
1214 pRawInfo->type = cur.type; // Tizen::Ui::_TOUCH_MOVED ?
1215 pRawInfo->window = cur.window;
1216 pRawInfo->device = cur.device;
1223 iter = __pRawTouchInfoList->erase(iter);
1239 DequeueTouchPressEvent(unsigned int& window, int& x, int& y, int& device, unsigned int& timeStamp, int& buttons, int& type, bool forceNow)
1251 double checkTime = 0.0;
1255 checkTime = ecore_time_get() * 1000.0;
1259 checkTime = ecore_time_get() * 1000.0 - 8.0;
1262 if (!FindTouchEventAtTime(&cur, (unsigned int)checkTime))
1267 window = cur.window;
1270 device = cur.device;
1271 timeStamp = cur.timeStamp;
1272 buttons = cur.buttons;
1279 TouchEventHandlerVSync(void* pData)
1281 SysTryReturn(NID_UI, __pRawTouchInfoList, EINA_FALSE, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1283 if (__pRawTouchInfoList->size() <= 0)
1285 if (--__touchTailCount <= 0)
1287 __pVSyncTimer = null;
1292 unsigned int window = 0;
1296 unsigned int timeStamp = 0;
1300 Ecore_Event_Mouse_Button evTouch;
1301 evTouch.window = window;
1304 evTouch.multi.device = device;
1305 evTouch.buttons = buttons;
1306 evTouch.timestamp = timeStamp;
1308 Ecore_Event_Mouse_Move evMove;
1309 evMove.window = window;
1312 evMove.multi.device = device;
1313 evMove.timestamp = timeStamp;
1315 if (DequeueTouchPressEvent(window, x, y, device, timeStamp, buttons, type, false))
1319 case Tizen::Ui::_TOUCH_PRESSED:
1320 evTouch.window = window;
1323 evTouch.multi.device = device;
1324 evTouch.buttons = buttons;
1325 evTouch.timestamp = timeStamp;
1326 OnTouchPressedReal(&evTouch);
1329 case Tizen::Ui::_TOUCH_RELEASED:
1330 evTouch.window = window;
1333 evTouch.multi.device = device;
1334 evTouch.buttons = buttons;
1335 evTouch.timestamp = timeStamp;
1336 OnTouchReleasedReal(&evTouch);
1339 case Tizen::Ui::_TOUCH_MOVED:
1340 evMove.window = window;
1343 evMove.multi.device = device;
1344 evMove.timestamp = timeStamp;
1345 OnTouchMovedReal(&evMove);
1354 OnTouchPressed(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1356 Ecore_Event_Mouse_Button* pEv = static_cast <Ecore_Event_Mouse_Button*>(pEventInfo);
1357 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1359 SysSecureLog(NID_UI, "OnTouchPressed - x(%d), y(%d), deviceId(%d), buttons(%d)", pEv->root.x, pEv->root.y, pEv->multi.device, pEv->buttons);
1361 if (__touchPressed[pEv->multi.device] == true)
1363 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1366 pTouchManager->SetTouchCanceled(null);
1367 SysLog(NID_UI, "pWindow is null, CancelTouch");
1369 for(int i=0; i<DEVICE_COUNT; i++)
1371 __touchPressed[i] = false;
1374 pTouchManager->ResetTouchInfo();
1375 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
1379 __touchPressed[pEv->multi.device] = true;
1381 if (!QueueTouchPressEvent(pEv))
1383 return OnTouchPressedReal(pEv);
1386 SetLastResult(E_SUCCESS);
1387 return ECORE_CALLBACK_PASS_ON;
1391 OnTouchPressedReal(Ecore_Event_Mouse_Button* pEv)
1393 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1395 _ControlManager* pControlManager = _ControlManager::GetInstance();
1396 SysTryReturn(NID_UI, pControlManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1398 pControlManager->SetTouchedWindow((unsigned int)pEv->window);
1400 if (pEv->buttons == _TOUCH_BUTTON_LEFT || pEv->buttons == _TOUCH_BUTTON_NONE)
1402 _TouchEvent event(pEv->multi.device, _TOUCH_PRESSED, pEv->root.x, pEv->root.y, pEv->timestamp, null, 0, pEv->buttons);
1404 result r = GetLastResult();
1407 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1408 return ECORE_CALLBACK_PASS_ON;
1415 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1418 pTouchManager->ResetTouchInfo();
1419 SysLog(NID_UI, "Mouse right/wheel button is pressed, ResetTouchInfo");
1422 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
1423 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1425 if (pEv->buttons == _TOUCH_BUTTON_RIGHT)
1427 pEventManager->GenerateKeyEvent(KEY_PRESSED, _KEY_BACK, _KEY_MODIFIER_NONE, false);
1428 pEventManager->GenerateKeyEvent(KEY_RELEASED, _KEY_BACK, _KEY_MODIFIER_NONE, false);
1432 SetLastResult(E_SUCCESS);
1434 return ECORE_CALLBACK_PASS_ON;
1438 OnTouchReleased(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1440 Ecore_Event_Mouse_Button* pEv = static_cast <Ecore_Event_Mouse_Button*>(pEventInfo);
1441 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1443 SysSecureLog(NID_UI, "OnTouchReleased - x(%d), y(%d), deviceId(%d) buttons(%d)", pEv->root.x, pEv->root.y, pEv->multi.device, pEv->buttons);
1445 __touchPressed[pEv->multi.device] = false;
1447 if (!QueueTouchReleaseEvent(pEv))
1449 return OnTouchReleasedReal(pEv);
1452 SetLastResult(E_SUCCESS);
1453 return ECORE_CALLBACK_PASS_ON;
1457 OnTouchReleasedReal(Ecore_Event_Mouse_Button* pEv)
1459 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1461 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1462 SysTryReturn(NID_UI, pTouchManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] _TouchManager does not exist.");
1464 if (pEv->buttons == _TOUCH_BUTTON_LEFT || pEv->buttons == _TOUCH_BUTTON_NONE)
1466 _TouchEvent event(pEv->multi.device, _TOUCH_RELEASED, pEv->root.x, pEv->root.y, pEv->timestamp, null, 0, pEv->buttons);
1468 result r = GetLastResult();
1471 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1472 return ECORE_CALLBACK_PASS_ON;
1479 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1482 pTouchManager->ResetTouchInfo();
1483 SysLog(NID_UI, "Mouse right/wheel button is released, ResetTouchInfo");
1487 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
1488 SysTryReturn(NID_UI, pFingerInfoList, ECORE_CALLBACK_PASS_ON, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1490 int count = pFingerInfoList->GetCount();
1492 for (int i = 0; i < count; i++)
1494 _FingerInfo* pFingerInfo = null;
1495 pFingerInfoList->GetAt(i, pFingerInfo);
1496 if (pFingerInfo == null)
1501 if (static_cast<int>(pFingerInfo->GetDeviceId()) == pEv->multi.device)
1503 pFingerInfo->SetPointId(INVALID_POINT_ID);
1507 delete pFingerInfoList;
1509 pTouchManager->SetChangedTouchableTarget(null);
1511 SetLastResult(E_SUCCESS);
1512 return ECORE_CALLBACK_PASS_ON;
1516 OnTouchMoved(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1518 Ecore_Event_Mouse_Move* pEv = static_cast <Ecore_Event_Mouse_Move*>(pEventInfo);
1519 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1521 //SysSecureLog(NID_UI, "OnTouchMoved - x(%d), y(%d), deviceId(%d)", pEv->root.x, pEv->root.y, pEv->multi.device);
1523 if (__touchPressed[pEv->multi.device] != true)
1525 return ECORE_CALLBACK_PASS_ON;
1528 if (!QueueTouchMoveEvent(pEv))
1530 return OnTouchMovedReal(pEv);
1533 SetLastResult(E_SUCCESS);
1534 return ECORE_CALLBACK_PASS_ON;
1538 OnTouchMovedReal(Ecore_Event_Mouse_Move* pEv)
1540 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1542 _TouchEvent event(pEv->multi.device, _TOUCH_MOVED, pEv->root.x, pEv->root.y, pEv->timestamp, null, 0, _TOUCH_BUTTON_NONE);
1544 result r = GetLastResult();
1547 return ECORE_CALLBACK_PASS_ON;
1552 SetLastResult(E_SUCCESS);
1554 return ECORE_CALLBACK_PASS_ON;
1558 OnTouchWheeled(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1560 _Ecore_Event_Mouse_Wheel* pEv = static_cast <_Ecore_Event_Mouse_Wheel*>(pEventInfo);
1561 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1563 SysSecureLog(NID_UI, "OnTouchWheeled - x(%d), y(%d), z(%d)", pEv->root.x, pEv->root.y, pEv->z);
1564 _TouchEvent event(0, _TOUCH_WHEELED, pEv->root.x, pEv->root.y, pEv->timestamp, null, pEv->z, _TOUCH_BUTTON_NONE);
1566 result r = GetLastResult();
1569 return ECORE_CALLBACK_PASS_ON;
1574 SetLastResult(E_SUCCESS);
1576 return ECORE_CALLBACK_PASS_ON;
1580 OnKeyboardInserted(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1582 Ecore_X_Event_Window_Property *pEv = static_cast <Ecore_X_Event_Window_Property*>(pEventInfo);
1583 if ( pEv->atom != __keyboardExist)
1585 // SysLog(NID_UI, "OnKeyboardInserted - atom of event(%d), __keyboardExist(%d)", pEv->atom, __keyboardExist);
1586 return ECORE_CALLBACK_PASS_ON;
1589 ArrayList* pArgs = null;
1590 result r = E_SUCCESS;
1591 Boolean* pIsKeyboardOn = null;
1592 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
1593 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1595 _Control* pControl = _ControlManager::GetInstance()->GetFocusControl();
1596 SysTryReturn(NID_UI, pControl, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1598 bool isKeyboardOn = false;
1599 unsigned int value = 0;
1600 int returnResult = -1;
1602 returnResult = ecore_x_window_prop_card32_get(pEv->win, __keyboardExist, &value, 1);
1607 isKeyboardOn = true;
1610 pArgs = new (std::nothrow) ArrayList;
1611 SysTryReturn(NID_UI, pArgs, ECORE_CALLBACK_PASS_ON, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1613 r = pArgs->Construct();
1614 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1616 String* pString = new (std::nothrow) String(KEYBOARD_INSERTED_EVENT);
1617 r = pArgs->Add(*pString);
1618 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1620 pIsKeyboardOn = new (std::nothrow) Boolean(isKeyboardOn);
1621 r = pArgs->Add(*pIsKeyboardOn);
1622 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1624 _UiNotificationEvent event(pControl->GetHandle(), pArgs);
1625 r = pEventManager->SendEvent(event);
1626 // SysLog(NID_UI, "OnKeyboardInserted - sent keyboard inserted noti");
1631 return ECORE_CALLBACK_PASS_ON;
1641 delete pIsKeyboardOn;
1644 return ECORE_CALLBACK_PASS_ON;
1648 OnWindowFocusIn(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1650 SysLog(NID_UI, "Enter");
1652 Ecore_X_Event_Window_Focus_In* pEv = static_cast<Ecore_X_Event_Window_Focus_In*>(pEventInfo);
1653 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1655 _ControlManager* pControlManager = _ControlManager::GetInstance();
1656 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1658 int count = pControlManager->GetWindowCount();
1660 _Control* pFocusedControl = null;
1661 for (int i = count - 1; i >= 0; --i)
1663 _Window* pWindow = pControlManager->GetWindow(i);
1666 NativeWindowHandle nativeWindowHandle = pWindow->GetNativeHandle();
1667 if (pEv->win == nativeWindowHandle)
1669 pFocusedControl = pWindow->GetCurrentFocusControl();
1671 if (pFocusedControl)
1673 pFocusedControl->SetFocused();
1679 _AccessibilityManager::GetInstance()->RequestAutoReading(_ACCESSIBILITY_AUTO_READING_MODE_FIRST_ITEM);
1680 return ECORE_CALLBACK_PASS_ON;
1684 OnWindowFocusOut(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1686 SysLog(NID_UI, "Enter");
1688 Ecore_X_Event_Window_Focus_Out* pEv = static_cast<Ecore_X_Event_Window_Focus_Out*>(pEventInfo);
1689 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1691 _ControlManager* pControlManager = _ControlManager::GetInstance();
1692 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1694 _Control* pFocusedControl = pControlManager->GetFocusControl();
1695 if (pFocusedControl)
1697 _Window* pRootWindow = pFocusedControl->GetRootWindow();
1700 NativeWindowHandle nativeWindowHandle = pRootWindow->GetNativeHandle();
1701 if (pEv->win == nativeWindowHandle)
1703 pControlManager->TakeFocusFromControl(*pFocusedControl);
1707 _AccessibilityManager::GetInstance()->RequestAutoReading(_ACCESSIBILITY_AUTO_READING_MODE_RESET);
1708 return ECORE_CALLBACK_PASS_ON;
1711 // procotol version - change this as needed
1712 // referenced to Ecore_evas_extn.c
1713 #define MAJOR 0x1011
1742 struct _IpcDataEvMouseUp
1745 Evas_Button_Flags flags;
1747 unsigned int timestamp;
1748 Evas_Event_Flags eventFlags;
1751 struct _IpcDataEvMouseDown
1754 Evas_Button_Flags flags;
1756 unsigned int timestamp;
1757 Evas_Event_Flags eventFlags;
1760 struct _IpcDataEvMouseMove
1763 Evas_Button_Flags flags;
1765 unsigned int timestamp;
1766 Evas_Event_Flags eventFlags;
1771 OnIpcClientData(void *pData, int type __UNUSED__, void *pEvent)
1773 Ecore_Ipc_Event_Client_Data *pEv = static_cast<Ecore_Ipc_Event_Client_Data*>(pEvent);
1774 SysTryReturnResult(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, "[E_INVALID_ARG] The argument is invalid.");
1776 if (pEv->major != MAJOR)
1778 return ECORE_CALLBACK_PASS_ON;
1781 _Control* pControl = static_cast<_Control*>(pData);
1782 SysTryReturnResult(NID_UI, pControl, ECORE_CALLBACK_PASS_ON, "[E_INVALID_ARG] The argument is invalid.");
1784 Evas* pEvas = GetEvas(*pControl);
1785 SysTryReturnResult(NID_UI, pEvas, ECORE_CALLBACK_PASS_ON, "[E_INVALID_ARG] The argument is invalid.");
1790 evas_pointer_output_xy_get(pEvas, &pointX, &pointY);
1794 case OP_EV_MOUSE_DOWN:
1795 if (pEv->size >= static_cast<int>(sizeof(_IpcDataEvMouseDown)))
1797 _IpcDataEvMouseDown *pIpc = static_cast<_IpcDataEvMouseDown*>(pEv->data);
1798 SysTryReturnResult(NID_UI, pIpc, ECORE_CALLBACK_PASS_ON, "[E_INVALID_ARG] The argument is invalid.");
1800 if (__evasTouchPressed == true)
1802 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1805 pTouchManager->SetTouchCanceled(null);
1806 SysLog(NID_UI, "pWindow is null, CancelTouch");
1808 __evasTouchPressed = false;
1809 pTouchManager->ResetTouchInfo();
1810 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
1814 __evasTouchPressed = true;
1816 SysSecureLog(NID_UI, "OnEvasTouchPressed - x(%d), y(%d)", pointX, pointY);
1817 _TouchEvent event(0, _TOUCH_PRESSED, pointX, pointY, pIpc->timestamp, pControl);
1819 result r = GetLastResult();
1822 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1823 return ECORE_CALLBACK_PASS_ON;
1828 SetLastResult(E_SUCCESS);
1832 case OP_EV_MOUSE_UP:
1833 if (pEv->size >= static_cast<int>(sizeof(_IpcDataEvMouseUp)))
1835 _IpcDataEvMouseUp *pIpc = static_cast<_IpcDataEvMouseUp*>(pEv->data);
1836 SysTryReturnResult(NID_UI, pIpc, ECORE_CALLBACK_PASS_ON, "[E_INVALID_ARG] The argument is invalid.");
1838 __evasTouchPressed = false;
1840 SysSecureLog(NID_UI, "OnEvasTouchReleased - x(%d), y(%d)", pointX, pointY);
1841 _TouchEvent event(0, _TOUCH_RELEASED, pointX, pointY, pIpc->timestamp, pControl);
1843 result r = GetLastResult();
1846 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1847 return ECORE_CALLBACK_PASS_ON;
1852 SetLastResult(E_SUCCESS);
1856 case OP_EV_MOUSE_MOVE:
1857 if (pEv->size >= static_cast<int>(sizeof(_IpcDataEvMouseMove)))
1859 if (__evasTouchPressed == false)
1861 return ECORE_CALLBACK_PASS_ON;
1864 _IpcDataEvMouseMove *pIpc = static_cast<_IpcDataEvMouseMove*>(pEv->data);
1865 SysTryReturnResult(NID_UI, pIpc, ECORE_CALLBACK_PASS_ON, "[E_INVALID_ARG] The argument is invalid.");
1867 SysSecureLog(NID_UI, "OnEvasTouchMoved - x(%d), y(%d)", pointX, pointY);
1868 _TouchEvent event(0, _TOUCH_MOVED, pointX, pointY, pIpc->timestamp, pControl);
1870 result r = GetLastResult();
1873 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1874 return ECORE_CALLBACK_PASS_ON;
1879 SetLastResult(E_SUCCESS);
1887 return ECORE_CALLBACK_PASS_ON;
1893 OnEvasKeyPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1895 Evas_Event_Key_Down* pEv = static_cast <Evas_Event_Key_Down*>(pEventInfo);
1896 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1898 SetLastResult(E_SUCCESS);
1902 OnEvasKeyReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1904 Evas_Event_Key_Up* pEv = static_cast <Evas_Event_Key_Up*>(pEventInfo);
1905 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1907 SetLastResult(E_SUCCESS);
1913 namespace Tizen { namespace Ui
1916 _EflUiEventManager::_EflUiEventManager(void)
1917 : __notificaitonEventType(-1)
1919 unique_ptr<LinkedListT<Ecore_Event_Handler*> > pEventHandlers(new (std::nothrow) LinkedListT<Ecore_Event_Handler*>);
1920 SysTryReturnVoidResult(NID_UI, pEventHandlers, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1923 __notificaitonEventType = ecore_event_type_new();
1924 SysTryReturnVoidResult(NID_UI, __notificaitonEventType >= 1, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1926 Ecore_Event_Handler* pEventHandler = ecore_event_handler_add(__notificaitonEventType, OnNotified, null);
1927 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1929 pEventHandlers->Add(pEventHandler);
1932 pEventHandler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, OnKeyPressed, null);
1933 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1935 pEventHandlers->Add(pEventHandler);
1937 pEventHandler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, OnKeyReleased, null);
1938 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1940 pEventHandlers->Add(pEventHandler);
1943 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, OnClipboardMessageReceived, null);
1944 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1946 pEventHandlers->Add(pEventHandler);
1949 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, OnTouchPressed, null);
1950 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1952 pEventHandlers->Add(pEventHandler);
1954 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, OnTouchReleased, null);
1955 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1957 pEventHandlers->Add(pEventHandler);
1959 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, OnTouchMoved, null);
1960 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1962 pEventHandlers->Add(pEventHandler);
1964 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL, OnTouchWheeled, null);
1965 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1967 pEventHandlers->Add(pEventHandler);
1970 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, OnKeyboardInserted, null);
1971 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1973 pEventHandlers->Add(pEventHandler);
1976 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, OnWindowFocusIn, null);
1977 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1979 pEventHandlers->Add(pEventHandler);
1981 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, OnWindowFocusOut, null);
1982 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1984 pEventHandlers->Add(pEventHandler);
1986 __pEventHandlers = move(pEventHandlers);
1988 __keyboardExist = XInternAtom(static_cast<Display*>(ecore_x_display_get()), "X External Keyboard Exist", 0);
1990 __pRawTouchInfoList = new std::list<RawTouchInfo>;
1991 SysTryReturnVoidResult(NID_UI, __pRawTouchInfoList, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1993 SetLastResult(E_SUCCESS);
1996 _EflUiEventManager::~_EflUiEventManager(void)
1998 Tizen::Base::Collection::IEnumeratorT<Ecore_Event_Handler*>* pEnumerator = __pEventHandlers->GetEnumeratorN();
1999 SysTryReturnVoidResult(NID_UI, pEnumerator, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
2001 if (__pRawTouchInfoList)
2003 delete __pRawTouchInfoList;
2004 __pRawTouchInfoList = null;
2007 while (pEnumerator->MoveNext() == E_SUCCESS)
2009 Ecore_Event_Handler* pEventHandler = null;
2010 pEnumerator->GetCurrent(pEventHandler);
2013 ecore_event_handler_del(pEventHandler);
2021 _EflUiEventManager::ClearEventQueue(void)
2023 int count = __pRawTouchInfoList->size();
2026 __pVSyncTimer = null;
2028 for(std::list<RawTouchInfo>::iterator iter =__pRawTouchInfoList->begin(); iter != __pRawTouchInfoList->end();)
2030 __pRawTouchInfoList->erase(iter++);
2032 __pRawTouchInfoList->clear();
2037 _EflUiEventManager::RegisterKeyEventHandler(const _Control& control)
2039 result r = E_SUCCESS;
2041 Evas_Object* pEvasObject = GetEvasObject(control);
2042 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
2044 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_KEY_UP, OnEvasKeyReleased, &control);
2045 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_KEY_DOWN, OnEvasKeyPressed, &control);
2051 _EflUiEventManager::RegisterTouchEventHandler(const _Control& control)
2053 result r = E_SUCCESS;
2055 SysLog(NID_UI, "RegisterTouchEventHandler = 0x%x", &control);
2057 unique_ptr<LinkedListT<Ecore_Event_Handler*> > pEventHandlers(new (std::nothrow) LinkedListT<Ecore_Event_Handler*>);
2058 SysTryReturnResult(NID_UI, pEventHandlers, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
2060 Ecore_Event_Handler* pEventHandler = ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA, OnIpcClientData, &control);
2061 SysTryReturnResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
2063 pEventHandlers->Add(pEventHandler);
2065 __pMouseEventHandlers = move(pEventHandlers);
2071 _EflUiEventManager::UnregisterKeyEventHandler(const _Control& control)
2073 result r = E_SUCCESS;
2075 Evas_Object* pEvasObject = GetEvasObject(control);
2076 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
2078 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_KEY_UP, OnEvasKeyReleased);
2079 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_KEY_DOWN, OnEvasKeyPressed);
2085 _EflUiEventManager::UnregisterTouchEventHandler(const _Control& control)
2087 result r = E_SUCCESS;
2089 Tizen::Base::Collection::IEnumeratorT<Ecore_Event_Handler*>* pEnumerator = __pMouseEventHandlers->GetEnumeratorN();
2090 SysTryReturnResult(NID_UI, pEnumerator, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
2092 while (pEnumerator->MoveNext() == E_SUCCESS)
2094 Ecore_Event_Handler* pEventHandler = null;
2095 pEnumerator->GetCurrent(pEventHandler);
2098 ecore_event_handler_del(pEventHandler);
2108 _EflUiEventManager::PostEvent(const _UiEvent& event)
2112 result r = E_SUCCESS;
2114 _UiEvent* pEvent = event.CloneN();
2115 SysTryReturn(NID_UI, pEvent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
2117 Ecore_Event* pEcoreEvent = ecore_event_add(__notificaitonEventType, pEvent, FreeEvent, null);
2118 SysTryReturn(NID_UI, pEcoreEvent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");