2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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>
29 #include <FBaseColIEnumeratorT.h>
30 #include <FBaseSysLog.h>
31 #include "FUi_CoordinateSystemUtils.h"
32 #include "FUi_Control.h"
33 #include "FUi_ControlManager.h"
34 #include "FUi_KeyEventManager.h"
35 #include "FUi_Window.h"
36 #include "FUi_UiEventManager.h"
37 #include "FUi_EflUiEventManager.h"
38 #include "FUi_UiTouchEvent.h"
39 #include "FUi_UiNotificationEvent.h"
40 #include "FUi_UiKeyEvent.h"
41 #include "FUi_UiFocusEvent.h"
42 #include "FUi_EcoreEvasMgr.h"
43 #include "FUi_EcoreEvas.h"
44 #include "FUi_TouchManager.h"
45 #include "FUiAnim_EflNode.h"
46 #include "FUiAnim_ControlVisualElement.h"
47 #if defined(MULTI_WINDOW)
48 #include "FUiAnim_RootVisualElement.h"
49 #include "FUiAnim_EflLayer.h"
53 using namespace Tizen::Ui;
54 using namespace Tizen::Ui::Animations;
55 using namespace Tizen::Graphics;
56 using namespace Tizen::Base::Collection;
57 using namespace Tizen::Base;
63 bool isPressed = false;
64 Ecore_X_Atom keyboardExist = 0;
65 const wchar_t* KEYBOARD_INSERTED_EVENT = L"KEYBOARD_INSERTED";
68 GetEvasObject(const _Control& control)
70 _VisualElement* pVisualElement = control.GetVisualElement();
71 SysTryReturn(NID_UI, pVisualElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
73 _EflNode* pEflNode = dynamic_cast<_EflNode*>(pVisualElement->GetNativeNode());
74 SysTryReturn(NID_UI, pEflNode, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
76 return (Evas_Object*)pEflNode->GetGroupContainer();
80 GetEvas(const _Control& control)
83 Evas_Object* pEvasObject = GetEvasObject(control);
86 pEvas = evas_object_evas_get(pEvasObject);
87 SysTryReturn(NID_UI, pEvas, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
97 : _pEventManager(null)
99 _pEventManager = _UiEventManager::GetInstance();
100 SysTryReturnVoidResult(NID_UI, _pEventManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
102 SetLastResult(E_SUCCESS);
105 virtual ~_Event(void)
110 _Event(const _Event& rhs);
111 _Event& operator =(const _Event& rhs);
113 virtual result SendImpl(void) = 0;
122 _UiEventManager* _pEventManager;
125 struct _EvasConvertKeys
131 const _EvasConvertKeys keyTable[] =
133 { _KEY_SIDE_UP, "XF86AudioRaiseVolume" },
134 { _KEY_SIDE_DOWN, "XF86AudioLowerVolume" },
135 { _KEY_END, "XF86Stop" },
136 { _KEY_ENTER, "Return" },
137 { _KEY_BACKSPACE, "BackSpace" },
138 { _KEY_NUM_LEFT, "KP_Left"},
139 { _KEY_NUM_UP, "KP_Up"},
140 { _KEY_NUM_DOWN, "KP_Down"},
141 { _KEY_NUM_RIGHT, "KP_Right"},
142 { _KEY_LEFT, "Left" },
144 { _KEY_DOWN, "Down"},
145 { _KEY_RIGHT, "Right"},
182 { _KEY_COMMA, "comma"},
183 { _KEY_CAPSLOCK, "Caps_Lock"},
184 { _KEY_ALT, "Alt_L"},
185 { _KEY_ALT, "Alt_R"},
186 { _KEY_SPACE, "space"},
192 { _KEY_CLEAR, "BackSpace"},
193 { _KEY_POWER_HOLD, "XF86PowerOff"},
194 { _KEY_DELETE, "Delete"},
195 { _KEY_DELETE, "KP_Delete"},
196 { _KEY_CTRL_L, "XK_Control_L"},
197 { _KEY_CTRL_L, "Control_L"},
198 { _KEY_CTRL_R, "XK_Control_R"},
199 { _KEY_CTRL_R, "Control_R"},
200 { _KEY_SHIFT_L, "XK_Shift_L"},
201 { _KEY_SHIFT_L, "Shift_L"},
202 { _KEY_SHIFT_R, "XK_Shift_R"},
203 { _KEY_SHIFT_R, "Shift_R"},
210 _KeyEvent(KeyState keyState, _KeyCode keyCode, int keyModifier, void* pUserData)
212 , __keyInfo(keyState, keyCode, keyModifier, pUserData)
214 __pTarget = GetTarget(keyCode);
217 virtual ~_KeyEvent(void)
221 static _KeyCode GetKeyCode(const char* pKeyName)
225 SysTryReturn(NID_UI, pKeyName, _KEY_INVALID, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
227 for (unsigned int i = 0; i < sizeof(keyTable) / sizeof(_EvasConvertKeys); ++i)
229 if (strcmp(keyTable[i].pName, pKeyName) == 0)
231 return keyTable[i].code;
238 static int GetKeyModifier(const int keyModifier)
241 unsigned int modifier = _KEY_MODIFIER_NONE;
243 if(ECORE_EVENT_MODIFIER_SHIFT & keyModifier)
245 modifier |= _KEY_MODIFIER_SHIFT;
247 if(ECORE_EVENT_MODIFIER_CTRL & keyModifier)
249 modifier |= _KEY_MODIFIER_CTRL;
251 if(ECORE_EVENT_MODIFIER_ALT & keyModifier)
253 modifier |= _KEY_MODIFIER_ALT;
255 if(ECORE_EVENT_MODIFIER_WIN & keyModifier)
257 modifier |= _KEY_MODIFIER_WIN;
259 if(ECORE_EVENT_MODIFIER_SCROLL & keyModifier)
261 modifier |= _KEY_MODIFIER_SCROLL;
263 if(ECORE_EVENT_MODIFIER_NUM & keyModifier)
265 modifier |= _KEY_MODIFIER_NUM;
267 if(ECORE_EVENT_MODIFIER_CAPS & keyModifier)
269 modifier |= _KEY_MODIFIER_CAPS;
271 if(ECORE_EVENT_LOCK_SCROLL & keyModifier)
273 modifier |= _KEY_LOCK_SCROLL;
275 if(ECORE_EVENT_LOCK_NUM & keyModifier)
277 modifier |= _KEY_LOCK_NUM;
279 if(ECORE_EVENT_LOCK_CAPS & keyModifier)
281 modifier |= _KEY_LOCK_CAPS;
283 if(ECORE_EVENT_LOCK_SHIFT & keyModifier)
285 modifier |= _KEY_LOCK_SHIFT;
287 if(ECORE_EVENT_MODIFIER_ALTGR & keyModifier)
289 modifier |= _KEY_MODIFIER_ALTGR;
296 _KeyEvent(const _KeyEvent& rhs);
297 _KeyEvent& operator =(const _KeyEvent& rhs);
299 virtual result SendImpl(void)
301 SysTryReturn(NID_UI, __pTarget, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
303 _UiKeyEvent event(__pTarget->GetHandle(), __keyInfo);
305 return _pEventManager->SendEvent(event);
308 _Control* GetTarget(_KeyCode keyCode) const
310 _KeyEventManager* pKeyEventManager = _KeyEventManager::GetInstance();
311 SysTryReturn(NID_UI, pKeyEventManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
313 _Control* pControl = pKeyEventManager->GetCapturingControl(keyCode);
315 if (pControl == null)
317 _ControlManager* pControlManager = _ControlManager::GetInstance();
318 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
320 pControl = pControlManager->GetFocusedControl();
324 pControl = pControlManager->GetCurrentFrame();
326 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
329 _ControlManager* pControlManager = _ControlManager::GetInstance();
330 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
332 pControl = pControlManager->GetFocusedControl();
335 pControl = pControlManager->GetCurrentFrame();
337 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
339 SetLastResult(E_SUCCESS);
349 class _TouchEventManager
352 static _TouchEventManager* GetInstance(void)
354 if (__pInstance == null)
356 __pInstance = new (std::nothrow) _TouchEventManager;
357 SysTryReturn(NID_UI, __pInstance, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
360 SetLastResult(E_SUCCESS);
365 result AddControl(int pointId, const _ControlHandle& controlHandle)
368 result r = E_SUCCESS;
370 __pTargetMap->ContainsKey(pointId, exist);
374 r = __pTargetMap->Remove(pointId);
375 SysTryReturnResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
378 r = __pTargetMap->Add(pointId, controlHandle);
379 SysTryReturnResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
384 _Control* GetControl(int pointId)
386 SysTryReturn(NID_UI, __pTargetMap, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
388 _ControlHandle controlHandle;
390 __pTargetMap->GetValue(pointId, controlHandle);
392 _ControlManager* pControlManager = _ControlManager::GetInstance();
393 result r = GetLastResult();
394 SysTryReturn(NID_UI, pControlManager, null, r, "[%s] Propagating.", GetErrorMessage(r));
396 return pControlManager->GetObject(controlHandle);
400 _TouchEventManager(void)
402 unique_ptr<HashMapT<int, _ControlHandle> > pTargetMap(new (std::nothrow) HashMapT<int, _ControlHandle>);
403 SysTryReturnVoidResult(NID_UI, pTargetMap, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
405 result r = pTargetMap->Construct();
406 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
408 __pTargetMap = move(pTargetMap);
410 SetLastResult(E_SUCCESS);
413 ~_TouchEventManager(void)
417 _TouchEventManager(const _TouchEventManager& rhs);
418 _TouchEventManager& operator =(const _TouchEventManager& rhs);
421 static _TouchEventManager* __pInstance;
422 unique_ptr<HashMapT<int, _ControlHandle> > __pTargetMap;
425 _TouchEventManager* _TouchEventManager::__pInstance = null;
431 _TouchEvent(int deviceId, _TouchStatus status, int x, int y, unsigned int timeStamp, const _Control* pRootControl)
432 : __pTouchEventManager(null)
434 __pTouchEventManager = _TouchEventManager::GetInstance();
435 SysTryReturnVoidResult(NID_UI, __pTouchEventManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
437 result r = E_SUCCESS;
438 Tizen::Graphics::Point current(x, y);
440 _TouchManager* pTouchManager = _TouchManager::GetInstance();
441 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
443 unsigned int pointId = 0;
445 if (status == _TOUCH_PRESSED)
447 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
448 SysTryReturnVoidResult(NID_UI, pFingerInfoList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
450 const int count = pFingerInfoList->GetCount();
452 for (int i = 0; i < count; i++)
454 _FingerInfo* pFingerInfo = null;
455 pFingerInfoList->GetAt(i, pFingerInfo);
456 if (pFingerInfo == null)
461 if (pFingerInfo->GetDeviceId() == deviceId && pFingerInfo->GetStatus() == _TOUCH_PRESSED)
463 pTouchManager->ResetTouchInfo();
464 SysLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pFingerInfo->GetPointId());
468 delete pFingerInfoList;
470 pointId = pTouchManager->GeneratePointId(deviceId);
474 pointId = pTouchManager->GetPointId(deviceId);
477 SysTryReturnVoidResult(NID_UI, pointId != INVALID_POINT_ID, E_INVALID_CONDITION, "[E_INVALID_CONDITION] pointId is invalid.");
481 r = GetPosition(status, x, y, current);
482 #if defined(MULTI_WINDOW)
483 SysTryReturnVoidResult(NID_UI, r != E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
485 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
489 current = _CoordinateSystemUtils::InverseTransform(current);
492 __touchInfo.SetTouchInfo(pointId, status, current, false, timeStamp);
494 if (status == _TOUCH_PRESSED)
496 _Control* pControl = GetTarget(current.x, current.y, pRootControl);
498 if (pControl == null)
500 pTouchManager->ResetTouchInfo();
501 SysLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pointId);
506 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
507 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
512 _Control* pControl = GetTarget(current.x, current.y, pRootControl);
513 if (pControl == null)
519 if (pControl != null && pControl->GetChangingEventTarget() == true)
521 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
522 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
528 virtual ~_TouchEvent(void)
533 virtual result SendImpl(void)
535 _Control* pTarget = __pTouchEventManager->GetControl(__touchInfo.GetPointId());
538 _TouchManager* pTouchManager = _TouchManager::GetInstance();
539 pTouchManager->ResetTouchInfo();
541 SysLog(NID_UI, "ResetTouchInfo");
545 _UiTouchEvent event(pTarget->GetHandle(), __touchInfo);
547 return _pEventManager->SendEvent(event);
551 _TouchEvent(const _TouchEvent& rhs);
552 _TouchEvent& operator =(const _TouchEvent& rhs);
554 _Control* GetTarget(int x, int y, const _Control* pRootControl) const
558 _TouchManager* pTouchManager = _TouchManager::GetInstance();
559 SysTryReturn(NID_UI, pTouchManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
561 _Control* pCapturedControl = pTouchManager->GetCapturedControl();
562 _Control* pControl = null;
564 if (pCapturedControl)
566 if (pTouchManager->IsCaptureAllowedOutOfBounds())
568 pControl = pCapturedControl;
572 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
574 if ((x < rc.x) || (x > (rc.x + rc.width)) || (y < rc.y) || (y > (rc.y + rc.height)))
576 pControl = pCapturedControl;
580 if (pControl != null)
586 _ControlManager* pControlManager = _ControlManager::GetInstance();
587 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
589 Tizen::Graphics::FloatPoint ptf(static_cast<float>(x), static_cast<float>(y));
591 _ControlVisualElement* pRootControlElement = null;
594 pRootControlElement = dynamic_cast<_ControlVisualElement*>(pRootControl->GetVisualElement());
598 _Window* pWindow = null;
599 #if !defined(MULTI_WINDOW)
600 pWindow = pControlManager->GetCurrentFrame();
602 pWindow = pControlManager->GetTouchedWindow();
604 SysTryReturn(NID_UI, pWindow, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
606 Rectangle winBounds = pWindow->GetBounds();
608 ptf.x = static_cast<float>(x - winBounds.x);
609 ptf.y = static_cast<float>(y - winBounds.y);
611 #if !defined(MULTI_WINDOW)
612 pRootControlElement = dynamic_cast <_ControlVisualElement*>(pControlManager->GetRoot().GetVisualElement());
614 pRootControlElement = dynamic_cast <_ControlVisualElement*>(pWindow->GetVisualElement());
618 SysTryReturn(NID_UI, pRootControlElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
620 _ControlVisualElement* pControlVisualElement = pRootControlElement->GetControlChildAtPoint(ptf);
621 SysTryReturn(NID_UI, pControlVisualElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
623 pControl = static_cast <_Control*>(pControlVisualElement->GetUserData());
624 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
629 result GetPosition(_TouchStatus status, int x, int y, Point& point) const
631 result r = E_SUCCESS;
633 _ControlManager* pControlManager = _ControlManager::GetInstance();
634 SysTryReturn(NID_UI, pControlManager, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
636 #if !defined(MULTI_WINDOW)
637 _EcoreEvasMgr* pEcoreEvasMgr = GetEcoreEvasMgr();
638 SysTryReturn(NID_UI, pEcoreEvasMgr, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
640 _EcoreEvas* pEcoreEvas = pEcoreEvasMgr->GetEcoreEvas();
641 SysTryReturn(NID_UI, pEcoreEvas, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
643 Ecore_Evas* pEE = pEcoreEvas->GetEcoreEvas();
644 SysTryReturn(NID_UI, pEE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
646 _Window* pWindow = pControlManager->GetTouchedWindow();
647 SysTryReturn(NID_UI, pWindow, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
649 _RootVisualElement* pRootVE = pWindow->GetRootVisualElement();
650 SysTryReturn(NID_UI, pRootVE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
652 _EflLayer* pLayer = static_cast<_EflLayer*>(pRootVE->GetNativeLayer());
653 SysTryReturn(NID_UI, pLayer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
655 Ecore_Evas* pEE = pLayer->GetEcoreEvas();
656 SysTryReturn(NID_UI, pEE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
659 const int PORTRAIT = 0;
660 const int LANDSCAPE = 270;
661 const int PORTRAIT_REVERSE = 180;
662 const int LANDSCAPE_REVERSE = 90;
664 Dimension dimension = pControlManager->GetScreenSize();
665 Point output(_CoordinateSystemUtils::InverseTransform(point));
666 int rotation = ecore_evas_rotation_get(pEE);
677 point.y = dimension.width - output.x;
680 case PORTRAIT_REVERSE:
681 point.x = dimension.width - output.x;
682 point.y = dimension.height - output.y;
685 case LANDSCAPE_REVERSE:
686 point.x = dimension.height - output.y;
691 SysAssertf(0, "[E_SYSTEM][%d]", rotation);
700 _TouchInfo __touchInfo;
701 _TouchEventManager* __pTouchEventManager;
705 OnNotified(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
709 _UiEvent* pUiEvent = static_cast <_UiEvent*>(pEventInfo);
710 SysTryReturn(NID_UI, pUiEvent, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
712 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
713 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
715 result r = pEventManager->SendEvent(*pUiEvent);
716 SysTryReturn(NID_UI, r == E_SUCCESS, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
719 SetLastResult(E_SUCCESS);
721 return ECORE_CALLBACK_PASS_ON;
725 FreeEvent(void* pData __UNUSED__, void* pEventInfo)
727 _UiEvent* pUiEvent = static_cast <_UiEvent*>(pEventInfo);
735 OnKeyPressed(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
737 Ecore_Event_Key* pEv = static_cast <Ecore_Event_Key*>(pEventInfo);
738 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
740 //SysLog(NID_UI, "OnKeyPressed(%s, %d)", pEv->keyname, pEv->modifiers);
741 _KeyEvent event(KEY_PRESSED, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers), pEv);
744 SetLastResult(E_SUCCESS);
746 return ECORE_CALLBACK_PASS_ON;
750 OnKeyReleased(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
752 Ecore_Event_Key* pEv = static_cast <Ecore_Event_Key*>(pEventInfo);
753 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
755 //SysLog(NID_UI, "OnKeyReleased(%s, %d)", pEv->keyname, pEv->modifiers);
756 _KeyEvent event(KEY_RELEASED, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers), pEv);
759 SetLastResult(E_SUCCESS);
761 return ECORE_CALLBACK_PASS_ON;
765 OnTouchPressed(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
767 Ecore_Event_Mouse_Button* pEv = static_cast <Ecore_Event_Mouse_Button*>(pEventInfo);
768 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
770 #if defined(MULTI_WINDOW)
771 _ControlManager* pControlManager = _ControlManager::GetInstance();
772 SysTryReturn(NID_UI, pControlManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
774 pControlManager->SetTouchedWindow((unsigned int)pEv->window);
779 SysLog(NID_UI, "OnTouchPressed - x(%d), y(%d), deviceId(%d)", pEv->root.x, pEv->root.y, pEv->multi.device);
780 _TouchEvent event(pEv->multi.device, _TOUCH_PRESSED, pEv->root.x, pEv->root.y, pEv->timestamp, null);
782 result r = GetLastResult();
783 SysTryReturn(NID_UI, r == E_SUCCESS, ECORE_CALLBACK_PASS_ON, r, "[%s] Propagating.", GetErrorMessage(r));
787 SetLastResult(E_SUCCESS);
789 return ECORE_CALLBACK_PASS_ON;
793 OnTouchReleased(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
795 Ecore_Event_Mouse_Button* pEv = static_cast <Ecore_Event_Mouse_Button*>(pEventInfo);
796 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
800 SysLog(NID_UI, "OnTouchReleased - x(%d), y(%d), deviceId(%d)", pEv->root.x, pEv->root.y, pEv->multi.device);
801 _TouchEvent event(pEv->multi.device, _TOUCH_RELEASED, pEv->root.x, pEv->root.y, pEv->timestamp, null);
803 result r = GetLastResult();
804 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
808 SetLastResult(E_SUCCESS);
810 return ECORE_CALLBACK_PASS_ON;
813 _TouchManager* pTouchManager = _TouchManager::GetInstance();
816 SysLogException(NID_UI, E_SUCCESS, "ResetTouchInfo");
817 pTouchManager->SetTouchAllowed(false);
818 pTouchManager->ResetTouchInfo();
821 return ECORE_CALLBACK_PASS_ON;
825 OnTouchMoved(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
827 Ecore_Event_Mouse_Move* pEv = static_cast <Ecore_Event_Mouse_Move*>(pEventInfo);
828 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
830 //SysLog(NID_UI, "OnTouchMoved - x(%d), y(%d), deviceId(%d)", pEv->root.x, pEv->root.y, pEv->multi.device);
831 _TouchEvent event(pEv->multi.device, _TOUCH_MOVED, pEv->root.x, pEv->root.y, pEv->timestamp, null);
833 result r = GetLastResult();
834 SysTryReturn(NID_UI, r == E_SUCCESS, ECORE_CALLBACK_PASS_ON, r, "[%s] Propagating.", GetErrorMessage(r));
838 SetLastResult(E_SUCCESS);
840 return ECORE_CALLBACK_PASS_ON;
844 OnKeyboardInserted(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
846 Ecore_X_Event_Window_Property *pEv = static_cast <Ecore_X_Event_Window_Property*>(pEventInfo);
847 if ( pEv->atom != keyboardExist)
849 // SysLog(NID_UI, "OnKeyboardInserted - atom of event(%d), keyboardExist(%d)", pEv->atom, keyboardExist);
850 return ECORE_CALLBACK_PASS_ON;
853 ArrayList* pArgs = null;
854 result r = E_SUCCESS;
855 Boolean* pIsKeyboardOn = null;
856 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
857 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
859 _Control* pControl = _ControlManager::GetInstance()->GetFocusedControl();
860 SysTryReturn(NID_UI, pControl, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
862 bool isKeyboardOn = false;
863 unsigned int value = 0;
864 int returnResult = -1;
866 returnResult = ecore_x_window_prop_card32_get(pEv->win, keyboardExist, &value, 1);
874 pArgs = new (std::nothrow) ArrayList;
875 SysTryReturn(NID_UI, pArgs, ECORE_CALLBACK_PASS_ON, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
877 r = pArgs->Construct();
878 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
880 String* pString = new (std::nothrow) String(KEYBOARD_INSERTED_EVENT);
881 r = pArgs->Add(*pString);
882 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
884 pIsKeyboardOn = new (std::nothrow) Boolean(isKeyboardOn);
885 r = pArgs->Add(*pIsKeyboardOn);
886 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
888 _UiNotificationEvent event(pControl->GetHandle(), pArgs);
889 r = pEventManager->SendEvent(event);
890 // SysLog(NID_UI, "OnKeyboardInserted - sent keyboard inserted noti");
895 return ECORE_CALLBACK_PASS_ON;
905 delete pIsKeyboardOn;
908 return ECORE_CALLBACK_PASS_ON;
912 OnWindowFocusIn(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
914 SysLog(NID_UI, "Enter");
916 Ecore_X_Event_Window_Focus_In* pEv = static_cast<Ecore_X_Event_Window_Focus_In*>(pEventInfo);
917 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
919 _ControlManager* pControlManager = _ControlManager::GetInstance();
920 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
922 int count = pControlManager->GetWindowCount();
924 _Control* pFocusedControl = null;
925 for (int i = count - 1; i >= 0; --i)
927 _Window* pWindow = pControlManager->GetWindow(i);
930 #if !defined(MULTI_WINDOW)
931 pFocusedControl = pWindow->GetFocused();
934 pFocusedControl->SetFocused();
938 NativeWindowHandle nativeWindowHandle = pWindow->GetNativeHandle();
939 if (pEv->win == nativeWindowHandle)
941 pFocusedControl = pWindow->GetFocused();
944 pFocusedControl->SetFocused();
952 return ECORE_CALLBACK_PASS_ON;
956 OnWindowFocusOut(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
958 SysLog(NID_UI, "Enter");
960 Ecore_X_Event_Window_Focus_Out* pEv = static_cast<Ecore_X_Event_Window_Focus_Out*>(pEventInfo);
961 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
963 _ControlManager* pControlManager = _ControlManager::GetInstance();
964 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
966 #if !defined(MULTI_WINDOW)
967 _Control* pFocusedControl = pControlManager->GetFocusedControl();
970 pControlManager->TakeFocusFromControl(*pFocusedControl);
973 _Control* pFocusedControl = pControlManager->GetFocusedControl();
976 _Window* pRootWindow = pFocusedControl->GetRootWindow();
979 NativeWindowHandle nativeWindowHandle = pRootWindow->GetNativeHandle();
980 if (pEv->win == nativeWindowHandle)
982 pControlManager->TakeFocusFromControl(*pFocusedControl);
988 return ECORE_CALLBACK_PASS_ON;
993 OnEvasKeyPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
995 Evas_Event_Key_Down* pEv = static_cast <Evas_Event_Key_Down*>(pEventInfo);
996 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
998 SetLastResult(E_SUCCESS);
1002 OnEvasKeyReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1004 Evas_Event_Key_Up* pEv = static_cast <Evas_Event_Key_Up*>(pEventInfo);
1005 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1007 SetLastResult(E_SUCCESS);
1011 OnEvasTouchPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1013 Evas_Event_Mouse_Down* pEv = static_cast <Evas_Event_Mouse_Down*>(pEventInfo);
1014 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1016 _Control* pControl = static_cast<_Control*>(pData);
1017 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1019 _TouchEvent event(0, _TOUCH_PRESSED, pEv->canvas.x, pEv->canvas.y, pEv->timestamp, pControl);
1021 result r = GetLastResult();
1022 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1026 SetLastResult(E_SUCCESS);
1030 OnEvasTouchReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1032 Evas_Event_Mouse_Up* pEv = static_cast <Evas_Event_Mouse_Up*>(pEventInfo);
1033 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1035 _Control* pControl = static_cast<_Control*>(pData);
1036 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1038 _TouchEvent event(0, _TOUCH_RELEASED, pEv->canvas.x, pEv->canvas.y, pEv->timestamp, pControl);
1040 result r = GetLastResult();
1041 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1045 SetLastResult(E_SUCCESS);
1049 OnEvasTouchMoved(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1051 Evas_Event_Mouse_Move* pEv = static_cast <Evas_Event_Mouse_Move*>(pEventInfo);
1052 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1054 _Control* pControl = static_cast<_Control*>(pData);
1055 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1057 _TouchEvent event(0, _TOUCH_MOVED, pEv->cur.canvas.x, pEv->cur.canvas.y, pEv->timestamp, pControl);
1059 result r = GetLastResult();
1060 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1064 SetLastResult(E_SUCCESS);
1068 OnEvasMultiTouchPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1070 Evas_Event_Multi_Down* pEv = static_cast <Evas_Event_Multi_Down*>(pEventInfo);
1071 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1073 SetLastResult(E_SUCCESS);
1077 OnEvasMultiTouchReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1079 Evas_Event_Multi_Up* pEv = static_cast <Evas_Event_Multi_Up*>(pEventInfo);
1080 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1082 SetLastResult(E_SUCCESS);
1086 OnEvasMultiTouchMoved(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1088 Evas_Event_Multi_Move* pEv = static_cast <Evas_Event_Multi_Move*>(pEventInfo);
1089 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1091 SetLastResult(E_SUCCESS);
1096 namespace Tizen { namespace Ui
1099 _EflUiEventManager::_EflUiEventManager(void)
1100 : __notificaitonEventType(-1)
1102 unique_ptr<LinkedListT<Ecore_Event_Handler*> > pEventHandlers(new (std::nothrow) LinkedListT<Ecore_Event_Handler*>);
1103 SysTryReturnVoidResult(NID_UI, pEventHandlers, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
1106 __notificaitonEventType = ecore_event_type_new();
1107 SysTryReturnVoidResult(NID_UI, __notificaitonEventType >= 1, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1109 Ecore_Event_Handler* pEventHandler = ecore_event_handler_add(__notificaitonEventType, OnNotified, null);
1110 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1112 pEventHandlers->Add(pEventHandler);
1115 pEventHandler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, OnKeyPressed, null);
1116 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1118 pEventHandlers->Add(pEventHandler);
1120 pEventHandler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, OnKeyReleased, null);
1121 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1123 pEventHandlers->Add(pEventHandler);
1126 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, OnTouchPressed, null);
1127 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1129 pEventHandlers->Add(pEventHandler);
1131 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, OnTouchReleased, null);
1132 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1134 pEventHandlers->Add(pEventHandler);
1136 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, OnTouchMoved, null);
1137 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1139 pEventHandlers->Add(pEventHandler);
1142 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, OnKeyboardInserted, null);
1143 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1145 pEventHandlers->Add(pEventHandler);
1148 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, OnWindowFocusIn, null);
1149 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1151 pEventHandlers->Add(pEventHandler);
1153 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, OnWindowFocusOut, null);
1154 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1156 pEventHandlers->Add(pEventHandler);
1158 __pEventHandlers = move(pEventHandlers);
1160 keyboardExist = XInternAtom(static_cast<Display*>(ecore_x_display_get()), "X External Keyboard Exist", 0);
1162 SetLastResult(E_SUCCESS);
1165 _EflUiEventManager::~_EflUiEventManager(void)
1167 Tizen::Base::Collection::IEnumeratorT<Ecore_Event_Handler*>* pEnumerator = __pEventHandlers->GetEnumeratorN();
1168 SysTryReturnVoidResult(NID_UI, pEnumerator, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
1170 while (pEnumerator->MoveNext() == E_SUCCESS)
1172 Ecore_Event_Handler* pEventHandler = null;
1173 pEnumerator->GetCurrent(pEventHandler);
1176 ecore_event_handler_del(pEventHandler);
1184 _EflUiEventManager::RegisterKeyEventHandler(const _Control& control)
1186 result r = E_SUCCESS;
1188 Evas_Object* pEvasObject = GetEvasObject(control);
1189 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1191 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_KEY_UP, OnEvasKeyReleased, &control);
1192 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_KEY_DOWN, OnEvasKeyPressed, &control);
1198 _EflUiEventManager::RegisterTouchEventHandler(const _Control& control)
1200 result r = E_SUCCESS;
1202 Evas_Object* pEvasObject = GetEvasObject(control);
1203 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1205 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MOUSE_UP, OnEvasTouchReleased, &control);
1206 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MOUSE_DOWN, OnEvasTouchPressed, &control);
1207 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MOUSE_MOVE, OnEvasTouchMoved, &control);
1209 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MULTI_UP, OnEvasMultiTouchReleased, &control);
1210 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MULTI_DOWN, OnEvasMultiTouchPressed, &control);
1211 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MULTI_MOVE, OnEvasMultiTouchMoved, &control);
1217 _EflUiEventManager::UnregisterKeyEventHandler(const _Control& control)
1219 result r = E_SUCCESS;
1221 Evas_Object* pEvasObject = GetEvasObject(control);
1222 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1224 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_KEY_UP, OnEvasKeyReleased);
1225 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_KEY_DOWN, OnEvasKeyPressed);
1231 _EflUiEventManager::UnregisterTouchEventHandler(const _Control& control)
1233 result r = E_SUCCESS;
1235 Evas_Object* pEvasObject = GetEvasObject(control);
1236 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1238 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MOUSE_UP, OnEvasTouchReleased);
1239 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MOUSE_DOWN, OnEvasTouchPressed);
1240 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MOUSE_MOVE, OnEvasTouchMoved);
1242 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MULTI_UP, OnEvasMultiTouchReleased);
1243 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MULTI_DOWN, OnEvasMultiTouchPressed);
1244 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MULTI_MOVE, OnEvasMultiTouchMoved);
1250 _EflUiEventManager::PostEvent(const _UiEvent& event)
1254 result r = E_SUCCESS;
1256 _UiEvent* pEvent = event.CloneN();
1257 SysTryReturn(NID_UI, pEvent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1259 Ecore_Event* pEcoreEvent = ecore_event_add(__notificaitonEventType, pEvent, FreeEvent, null);
1260 SysTryReturn(NID_UI, pEcoreEvent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1266 _EflUiEventManager::SetKeyCapture(const _Control& control, _KeyCode keyCode)
1268 Ecore_X_Window win = ecore_evas_software_x11_window_get(ecore_evas_ecore_evas_get(evas_object_evas_get(GetEvasObject(control))));
1270 for (unsigned int i = 0; i < sizeof(keyTable) / sizeof(_EvasConvertKeys); ++i)
1272 if (keyTable[i].code == keyCode)
1274 if (keyTable[i].pName)
1276 utilx_grab_key((Display*)ecore_x_display_get(), win, keyTable[i].pName, TOP_POSITION_GRAB);
1284 _EflUiEventManager::ReleaseKeyCapture(const _Control& control, _KeyCode keyCode)
1286 Ecore_X_Window win = ecore_evas_software_x11_window_get(ecore_evas_ecore_evas_get(evas_object_evas_get(GetEvasObject(control))));
1288 for (unsigned int i = 0; i < sizeof(keyTable) / sizeof(_EvasConvertKeys); ++i)
1290 if (keyTable[i].code == keyCode)
1292 if (keyTable[i].pName)
1294 utilx_ungrab_key((Display*)ecore_x_display_get(), win, keyTable[i].pName);