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>
45 #if defined KEY_SEARCH
53 #include <FBaseColIEnumeratorT.h>
54 #include <FBaseSysLog.h>
55 #include "FUi_CoordinateSystemUtils.h"
56 #include "FUi_Control.h"
57 #include "FUi_ControlManager.h"
58 #include "FUi_KeyEventManager.h"
59 #include "FUi_Window.h"
60 #include "FUi_UiEventManager.h"
61 #include "FUi_EflUiEventManager.h"
62 #include "FUi_UiTouchEvent.h"
63 #include "FUi_UiNotificationEvent.h"
64 #include "FUi_UiKeyEvent.h"
65 #include "FUi_UiFocusEvent.h"
66 #include "FUi_EcoreEvasMgr.h"
67 #include "FUi_EcoreEvas.h"
68 #include "FUi_TouchManager.h"
69 #include "FUiAnim_EflNode.h"
70 #include "FUiAnim_ControlVisualElement.h"
71 #include "FUiAnim_RootVisualElement.h"
72 #include "FUiAnim_EflLayer.h"
73 #include "FUi_AccessibilityManager.h"
76 using namespace Tizen::Ui;
77 using namespace Tizen::Ui::Animations;
78 using namespace Tizen::Graphics;
79 using namespace Tizen::Base::Collection;
80 using namespace Tizen::Base;
81 using namespace Tizen::Ui::Controls;
87 Ecore_X_Atom keyboardExist = 0;
88 const wchar_t* KEYBOARD_INSERTED_EVENT = L"KEYBOARD_INSERTED";
89 const int DEVICE_COUNT = 999;
90 bool touchPressed[DEVICE_COUNT] = {false,};
91 bool evasTouchPressed = false;
92 const int KEY_COUNT = 300;
93 bool keyPressed[KEY_COUNT] = {false,};
96 GetEvasObject(const _Control& control)
98 _VisualElement* pVisualElement = control.GetVisualElement();
99 SysTryReturn(NID_UI, pVisualElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
101 _EflNode* pEflNode = dynamic_cast<_EflNode*>(pVisualElement->GetNativeNode());
102 SysTryReturn(NID_UI, pEflNode, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
104 return (Evas_Object*)pEflNode->GetGroupContainer();
108 GetEvas(const _Control& control)
111 Evas_Object* pEvasObject = GetEvasObject(control);
114 pEvas = evas_object_evas_get(pEvasObject);
115 SysTryReturn(NID_UI, pEvas, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
125 : _pEventManager(null)
127 _pEventManager = _UiEventManager::GetInstance();
128 SysTryReturnVoidResult(NID_UI, _pEventManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
130 SetLastResult(E_SUCCESS);
133 virtual ~_Event(void)
138 _Event(const _Event& rhs);
139 _Event& operator =(const _Event& rhs);
141 virtual result SendImpl(void) = 0;
150 _UiEventManager* _pEventManager;
153 struct _EvasConvertKeys
159 const _EvasConvertKeys keyTable[] =
161 { _KEY_ESC, "Escape" },
162 { _KEY_GRAVE, "grave" },
173 { _KEY_MINUS, "minus" },
174 { _KEY_EQUAL, "equal" },
175 { _KEY_BACKSLASH, "backslash" },
176 { _KEY_BACKSPACE, "BackSpace" },
188 { _KEY_LBRACKET, "bracketleft" },
189 { _KEY_RBRACKET, "bracketright" },
190 { _KEY_ENTER, "Return" },
191 { _KEY_CAPSLOCK, "Caps_Lock" },
201 { _KEY_SEMICOLON, "semicolon" },
202 { _KEY_APOSTROPHE, "apostrophe" },
203 { _KEY_SHIFT_L, "Shift_L" },
211 { _KEY_COMMA, "comma" },
212 { _KEY_DOT, "period" },
213 { _KEY_SLASH, "slash" },
214 { _KEY_SHIFT_R, "Shift_R" },
215 { _KEY_CTRL_L, "Control_L" },
216 { _KEY_LALT, "Alt_L" },
217 { _KEY_SPACE, "space" },
218 { _KEY_RALT, "Alt_R" },
219 { _KEY_CTRL_R, "Control_R" },
229 { _KEY_FN_10, "F10" },
230 { _KEY_FN_11, "F11" },
231 { _KEY_FN_12, "F12" },
232 { _KEY_NUM_LOCK, "Num_Lock" },
233 { _KEY_NUMPAD_DIVIDE, "KP_Divide" },
234 { _KEY_NUMPAD_MULTIPLY, "KP_Multiply" },
235 { _KEY_NUMPAD_SUBTRACT, "KP_Subtract" },
236 { _KEY_NUMPAD_7, "KP_Home" },
237 { _KEY_NUMPAD_8, "KP_Up" },
238 { _KEY_NUMPAD_9, "KP_Prior" },
239 { _KEY_NUMPAD_4, "KP_Left" },
240 { _KEY_NUMPAD_5, "KP_Begin" },
241 { _KEY_NUMPAD_6, "KP_Right" },
242 { _KEY_NUMPAD_ADD, "KP_Add" },
243 { _KEY_NUMPAD_1, "KP_End" },
244 { _KEY_NUMPAD_2, "KP_Down" },
245 { _KEY_NUMPAD_3, "KP_Next" },
246 { _KEY_NUMPAD_0, "KP_Insert" },
247 { _KEY_NUMPAD_DOT, "KP_Delete" },
248 { _KEY_NUMPAD_ENTER, "KP_Enter" },
249 { _KEY_PRINT, "Print" },
250 { _KEY_SCROLL_LOCK, "Scroll_Lock" },
251 { _KEY_PAUSEBREAK, "Pause" },
252 { _KEY_INSERT, "Insert" },
253 { _KEY_HOME_BUTTON, "Home" },
254 { _KEY_PAGE_UP, "Prior" },
255 { _KEY_DELETE, "Delete" },
256 { _KEY_END_BUTTON, "End" },
257 { _KEY_PAGE_DOWN, "Next" },
259 { _KEY_LEFT, "Left" },
260 { _KEY_DOWN, "Down" },
261 { _KEY_RIGHT, "Right" },
262 { _KEY_CONTEXT_MENU, "Menu" },
263 { _KEY_MENU, "XF86Send" },
265 { _KEY_COMMA, "less" }, /*virtual keypad <*/
266 { _KEY_9, "parenleft" }, /*virtual keypad (*/
267 { _KEY_0, "parenright" }, /*virtual keypad )*/
269 { _KEY_BACK, "XF86Stop" },
270 // { _KEY_HOME, "XF86Phone" },
271 { _KEY_WEB_PAGE, "XF86WWW" },
272 { _KEY_MAIL, "XF86Mail" },
273 { _KEY_SCREEN_SAVER, "XF86ScreenSaver" },
274 { _KEY_BRIGHTNESS_DOWN, "XF86MonBrightnessDown" },
275 { _KEY_BRIGHTNESS_UP, "XF86MonBrightnessUp" },
276 { _KEY_MUTE, "XF86AudioMute" },
277 // { _KEY_VOLUME_DOWN, "XF86AudioLowerVolume" },
278 // { _KEY_VOLUME_UP, "XF86AudioRaiseVolume" },
279 { _KEY_PLAY_PAUSE, "XF86AudioPlay" },
280 { _KEY_NEXT_SONG, "XF86AudioNext" },
281 { _KEY_PREVIOUS_SONG, "XF86AudioPrev" },
282 { _KEY_APPS, "XF86Launch0" },
283 { _KEY_MENU, "XF86Send" },
284 { _KEY_SOFT_KEYBOARD, "XF86MenuKB" },
285 { _KEY_SEARCH, "XF86Search" },
286 { _KEY_VOICE, "XF86Launch2" },
287 { _KEY_QUICK_PANEL, "XF86Tools" }
294 _KeyEvent(KeyState keyState, _KeyCode keyCode, int keyModifier, void* pUserData)
296 , __keyInfo(keyState, keyCode, keyModifier, pUserData)
298 __pTarget = GetTarget(keyCode);
299 if (IsNativeWindowActivated(__pTarget) == false)
301 SysTryReturnVoidResult(NID_UI, IsNativeWindowActivated(__pTarget), E_SYSTEM, "[E_SYSTEM] NativeWindow is not activated yet");
305 virtual ~_KeyEvent(void)
309 static _KeyCode GetKeyCode(const char* pKeyName)
313 SysTryReturn(NID_UI, pKeyName, _KEY_INVALID, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
315 for (unsigned int i = 0; i < sizeof(keyTable) / sizeof(_EvasConvertKeys); ++i)
317 if (strcmp(keyTable[i].pName, pKeyName) == 0)
319 return keyTable[i].code;
326 static int GetKeyModifier(const int keyModifier)
329 unsigned int modifier = _KEY_MODIFIER_NONE;
331 if(ECORE_EVENT_MODIFIER_SHIFT & keyModifier)
333 modifier |= _KEY_MODIFIER_SHIFT;
335 if(ECORE_EVENT_MODIFIER_CTRL & keyModifier)
337 modifier |= _KEY_MODIFIER_CTRL;
339 if(ECORE_EVENT_MODIFIER_ALT & keyModifier)
341 modifier |= _KEY_MODIFIER_ALT;
343 if(ECORE_EVENT_MODIFIER_WIN & keyModifier)
345 modifier |= _KEY_MODIFIER_WIN;
347 if(ECORE_EVENT_MODIFIER_SCROLL & keyModifier)
349 modifier |= _KEY_MODIFIER_SCROLL;
351 if(ECORE_EVENT_MODIFIER_NUM & keyModifier)
353 modifier |= _KEY_MODIFIER_NUM;
355 if(ECORE_EVENT_MODIFIER_CAPS & keyModifier)
357 modifier |= _KEY_MODIFIER_CAPS;
359 if(ECORE_EVENT_LOCK_SCROLL & keyModifier)
361 modifier |= _KEY_LOCK_SCROLL;
363 if(ECORE_EVENT_LOCK_NUM & keyModifier)
365 modifier |= _KEY_LOCK_NUM;
367 if(ECORE_EVENT_LOCK_CAPS & keyModifier)
369 modifier |= _KEY_LOCK_CAPS;
371 if(ECORE_EVENT_LOCK_SHIFT & keyModifier)
373 modifier |= _KEY_LOCK_SHIFT;
375 if(ECORE_EVENT_MODIFIER_ALTGR & keyModifier)
377 modifier |= _KEY_MODIFIER_ALTGR;
384 _KeyEvent(const _KeyEvent& rhs);
385 _KeyEvent& operator =(const _KeyEvent& rhs);
387 virtual result SendImpl(void)
389 SysTryReturn(NID_UI, __pTarget, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
391 _UiKeyEvent event(__pTarget->GetHandle(), __keyInfo);
393 return _pEventManager->SendEvent(event);
396 _Control* GetTarget(_KeyCode keyCode) const
398 _KeyEventManager* pKeyEventManager = _KeyEventManager::GetInstance();
399 SysTryReturn(NID_UI, pKeyEventManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
401 _ControlManager* pControlManager = _ControlManager::GetInstance();
402 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
404 _Control* pControl = pControlManager->GetFocusControl();
407 pControl = pControlManager->GetCurrentFrame();
409 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
411 SetLastResult(E_SUCCESS);
417 IsNativeWindowActivated(_Control* pControl)
419 bool nativeWindowActivated = false;
420 _Control* pParent = pControl;
424 _Window* pWindow = dynamic_cast<_Window*>(pParent);
426 && (pWindow->GetNativeWindowActivated() == true || (pWindow->GetNativeWindowActivated() == false && pWindow->GetWindowType() == _WINDOW_TYPE_VE)))
428 nativeWindowActivated = true;
432 pParent = pParent->GetParent();
434 return nativeWindowActivated;
442 class _TouchEventManager
445 static _TouchEventManager* GetInstance(void)
447 if (__pInstance == null)
449 __pInstance = new (std::nothrow) _TouchEventManager;
450 SysTryReturn(NID_UI, __pInstance, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
453 SetLastResult(E_SUCCESS);
458 result AddControl(int pointId, const _ControlHandle& controlHandle)
461 result r = E_SUCCESS;
463 __pTargetMap->ContainsKey(pointId, exist);
467 r = __pTargetMap->Remove(pointId);
468 SysTryReturnResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
471 r = __pTargetMap->Add(pointId, controlHandle);
472 SysTryReturnResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
477 _Control* GetControl(int pointId)
479 SysTryReturn(NID_UI, __pTargetMap, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
481 _ControlHandle controlHandle;
483 __pTargetMap->GetValue(pointId, controlHandle);
485 _ControlManager* pControlManager = _ControlManager::GetInstance();
486 result r = GetLastResult();
487 SysTryReturn(NID_UI, pControlManager, null, r, "[%s] Propagating.", GetErrorMessage(r));
489 return pControlManager->GetObject(controlHandle);
493 _TouchEventManager(void)
495 result r = E_SUCCESS;
496 unique_ptr<HashMapT<int, _ControlHandle> > pTargetMap(new (std::nothrow) HashMapT<int, _ControlHandle>);
497 SysTryReturnVoidResult(NID_UI, pTargetMap, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
499 r = pTargetMap->Construct();
500 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
502 __pTargetMap = move(pTargetMap);
504 SetLastResult(E_SUCCESS);
507 ~_TouchEventManager(void)
511 _TouchEventManager(const _TouchEventManager& rhs);
512 _TouchEventManager& operator =(const _TouchEventManager& rhs);
515 static _TouchEventManager* __pInstance;
516 unique_ptr<HashMapT<int, _ControlHandle> > __pTargetMap;
519 _TouchEventManager* _TouchEventManager::__pInstance = null;
525 _TouchEvent(int deviceId, _TouchStatus status, int x, int y, unsigned int timeStamp, const _Control* pRootControl)
526 : __pTouchEventManager(null)
528 __pTouchEventManager = _TouchEventManager::GetInstance();
529 SysTryReturnVoidResult(NID_UI, __pTouchEventManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
531 result r = E_SUCCESS;
532 Tizen::Graphics::Point current(x, y);
534 _TouchManager* pTouchManager = _TouchManager::GetInstance();
535 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
537 unsigned int pointId = 0;
539 if (status == _TOUCH_PRESSED)
541 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
542 SysTryReturnVoidResult(NID_UI, pFingerInfoList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
544 const int count = pFingerInfoList->GetCount();
546 for (int i = 0; i < count; i++)
548 _FingerInfo* pFingerInfo = null;
549 pFingerInfoList->GetAt(i, pFingerInfo);
550 if (pFingerInfo == null)
555 if (static_cast<int>(pFingerInfo->GetDeviceId()) == deviceId && pFingerInfo->GetStatus() == _TOUCH_PRESSED)
557 pTouchManager->ResetTouchInfo();
558 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pFingerInfo->GetPointId());
562 delete pFingerInfoList;
564 pointId = pTouchManager->GeneratePointId(deviceId);
565 SysSecureLog(NID_UI, "OnTouchPressed pointId = %d", pointId);
569 pointId = pTouchManager->GetPointId(deviceId);
572 if (status == _TOUCH_RELEASED)
574 SysSecureLog(NID_UI, "OnTouchReleased pointId = %d", pointId);
577 if (pointId == INVALID_POINT_ID)
579 if (status == _TOUCH_RELEASED)
581 _ControlManager* pControlManager = _ControlManager::GetInstance();
582 SysTryReturnVoidResult(NID_UI, pControlManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
584 _Window* pWindow = pControlManager->GetTouchedWindow();
587 _TouchManager* pTouchManager = _TouchManager::GetInstance();
590 pTouchManager->ResetTouchInfo();
591 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
595 SetLastResult(E_INVALID_CONDITION);
601 r = GetPosition(status, x, y, current);
602 SysTryReturnVoidResult(NID_UI, r != E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
603 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
607 current = _CoordinateSystemUtils::InverseTransform(current);
610 __touchInfo.SetTouchInfo(pointId, status, current, false, timeStamp);
612 if (status == _TOUCH_PRESSED)
614 _Control* pControl = GetTarget(current.x, current.y, pRootControl);
616 if (pControl == null)
618 pTouchManager->ResetTouchInfo();
619 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pointId);
620 SysTryReturnVoidResult(NID_UI, false, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
624 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
625 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
630 _Control* pControl = pTouchManager->GetChangedTouchableTarget();
631 if (pControl == null)
637 if (pControl->GetChangingEventTarget() == true && pControl->GetVisibleState() == true)
639 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
640 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
641 SysSecureLog(NID_UI, "touch_moved, touch_released : pointId = %d, AddControl = 0x%x", pointId, pControl);
647 virtual ~_TouchEvent(void)
652 virtual result SendImpl(void)
654 _Control* pTarget = __pTouchEventManager->GetControl(__touchInfo.GetPointId());
657 if (__touchInfo.GetTouchStatus() == _TOUCH_MOVED)
659 SysLog(NID_UI, "Target is null for the move event, skip sendImpl");
663 _TouchManager* pTouchManager = _TouchManager::GetInstance();
664 pTouchManager->SetTouchCanceled(null);
665 pTouchManager->ResetTouchInfo();
667 SysLog(NID_UI, "ResetTouchInfo");
671 _UiTouchEvent event(pTarget->GetHandle(), __touchInfo);
673 return _pEventManager->SendEvent(event);
677 _TouchEvent(const _TouchEvent& rhs);
678 _TouchEvent& operator =(const _TouchEvent& rhs);
680 _Control* GetTarget(int x, int y, const _Control* pRootControl) const
684 _TouchManager* pTouchManager = _TouchManager::GetInstance();
685 SysTryReturn(NID_UI, pTouchManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
687 _Control* pCapturedControl = pTouchManager->GetCapturedControl();
688 _Control* pControl = null;
690 if (pCapturedControl)
692 if (pTouchManager->IsCaptureAllowedOwnerBounds())
694 if (pTouchManager->IsCaptureAllowedOutOfBounds())
696 pControl = pCapturedControl;
699 _Window * pWindow = dynamic_cast<_Window*>(pCapturedControl);
702 _Control* pOwner = pWindow->GetOwner();
705 Tizen::Graphics::Rectangle ownerRc(pOwner->GetAbsoluteBounds());
706 if ((x >= ownerRc.x) && (x <= (ownerRc.x + ownerRc.width)) && (y >= ownerRc.y) && (y <= (ownerRc.y + ownerRc.height)))
713 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
714 if ((x >= rc.x) && (x <= (rc.x + rc.width)) && (y >= rc.y) && (y <= (rc.y + rc.height)))
716 pControl = pCapturedControl;
721 if (pTouchManager->IsCaptureAllowedOutOfBounds())
723 pControl = pCapturedControl;
727 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
729 if ((x < rc.x) || (x > (rc.x + rc.width)) || (y < rc.y) || (y > (rc.y + rc.height)))
731 pControl = pCapturedControl;
736 if (pControl != null)
742 _ControlManager* pControlManager = _ControlManager::GetInstance();
743 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
745 Tizen::Graphics::FloatPoint ptf(static_cast<float>(x), static_cast<float>(y));
747 _ControlVisualElement* pRootControlElement = null;
750 pRootControlElement = dynamic_cast<_ControlVisualElement*>(pRootControl->GetVisualElement());
754 _Window* pWindow = null;
755 pWindow = pControlManager->GetTouchedWindow();
756 SysTryReturn(NID_UI, pWindow, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
758 Rectangle winBounds = pWindow->GetBounds();
760 ptf.x = static_cast<float>(x - winBounds.x);
761 ptf.y = static_cast<float>(y - winBounds.y);
763 pRootControlElement = dynamic_cast <_ControlVisualElement*>(pWindow->GetVisualElement());
766 SysTryReturn(NID_UI, pRootControlElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
768 _ControlVisualElement* pControlVisualElement = pRootControlElement->GetControlChildAtPoint(ptf);
769 SysTryReturn(NID_UI, pControlVisualElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
771 pControl = static_cast <_Control*>(pControlVisualElement->GetUserData());
772 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
777 result GetPosition(_TouchStatus status, int x, int y, Point& point) const
779 result r = E_SUCCESS;
781 _ControlManager* pControlManager = _ControlManager::GetInstance();
782 SysTryReturn(NID_UI, pControlManager, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
784 _Window* pWindow = pControlManager->GetTouchedWindow();
787 _TouchManager* pTouchManager = _TouchManager::GetInstance();
790 pTouchManager->ResetTouchInfo();
791 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
794 SysTryReturn(NID_UI, pWindow, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
796 _RootVisualElement* pRootVE = pWindow->GetRootVisualElement();
797 SysTryReturn(NID_UI, pRootVE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
799 _EflLayer* pLayer = static_cast<_EflLayer*>(pRootVE->GetNativeLayer());
800 SysTryReturn(NID_UI, pLayer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
802 Ecore_Evas* pEE = pLayer->GetEcoreEvas();
803 SysTryReturn(NID_UI, pEE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
805 const int PORTRAIT = 0;
806 const int LANDSCAPE = 270;
807 const int PORTRAIT_REVERSE = 180;
808 const int LANDSCAPE_REVERSE = 90;
810 Dimension dimension = pControlManager->GetScreenSize();
811 Point output(_CoordinateSystemUtils::InverseTransform(point));
812 int rotation = ecore_evas_rotation_get(pEE);
823 point.y = dimension.width - output.x;
826 case PORTRAIT_REVERSE:
827 point.x = dimension.width - output.x;
828 point.y = dimension.height - output.y;
831 case LANDSCAPE_REVERSE:
832 point.x = dimension.height - output.y;
837 SysAssertf(0, "[E_SYSTEM][%d]", rotation);
846 _TouchInfo __touchInfo;
847 _TouchEventManager* __pTouchEventManager;
854 _MouseEvent(int deviceId, _TouchStatus status, int x, int y, int z, unsigned int buttons, unsigned int timeStamp, const _Control* pRootControl)
855 : __pTouchEventManager(null)
857 __pTouchEventManager = _TouchEventManager::GetInstance();
858 SysTryReturnVoidResult(NID_UI, __pTouchEventManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
860 result r = E_SUCCESS;
861 Tizen::Graphics::Point current(x, y);
863 _TouchManager* pTouchManager = _TouchManager::GetInstance();
864 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
866 unsigned int pointId = 0;
868 if (status == _TOUCH_PRESSED)
870 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
871 SysTryReturnVoidResult(NID_UI, pFingerInfoList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
873 const int count = pFingerInfoList->GetCount();
875 for (int i = 0; i < count; i++)
877 _FingerInfo* pFingerInfo = null;
878 pFingerInfoList->GetAt(i, pFingerInfo);
879 if (pFingerInfo == null)
884 if (static_cast<int>(pFingerInfo->GetDeviceId()) == deviceId && pFingerInfo->GetStatus() == _TOUCH_PRESSED)
886 pTouchManager->ResetTouchInfo();
887 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pFingerInfo->GetPointId());
891 delete pFingerInfoList;
893 pointId = pTouchManager->GeneratePointId(deviceId);
897 pointId = pTouchManager->GetPointId(deviceId);
900 if (pointId == INVALID_POINT_ID)
902 if (status == _TOUCH_RELEASED)
904 _ControlManager* pControlManager = _ControlManager::GetInstance();
905 SysTryReturnVoidResult(NID_UI, pControlManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
907 _Window* pWindow = pControlManager->GetTouchedWindow();
910 _TouchManager* pTouchManager = _TouchManager::GetInstance();
913 pTouchManager->ResetTouchInfo();
914 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
918 SetLastResult(E_INVALID_CONDITION);
924 r = GetPosition(status, x, y, current);
925 SysTryReturnVoidResult(NID_UI, r != E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
926 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
930 current = _CoordinateSystemUtils::InverseTransform(current);
933 __mouseInfo.SetTouchInfo(pointId, status, current, z, buttons, false, timeStamp);
935 if (status == _TOUCH_PRESSED)
937 _Control* pControl = GetTarget(current.x, current.y, pRootControl);
939 if (pControl == null)
941 pTouchManager->ResetTouchInfo();
942 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pointId);
943 SysTryReturnVoidResult(NID_UI, false, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
947 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
948 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
953 _Control* pControl = pTouchManager->GetChangedTouchableTarget();
954 if (pControl == null)
960 if (pControl->GetChangingEventTarget() == true && pControl->GetVisibleState() == true)
962 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
963 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
969 virtual ~_MouseEvent(void)
974 virtual result SendImpl(void)
976 _Control* pTarget = __pTouchEventManager->GetControl(__mouseInfo.GetPointId());
979 _TouchManager* pTouchManager = _TouchManager::GetInstance();
980 pTouchManager->ResetTouchInfo();
982 SysLog(NID_UI, "ResetTouchInfo");
986 _UiMouseEvent event(pTarget->GetHandle(), __mouseInfo);
988 return _pEventManager->SendEvent(event);
992 _MouseEvent(const _MouseEvent& rhs);
993 _MouseEvent& operator =(const _MouseEvent& rhs);
995 _Control* GetTarget(int x, int y, const _Control* pRootControl) const
999 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1000 SysTryReturn(NID_UI, pTouchManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1002 _Control* pCapturedControl = pTouchManager->GetCapturedControl();
1003 _Control* pControl = null;
1005 if (pCapturedControl)
1007 if (pTouchManager->IsCaptureAllowedOwnerBounds())
1009 if (pTouchManager->IsCaptureAllowedOutOfBounds())
1011 pControl = pCapturedControl;
1014 _Window * pWindow = dynamic_cast<_Window*>(pCapturedControl);
1017 _Control* pOwner = pWindow->GetOwner();
1020 Tizen::Graphics::Rectangle ownerRc(pOwner->GetAbsoluteBounds());
1021 if ((x >= ownerRc.x) && (x <= (ownerRc.x + ownerRc.width)) && (y >= ownerRc.y) && (y <= (ownerRc.y + ownerRc.height)))
1028 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
1029 if ((x >= rc.x) && (x <= (rc.x + rc.width)) && (y >= rc.y) && (y <= (rc.y + rc.height)))
1031 pControl = pCapturedControl;
1036 if (pTouchManager->IsCaptureAllowedOutOfBounds())
1038 pControl = pCapturedControl;
1042 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
1044 if ((x < rc.x) || (x > (rc.x + rc.width)) || (y < rc.y) || (y > (rc.y + rc.height)))
1046 pControl = pCapturedControl;
1051 if (pControl != null)
1057 _ControlManager* pControlManager = _ControlManager::GetInstance();
1058 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1060 Tizen::Graphics::FloatPoint ptf(static_cast<float>(x), static_cast<float>(y));
1062 _ControlVisualElement* pRootControlElement = null;
1065 pRootControlElement = dynamic_cast<_ControlVisualElement*>(pRootControl->GetVisualElement());
1069 _Window* pWindow = null;
1070 pWindow = pControlManager->GetTouchedWindow();
1071 SysTryReturn(NID_UI, pWindow, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1073 Rectangle winBounds = pWindow->GetBounds();
1075 ptf.x = static_cast<float>(x - winBounds.x);
1076 ptf.y = static_cast<float>(y - winBounds.y);
1078 pRootControlElement = dynamic_cast <_ControlVisualElement*>(pWindow->GetVisualElement());
1081 SysTryReturn(NID_UI, pRootControlElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1083 _ControlVisualElement* pControlVisualElement = pRootControlElement->GetControlChildAtPoint(ptf);
1084 SysTryReturn(NID_UI, pControlVisualElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1086 pControl = static_cast <_Control*>(pControlVisualElement->GetUserData());
1087 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1092 result GetPosition(_TouchStatus status, int x, int y, Point& point) const
1094 result r = E_SUCCESS;
1096 _ControlManager* pControlManager = _ControlManager::GetInstance();
1097 SysTryReturn(NID_UI, pControlManager, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1099 _Window* pWindow = pControlManager->GetTouchedWindow();
1100 if (pWindow == null)
1102 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1105 pTouchManager->ResetTouchInfo();
1106 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
1109 SysTryReturn(NID_UI, pWindow, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
1111 _RootVisualElement* pRootVE = pWindow->GetRootVisualElement();
1112 SysTryReturn(NID_UI, pRootVE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1114 _EflLayer* pLayer = static_cast<_EflLayer*>(pRootVE->GetNativeLayer());
1115 SysTryReturn(NID_UI, pLayer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1117 Ecore_Evas* pEE = pLayer->GetEcoreEvas();
1118 SysTryReturn(NID_UI, pEE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1120 const int PORTRAIT = 0;
1121 const int LANDSCAPE = 270;
1122 const int PORTRAIT_REVERSE = 180;
1123 const int LANDSCAPE_REVERSE = 90;
1125 Dimension dimension = pControlManager->GetScreenSize();
1126 Point output(_CoordinateSystemUtils::InverseTransform(point));
1127 int rotation = ecore_evas_rotation_get(pEE);
1138 point.y = dimension.width - output.x;
1141 case PORTRAIT_REVERSE:
1142 point.x = dimension.width - output.x;
1143 point.y = dimension.height - output.y;
1146 case LANDSCAPE_REVERSE:
1147 point.x = dimension.height - output.y;
1152 SysAssertf(0, "[E_SYSTEM][%d]", rotation);
1161 _MouseInfo __mouseInfo;
1162 _TouchEventManager* __pTouchEventManager;
1166 OnNotified(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1170 _UiEvent* pUiEvent = static_cast <_UiEvent*>(pEventInfo);
1171 SysTryReturn(NID_UI, pUiEvent, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1173 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
1174 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1176 result r = pEventManager->SendEvent(*pUiEvent);
1177 SysTryReturn(NID_UI, r == E_SUCCESS, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1180 SetLastResult(E_SUCCESS);
1182 return ECORE_CALLBACK_PASS_ON;
1186 FreeEvent(void* pData __UNUSED__, void* pEventInfo)
1188 _UiEvent* pUiEvent = static_cast <_UiEvent*>(pEventInfo);
1196 OnKeyPressed(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1198 Ecore_Event_Key* pEv = static_cast <Ecore_Event_Key*>(pEventInfo);
1199 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1201 if (_KeyEvent::GetKeyCode(pEv->keyname) == _KEY_INVALID)
1203 SysLog(NID_UI, "KeyCode %s is invalid", pEv->keyname);
1204 return ECORE_CALLBACK_PASS_ON;
1207 _KeyEvent event(KEY_PRESSED, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers), pEv);
1208 result r = GetLastResult();
1211 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1212 return ECORE_CALLBACK_PASS_ON;
1214 SysSecureLog(NID_UI, "KeyName = %s, KeyCode = %d, KeyModifier = %x", pEv->keyname, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers));
1217 keyPressed[_KeyEvent::GetKeyCode(pEv->keyname)] = true;
1219 SetLastResult(E_SUCCESS);
1221 return ECORE_CALLBACK_PASS_ON;
1225 OnKeyReleased(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1227 Ecore_Event_Key* pEv = static_cast <Ecore_Event_Key*>(pEventInfo);
1228 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1230 if (_KeyEvent::GetKeyCode(pEv->keyname) == _KEY_INVALID)
1232 SysLog(NID_UI, "KeyCode %s is invalid", pEv->keyname);
1233 return ECORE_CALLBACK_PASS_ON;
1236 if (keyPressed[_KeyEvent::GetKeyCode(pEv->keyname)] != true)
1238 SysLog(NID_UI, "KeyCode %s is not pressed", pEv->keyname);
1239 return ECORE_CALLBACK_PASS_ON;
1242 _KeyEvent event(KEY_RELEASED, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers), pEv);
1243 result r = GetLastResult();
1246 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1247 return ECORE_CALLBACK_PASS_ON;
1249 SysSecureLog(NID_UI, "KeyName = %s, KeyCode = %d, KeyModifier = %x", pEv->keyname, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers));
1252 keyPressed[_KeyEvent::GetKeyCode(pEv->keyname)] = false;
1254 SetLastResult(E_SUCCESS);
1256 return ECORE_CALLBACK_PASS_ON;
1260 OnClipboardMessageReceived(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1262 Ecore_X_Event_Client_Message *pEv = static_cast<Ecore_X_Event_Client_Message*>(pEventInfo);
1264 if (pEv->message_type != ecore_x_atom_get("CBHM_MSG"))
1266 return ECORE_CALLBACK_PASS_ON;
1269 if (!strcmp("SET_OWNER", pEv->data.b))
1271 _KeyEvent event(KEY_PRESSED, _KEY_OEM_1, 0, pEv);
1272 SysSecureLog(NID_UI, "KeyName = clipboard, KeyCode = _KEY_OEM_1, KeyModifier = 0");
1275 SetLastResult(E_SUCCESS);
1278 return ECORE_CALLBACK_PASS_ON;
1283 OnTouchPressed(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1285 Ecore_Event_Mouse_Button* pEv = static_cast <Ecore_Event_Mouse_Button*>(pEventInfo);
1286 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1288 SysSecureLog(NID_UI, "OnTouchPressed - x(%d), y(%d), deviceId(%d), buttons(%d)", pEv->root.x, pEv->root.y, pEv->multi.device, pEv->buttons);
1290 _ControlManager* pControlManager = _ControlManager::GetInstance();
1291 SysTryReturn(NID_UI, pControlManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1293 pControlManager->SetTouchedWindow((unsigned int)pEv->window);
1295 if (touchPressed[pEv->multi.device] == true)
1297 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1300 pTouchManager->SetTouchCanceled(null);
1301 SysLog(NID_UI, "pWindow is null, CancelTouch");
1303 for(int i=0; i<DEVICE_COUNT; i++)
1305 touchPressed[i] = false;
1308 pTouchManager->ResetTouchInfo();
1309 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
1313 touchPressed[pEv->multi.device] = true;
1315 if (pEv->buttons == _MOUSE_BUTTON_LEFT || pEv->buttons == _MOUSE_BUTTON_NONE)
1317 _TouchEvent event(pEv->multi.device, _TOUCH_PRESSED, pEv->root.x, pEv->root.y, pEv->timestamp, null);
1319 result r = GetLastResult();
1322 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1323 return ECORE_CALLBACK_PASS_ON;
1330 //_MouseEvent event(pEv->multi.device, _TOUCH_PRESSED, pEv->root.x, pEv->root.y, 0, pEv->buttons, pEv->timestamp, null);
1331 _MouseEvent event(pEv->multi.device, _TOUCH_PRESSED, pEv->root.x, pEv->root.y, 0, _MOUSE_BUTTON_RIGHT, pEv->timestamp, null);
1333 result r = GetLastResult();
1336 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1337 return ECORE_CALLBACK_PASS_ON;
1342 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
1343 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1345 pEventManager->GenerateKeyEvent(KEY_PRESSED, _KEY_OEM_2, _KEY_MODIFIER_NONE, false);
1346 pEventManager->GenerateKeyEvent(KEY_RELEASED, _KEY_OEM_2, _KEY_MODIFIER_NONE, false);
1349 SetLastResult(E_SUCCESS);
1351 return ECORE_CALLBACK_PASS_ON;
1355 OnTouchReleased(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1357 Ecore_Event_Mouse_Button* pEv = static_cast <Ecore_Event_Mouse_Button*>(pEventInfo);
1358 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1360 SysSecureLog(NID_UI, "OnTouchReleased - x(%d), y(%d), deviceId(%d) buttons(%d)", pEv->root.x, pEv->root.y, pEv->multi.device, pEv->buttons);
1362 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1363 SysTryReturn(NID_UI, pTouchManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] _TouchManager does not exist.");
1365 touchPressed[pEv->multi.device] = false;
1367 if (pEv->buttons == _MOUSE_BUTTON_LEFT || pEv->buttons == _MOUSE_BUTTON_NONE)
1369 _TouchEvent event(pEv->multi.device, _TOUCH_RELEASED, pEv->root.x, pEv->root.y, pEv->timestamp, null);
1371 result r = GetLastResult();
1374 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1375 return ECORE_CALLBACK_PASS_ON;
1382 //_MouseEvent event(pEv->multi.device, _TOUCH_RELEASED, pEv->root.x, pEv->root.y, 0, pEv->buttons, pEv->timestamp, null);
1383 _MouseEvent event(pEv->multi.device, _TOUCH_RELEASED, pEv->root.x, pEv->root.y, 0, _MOUSE_BUTTON_RIGHT, pEv->timestamp, null);
1386 result r = GetLastResult();
1389 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1390 return ECORE_CALLBACK_PASS_ON;
1395 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1398 pTouchManager->ResetTouchInfo();
1399 SysLog(NID_UI, "ResetTouchInfo");
1403 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
1404 SysTryReturn(NID_UI, pFingerInfoList, ECORE_CALLBACK_PASS_ON, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1406 int count = pFingerInfoList->GetCount();
1408 for (int i = 0; i < count; i++)
1410 _FingerInfo* pFingerInfo = null;
1411 pFingerInfoList->GetAt(i, pFingerInfo);
1412 if (pFingerInfo == null)
1417 if (static_cast<int>(pFingerInfo->GetDeviceId()) == pEv->multi.device)
1419 pFingerInfo->SetPointId(INVALID_POINT_ID);
1423 delete pFingerInfoList;
1425 pTouchManager->SetChangedTouchableTarget(null);
1427 SetLastResult(E_SUCCESS);
1428 return ECORE_CALLBACK_PASS_ON;
1432 OnTouchMoved(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1434 Ecore_Event_Mouse_Move* pEv = static_cast <Ecore_Event_Mouse_Move*>(pEventInfo);
1435 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1437 //SysSecureLog(NID_UI, "OnTouchMoved - x(%d), y(%d), deviceId(%d)", pEv->root.x, pEv->root.y, pEv->multi.device);
1438 _TouchEvent event(pEv->multi.device, _TOUCH_MOVED, pEv->root.x, pEv->root.y, pEv->timestamp, null);
1440 result r = GetLastResult();
1443 return ECORE_CALLBACK_PASS_ON;
1448 SetLastResult(E_SUCCESS);
1450 return ECORE_CALLBACK_PASS_ON;
1454 OnMouseWheeled(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1456 _Ecore_Event_Mouse_Wheel* pEv = static_cast <_Ecore_Event_Mouse_Wheel*>(pEventInfo);
1457 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1459 SysSecureLog(NID_UI, "OnMouseWheeled - x(%d), y(%d), z(%d)", pEv->root.x, pEv->root.y, pEv->z);
1460 _MouseEvent event(0, _WHEEL_MOVED, pEv->root.x, pEv->root.y, pEv->z, _MOUSE_BUTTON_NONE, pEv->timestamp, null);
1462 result r = GetLastResult();
1465 return ECORE_CALLBACK_PASS_ON;
1470 SetLastResult(E_SUCCESS);
1472 return ECORE_CALLBACK_PASS_ON;
1476 OnKeyboardInserted(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1478 Ecore_X_Event_Window_Property *pEv = static_cast <Ecore_X_Event_Window_Property*>(pEventInfo);
1479 if ( pEv->atom != keyboardExist)
1481 // SysLog(NID_UI, "OnKeyboardInserted - atom of event(%d), keyboardExist(%d)", pEv->atom, keyboardExist);
1482 return ECORE_CALLBACK_PASS_ON;
1485 ArrayList* pArgs = null;
1486 result r = E_SUCCESS;
1487 Boolean* pIsKeyboardOn = null;
1488 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
1489 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1491 _Control* pControl = _ControlManager::GetInstance()->GetFocusControl();
1492 SysTryReturn(NID_UI, pControl, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1494 bool isKeyboardOn = false;
1495 unsigned int value = 0;
1496 int returnResult = -1;
1498 returnResult = ecore_x_window_prop_card32_get(pEv->win, keyboardExist, &value, 1);
1503 isKeyboardOn = true;
1506 pArgs = new (std::nothrow) ArrayList;
1507 SysTryReturn(NID_UI, pArgs, ECORE_CALLBACK_PASS_ON, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1509 r = pArgs->Construct();
1510 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1512 String* pString = new (std::nothrow) String(KEYBOARD_INSERTED_EVENT);
1513 r = pArgs->Add(*pString);
1514 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1516 pIsKeyboardOn = new (std::nothrow) Boolean(isKeyboardOn);
1517 r = pArgs->Add(*pIsKeyboardOn);
1518 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1520 _UiNotificationEvent event(pControl->GetHandle(), pArgs);
1521 r = pEventManager->SendEvent(event);
1522 // SysLog(NID_UI, "OnKeyboardInserted - sent keyboard inserted noti");
1527 return ECORE_CALLBACK_PASS_ON;
1537 delete pIsKeyboardOn;
1540 return ECORE_CALLBACK_PASS_ON;
1544 OnWindowFocusIn(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1546 SysLog(NID_UI, "Enter");
1548 Ecore_X_Event_Window_Focus_In* pEv = static_cast<Ecore_X_Event_Window_Focus_In*>(pEventInfo);
1549 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1551 _ControlManager* pControlManager = _ControlManager::GetInstance();
1552 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1554 int count = pControlManager->GetWindowCount();
1556 _Control* pFocusedControl = null;
1557 for (int i = count - 1; i >= 0; --i)
1559 _Window* pWindow = pControlManager->GetWindow(i);
1562 NativeWindowHandle nativeWindowHandle = pWindow->GetNativeHandle();
1563 if (pEv->win == nativeWindowHandle)
1565 pFocusedControl = pWindow->GetCurrentFocusControl();
1567 if (pFocusedControl)
1569 pFocusedControl->SetFocused();
1575 _AccessibilityManager::GetInstance()->RequestAutoReading(_ACCESSIBILITY_AUTO_READING_MODE_FIRST_ITEM);
1576 return ECORE_CALLBACK_PASS_ON;
1580 OnWindowFocusOut(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1582 SysLog(NID_UI, "Enter");
1584 Ecore_X_Event_Window_Focus_Out* pEv = static_cast<Ecore_X_Event_Window_Focus_Out*>(pEventInfo);
1585 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1587 _ControlManager* pControlManager = _ControlManager::GetInstance();
1588 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1590 _Control* pFocusedControl = pControlManager->GetFocusControl();
1591 if (pFocusedControl)
1593 _Window* pRootWindow = pFocusedControl->GetRootWindow();
1596 NativeWindowHandle nativeWindowHandle = pRootWindow->GetNativeHandle();
1597 if (pEv->win == nativeWindowHandle)
1599 pControlManager->TakeFocusFromControl(*pFocusedControl);
1603 _AccessibilityManager::GetInstance()->RequestAutoReading(_ACCESSIBILITY_AUTO_READING_MODE_RESET);
1604 return ECORE_CALLBACK_PASS_ON;
1609 OnEvasKeyPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1611 Evas_Event_Key_Down* pEv = static_cast <Evas_Event_Key_Down*>(pEventInfo);
1612 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1614 SetLastResult(E_SUCCESS);
1618 OnEvasKeyReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1620 Evas_Event_Key_Up* pEv = static_cast <Evas_Event_Key_Up*>(pEventInfo);
1621 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1623 SetLastResult(E_SUCCESS);
1627 OnEvasTouchPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1629 Evas_Event_Mouse_Down* pEv = static_cast <Evas_Event_Mouse_Down*>(pEventInfo);
1630 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1632 _Control* pControl = static_cast<_Control*>(pData);
1633 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1635 if (evasTouchPressed == true)
1637 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1640 pTouchManager->SetTouchCanceled(null);
1641 SysLog(NID_UI, "pWindow is null, CancelTouch");
1643 evasTouchPressed = false;
1644 pTouchManager->ResetTouchInfo();
1645 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
1649 evasTouchPressed = true;
1651 SysSecureLog(NID_UI, "OnEvasTouchPressed - x(%d), y(%d)", pEv->canvas.x, pEv->canvas.y);
1652 _TouchEvent event(0, _TOUCH_PRESSED, pEv->canvas.x, pEv->canvas.y, pEv->timestamp, pControl);
1654 result r = GetLastResult();
1657 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1663 SetLastResult(E_SUCCESS);
1667 OnEvasTouchReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1669 Evas_Event_Mouse_Up* pEv = static_cast <Evas_Event_Mouse_Up*>(pEventInfo);
1670 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1672 _Control* pControl = static_cast<_Control*>(pData);
1673 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1675 evasTouchPressed = false;
1677 SysSecureLog(NID_UI, "OnEvasTouchReleased - x(%d), y(%d)", pEv->canvas.x, pEv->canvas.y);
1678 _TouchEvent event(0, _TOUCH_RELEASED, pEv->canvas.x, pEv->canvas.y, pEv->timestamp, pControl);
1680 result r = GetLastResult();
1683 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1689 SetLastResult(E_SUCCESS);
1693 OnEvasTouchMoved(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1695 Evas_Event_Mouse_Move* pEv = static_cast <Evas_Event_Mouse_Move*>(pEventInfo);
1696 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1698 _Control* pControl = static_cast<_Control*>(pData);
1699 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1701 SysSecureLog(NID_UI, "OnEvasTouchMoved - x(%d), y(%d)", pEv->cur.canvas.x, pEv->cur.canvas.x);
1702 _TouchEvent event(0, _TOUCH_MOVED, pEv->cur.canvas.x, pEv->cur.canvas.y, pEv->timestamp, pControl);
1704 result r = GetLastResult();
1707 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1713 SetLastResult(E_SUCCESS);
1717 OnEvasMultiTouchPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1719 Evas_Event_Multi_Down* pEv = static_cast <Evas_Event_Multi_Down*>(pEventInfo);
1720 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1722 SetLastResult(E_SUCCESS);
1726 OnEvasMultiTouchReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1728 Evas_Event_Multi_Up* pEv = static_cast <Evas_Event_Multi_Up*>(pEventInfo);
1729 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1731 SetLastResult(E_SUCCESS);
1735 OnEvasMultiTouchMoved(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1737 Evas_Event_Multi_Move* pEv = static_cast <Evas_Event_Multi_Move*>(pEventInfo);
1738 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1740 SetLastResult(E_SUCCESS);
1745 namespace Tizen { namespace Ui
1748 _EflUiEventManager::_EflUiEventManager(void)
1749 : __notificaitonEventType(-1)
1751 unique_ptr<LinkedListT<Ecore_Event_Handler*> > pEventHandlers(new (std::nothrow) LinkedListT<Ecore_Event_Handler*>);
1752 SysTryReturnVoidResult(NID_UI, pEventHandlers, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
1755 __notificaitonEventType = ecore_event_type_new();
1756 SysTryReturnVoidResult(NID_UI, __notificaitonEventType >= 1, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1758 Ecore_Event_Handler* pEventHandler = ecore_event_handler_add(__notificaitonEventType, OnNotified, null);
1759 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1761 pEventHandlers->Add(pEventHandler);
1764 pEventHandler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, OnKeyPressed, null);
1765 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1767 pEventHandlers->Add(pEventHandler);
1769 pEventHandler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, OnKeyReleased, null);
1770 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1772 pEventHandlers->Add(pEventHandler);
1775 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, OnClipboardMessageReceived, null);
1776 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1778 pEventHandlers->Add(pEventHandler);
1781 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, OnTouchPressed, null);
1782 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1784 pEventHandlers->Add(pEventHandler);
1786 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, OnTouchReleased, null);
1787 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1789 pEventHandlers->Add(pEventHandler);
1791 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, OnTouchMoved, null);
1792 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1794 pEventHandlers->Add(pEventHandler);
1797 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, OnKeyboardInserted, null);
1798 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1800 pEventHandlers->Add(pEventHandler);
1803 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, OnWindowFocusIn, null);
1804 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1806 pEventHandlers->Add(pEventHandler);
1808 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, OnWindowFocusOut, null);
1809 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1811 pEventHandlers->Add(pEventHandler);
1813 __pEventHandlers = move(pEventHandlers);
1815 keyboardExist = XInternAtom(static_cast<Display*>(ecore_x_display_get()), "X External Keyboard Exist", 0);
1817 SetLastResult(E_SUCCESS);
1820 _EflUiEventManager::~_EflUiEventManager(void)
1822 Tizen::Base::Collection::IEnumeratorT<Ecore_Event_Handler*>* pEnumerator = __pEventHandlers->GetEnumeratorN();
1823 SysTryReturnVoidResult(NID_UI, pEnumerator, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
1825 while (pEnumerator->MoveNext() == E_SUCCESS)
1827 Ecore_Event_Handler* pEventHandler = null;
1828 pEnumerator->GetCurrent(pEventHandler);
1831 ecore_event_handler_del(pEventHandler);
1839 _EflUiEventManager::RegisterKeyEventHandler(const _Control& control)
1841 result r = E_SUCCESS;
1843 Evas_Object* pEvasObject = GetEvasObject(control);
1844 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1846 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_KEY_UP, OnEvasKeyReleased, &control);
1847 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_KEY_DOWN, OnEvasKeyPressed, &control);
1853 _EflUiEventManager::RegisterTouchEventHandler(const _Control& control)
1855 result r = E_SUCCESS;
1857 Evas_Object* pEvasObject = GetEvasObject(control);
1858 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1860 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MOUSE_UP, OnEvasTouchReleased, &control);
1861 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MOUSE_DOWN, OnEvasTouchPressed, &control);
1862 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MOUSE_MOVE, OnEvasTouchMoved, &control);
1864 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MULTI_UP, OnEvasMultiTouchReleased, &control);
1865 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MULTI_DOWN, OnEvasMultiTouchPressed, &control);
1866 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MULTI_MOVE, OnEvasMultiTouchMoved, &control);
1872 _EflUiEventManager::UnregisterKeyEventHandler(const _Control& control)
1874 result r = E_SUCCESS;
1876 Evas_Object* pEvasObject = GetEvasObject(control);
1877 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1879 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_KEY_UP, OnEvasKeyReleased);
1880 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_KEY_DOWN, OnEvasKeyPressed);
1886 _EflUiEventManager::UnregisterTouchEventHandler(const _Control& control)
1888 result r = E_SUCCESS;
1890 Evas_Object* pEvasObject = GetEvasObject(control);
1891 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1893 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MOUSE_UP, OnEvasTouchReleased);
1894 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MOUSE_DOWN, OnEvasTouchPressed);
1895 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MOUSE_MOVE, OnEvasTouchMoved);
1897 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MULTI_UP, OnEvasMultiTouchReleased);
1898 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MULTI_DOWN, OnEvasMultiTouchPressed);
1899 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MULTI_MOVE, OnEvasMultiTouchMoved);
1905 _EflUiEventManager::PostEvent(const _UiEvent& event)
1909 result r = E_SUCCESS;
1911 _UiEvent* pEvent = event.CloneN();
1912 SysTryReturn(NID_UI, pEvent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1914 Ecore_Event* pEcoreEvent = ecore_event_add(__notificaitonEventType, pEvent, FreeEvent, null);
1915 SysTryReturn(NID_UI, pEcoreEvent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");