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>
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 #include "FUiAnim_RootVisualElement.h"
48 #include "FUiAnim_EflLayer.h"
49 #include "FUi_AccessibilityManager.h"
52 using namespace Tizen::Ui;
53 using namespace Tizen::Ui::Animations;
54 using namespace Tizen::Graphics;
55 using namespace Tizen::Base::Collection;
56 using namespace Tizen::Base;
57 using namespace Tizen::Ui::Controls;
63 Ecore_X_Atom keyboardExist = 0;
64 const wchar_t* KEYBOARD_INSERTED_EVENT = L"KEYBOARD_INSERTED";
65 const int DEVICE_COUNT = 999;
66 bool touchPressed[DEVICE_COUNT] = {false,};
69 GetEvasObject(const _Control& control)
71 _VisualElement* pVisualElement = control.GetVisualElement();
72 SysTryReturn(NID_UI, pVisualElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
74 _EflNode* pEflNode = dynamic_cast<_EflNode*>(pVisualElement->GetNativeNode());
75 SysTryReturn(NID_UI, pEflNode, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
77 return (Evas_Object*)pEflNode->GetGroupContainer();
81 GetEvas(const _Control& control)
84 Evas_Object* pEvasObject = GetEvasObject(control);
87 pEvas = evas_object_evas_get(pEvasObject);
88 SysTryReturn(NID_UI, pEvas, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
98 : _pEventManager(null)
100 _pEventManager = _UiEventManager::GetInstance();
101 SysTryReturnVoidResult(NID_UI, _pEventManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
103 SetLastResult(E_SUCCESS);
106 virtual ~_Event(void)
111 _Event(const _Event& rhs);
112 _Event& operator =(const _Event& rhs);
114 virtual result SendImpl(void) = 0;
123 _UiEventManager* _pEventManager;
126 struct _EvasConvertKeys
132 const _EvasConvertKeys keyTable[] =
134 { _KEY_ESC, "Escape" },
135 { _KEY_GRAVE, "grave" },
146 { _KEY_MINUS, "minus" },
147 { _KEY_EQUAL, "equal" },
148 { _KEY_BACKSLASH, "backslash" },
149 { _KEY_BACKSPACE, "BackSpace" },
161 { _KEY_LBRACKET, "bracketleft" },
162 { _KEY_RBRACKET, "bracketright" },
163 { _KEY_ENTER, "Return" },
164 { _KEY_CAPSLOCK, "Caps_Lock" },
174 { _KEY_SEMICOLON, "semicolon" },
175 { _KEY_APOSTROPHE, "apostrophe" },
176 { _KEY_SHIFT_L, "Shift_L" },
184 { _KEY_COMMA, "comma" },
185 { _KEY_DOT, "period" },
186 { _KEY_SLASH, "slash" },
187 { _KEY_SHIFT_R, "Shift_R" },
188 { _KEY_CTRL_L, "Control_L" },
189 { _KEY_LALT, "Alt_L" },
190 { _KEY_SPACE, "space" },
191 { _KEY_RALT, "Alt_R" },
192 { _KEY_CTRL_R, "Control_R" },
202 { _KEY_FN_10, "F10" },
203 { _KEY_FN_11, "F11" },
204 { _KEY_FN_12, "F12" },
205 { _KEY_NUM_LOCK, "Num_Lock" },
206 { _KEY_NUMPAD_DIVIDE, "KP_Divide" },
207 { _KEY_NUMPAD_MULTIPLY, "KP_Multiply" },
208 { _KEY_NUMPAD_SUBTRACT, "KP_Subtract" },
209 { _KEY_NUMPAD_7, "KP_Home" },
210 { _KEY_NUMPAD_8, "KP_Up" },
211 { _KEY_NUMPAD_9, "KP_Prior" },
212 { _KEY_NUMPAD_4, "KP_Left" },
213 { _KEY_NUMPAD_5, "KP_Begin" },
214 { _KEY_NUMPAD_6, "KP_Right" },
215 { _KEY_NUMPAD_ADD, "KP_Add" },
216 { _KEY_NUMPAD_1, "KP_End" },
217 { _KEY_NUMPAD_2, "KP_Down" },
218 { _KEY_NUMPAD_3, "KP_Next" },
219 { _KEY_NUMPAD_0, "KP_Insert" },
220 { _KEY_NUMPAD_DOT, "KP_Delete" },
221 { _KEY_NUMPAD_ENTER, "KP_Enter" },
222 { _KEY_PRINT, "Print" },
223 { _KEY_SCROLL_LOCK, "Scroll_Lock" },
224 { _KEY_PAUSEBREAK, "Pause" },
225 { _KEY_INSERT, "Insert" },
226 { _KEY_HOME_BUTTON, "Home" },
227 { _KEY_PAGE_UP, "Prior" },
228 { _KEY_DELETE, "Delete" },
229 { _KEY_END_BUTTON, "End" },
230 { _KEY_PAGE_DOWN, "Next" },
232 { _KEY_LEFT, "Left" },
233 { _KEY_DOWN, "Down" },
234 { _KEY_RIGHT, "Right" },
235 { _KEY_COMMA, "less" }, /*virtual keypad <*/
236 { _KEY_9, "parenleft" }, /*virtual keypad (*/
237 { _KEY_0, "parenright" }, /*virtual keypad )*/
238 { _KEY_CONTEXT_MENU, "Menu" },
239 { _KEY_CONTEXT_MENU, "XF86Send" },
240 //{ _KEY_SIDE_UP, "XF86AudioRaiseVolume" },
241 //{ _KEY_SIDE_DOWN, "XF86AudioLowerVolume" },
242 //{ _KEY_POWER_HOLD, "XF86PowerOff" },
243 { _KEY_CLEAR, "XF86Stop" }
252 _KeyEvent(KeyState keyState, _KeyCode keyCode, int keyModifier, void* pUserData)
254 , __keyInfo(keyState, keyCode, keyModifier, pUserData)
256 __pTarget = GetTarget(keyCode);
259 virtual ~_KeyEvent(void)
263 static _KeyCode GetKeyCode(const char* pKeyName)
267 SysTryReturn(NID_UI, pKeyName, _KEY_INVALID, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
269 for (unsigned int i = 0; i < sizeof(keyTable) / sizeof(_EvasConvertKeys); ++i)
271 if (strcmp(keyTable[i].pName, pKeyName) == 0)
273 return keyTable[i].code;
280 static int GetKeyModifier(const int keyModifier)
283 unsigned int modifier = _KEY_MODIFIER_NONE;
285 if(ECORE_EVENT_MODIFIER_SHIFT & keyModifier)
287 modifier |= _KEY_MODIFIER_SHIFT;
289 if(ECORE_EVENT_MODIFIER_CTRL & keyModifier)
291 modifier |= _KEY_MODIFIER_CTRL;
293 if(ECORE_EVENT_MODIFIER_ALT & keyModifier)
295 modifier |= _KEY_MODIFIER_ALT;
297 if(ECORE_EVENT_MODIFIER_WIN & keyModifier)
299 modifier |= _KEY_MODIFIER_WIN;
301 if(ECORE_EVENT_MODIFIER_SCROLL & keyModifier)
303 modifier |= _KEY_MODIFIER_SCROLL;
305 if(ECORE_EVENT_MODIFIER_NUM & keyModifier)
307 modifier |= _KEY_MODIFIER_NUM;
309 if(ECORE_EVENT_MODIFIER_CAPS & keyModifier)
311 modifier |= _KEY_MODIFIER_CAPS;
313 if(ECORE_EVENT_LOCK_SCROLL & keyModifier)
315 modifier |= _KEY_LOCK_SCROLL;
317 if(ECORE_EVENT_LOCK_NUM & keyModifier)
319 modifier |= _KEY_LOCK_NUM;
321 if(ECORE_EVENT_LOCK_CAPS & keyModifier)
323 modifier |= _KEY_LOCK_CAPS;
325 if(ECORE_EVENT_LOCK_SHIFT & keyModifier)
327 modifier |= _KEY_LOCK_SHIFT;
329 if(ECORE_EVENT_MODIFIER_ALTGR & keyModifier)
331 modifier |= _KEY_MODIFIER_ALTGR;
338 _KeyEvent(const _KeyEvent& rhs);
339 _KeyEvent& operator =(const _KeyEvent& rhs);
341 virtual result SendImpl(void)
343 SysTryReturn(NID_UI, __pTarget, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
345 _UiKeyEvent event(__pTarget->GetHandle(), __keyInfo);
347 return _pEventManager->SendEvent(event);
350 _Control* GetTarget(_KeyCode keyCode) const
352 _KeyEventManager* pKeyEventManager = _KeyEventManager::GetInstance();
353 SysTryReturn(NID_UI, pKeyEventManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
355 _Control* pControl = pKeyEventManager->GetCapturingControl(keyCode);
357 if (pControl == null)
359 _ControlManager* pControlManager = _ControlManager::GetInstance();
360 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
362 pControl = pControlManager->GetFocusControl();
366 pControl = pControlManager->GetCurrentFrame();
368 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
371 _ControlManager* pControlManager = _ControlManager::GetInstance();
372 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
374 pControl = pControlManager->GetFocusControl();
377 pControl = pControlManager->GetCurrentFrame();
379 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
381 SetLastResult(E_SUCCESS);
391 class _TouchEventManager
394 static _TouchEventManager* GetInstance(void)
396 if (__pInstance == null)
398 __pInstance = new (std::nothrow) _TouchEventManager;
399 SysTryReturn(NID_UI, __pInstance, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
402 SetLastResult(E_SUCCESS);
407 result AddControl(int pointId, const _ControlHandle& controlHandle)
410 result r = E_SUCCESS;
412 __pTargetMap->ContainsKey(pointId, exist);
416 r = __pTargetMap->Remove(pointId);
417 SysTryReturnResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
420 r = __pTargetMap->Add(pointId, controlHandle);
421 SysTryReturnResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
426 _Control* GetControl(int pointId)
428 SysTryReturn(NID_UI, __pTargetMap, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
430 _ControlHandle controlHandle;
432 __pTargetMap->GetValue(pointId, controlHandle);
434 _ControlManager* pControlManager = _ControlManager::GetInstance();
435 result r = GetLastResult();
436 SysTryReturn(NID_UI, pControlManager, null, r, "[%s] Propagating.", GetErrorMessage(r));
438 return pControlManager->GetObject(controlHandle);
442 _TouchEventManager(void)
444 result r = E_SUCCESS;
445 unique_ptr<HashMapT<int, _ControlHandle> > pTargetMap(new (std::nothrow) HashMapT<int, _ControlHandle>);
446 SysTryReturnVoidResult(NID_UI, pTargetMap, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
448 r = pTargetMap->Construct();
449 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
451 __pTargetMap = move(pTargetMap);
453 SetLastResult(E_SUCCESS);
456 ~_TouchEventManager(void)
460 _TouchEventManager(const _TouchEventManager& rhs);
461 _TouchEventManager& operator =(const _TouchEventManager& rhs);
464 static _TouchEventManager* __pInstance;
465 unique_ptr<HashMapT<int, _ControlHandle> > __pTargetMap;
468 _TouchEventManager* _TouchEventManager::__pInstance = null;
474 _TouchEvent(int deviceId, _TouchStatus status, int x, int y, unsigned int timeStamp, const _Control* pRootControl)
475 : __pTouchEventManager(null)
477 __pTouchEventManager = _TouchEventManager::GetInstance();
478 SysTryReturnVoidResult(NID_UI, __pTouchEventManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
480 result r = E_SUCCESS;
481 Tizen::Graphics::Point current(x, y);
483 _TouchManager* pTouchManager = _TouchManager::GetInstance();
484 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
486 unsigned int pointId = 0;
488 if (status == _TOUCH_PRESSED)
490 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
491 SysTryReturnVoidResult(NID_UI, pFingerInfoList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
493 const int count = pFingerInfoList->GetCount();
495 for (int i = 0; i < count; i++)
497 _FingerInfo* pFingerInfo = null;
498 pFingerInfoList->GetAt(i, pFingerInfo);
499 if (pFingerInfo == null)
504 if (static_cast<int>(pFingerInfo->GetDeviceId()) == deviceId && pFingerInfo->GetStatus() == _TOUCH_PRESSED)
506 pTouchManager->ResetTouchInfo();
507 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pFingerInfo->GetPointId());
511 delete pFingerInfoList;
513 pointId = pTouchManager->GeneratePointId(deviceId);
514 SysSecureLog(NID_UI, "OnTouchPressed GeneratePointId = pointId %d", pointId);
518 pointId = pTouchManager->GetPointId(deviceId);
521 if (status == _TOUCH_RELEASED)
523 SysSecureLog(NID_UI, "OnTouchReleased GetPointId = pointId %d", pointId);
526 if (pointId == INVALID_POINT_ID)
528 if (status == _TOUCH_RELEASED)
530 _ControlManager* pControlManager = _ControlManager::GetInstance();
531 SysTryReturnVoidResult(NID_UI, pControlManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
533 _Window* pWindow = pControlManager->GetTouchedWindow();
536 _TouchManager* pTouchManager = _TouchManager::GetInstance();
539 pTouchManager->ResetTouchInfo();
540 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
544 SetLastResult(E_INVALID_CONDITION);
550 r = GetPosition(status, x, y, current);
551 SysTryReturnVoidResult(NID_UI, r != E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
552 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
556 current = _CoordinateSystemUtils::InverseTransform(current);
559 __touchInfo.SetTouchInfo(pointId, status, current, false, timeStamp);
561 if (status == _TOUCH_PRESSED)
563 _Control* pControl = GetTarget(current.x, current.y, pRootControl);
565 if (pControl == null)
567 pTouchManager->ResetTouchInfo();
568 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pointId);
569 SysTryReturnVoidResult(NID_UI, false, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
573 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
574 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
575 SysSecureLog(NID_UI, "touch_pressed : pointId = %d, AddControl = 0x%x", pointId, pControl);
580 _Control* pControl = pTouchManager->GetChangedTouchableTarget();
581 if (pControl == null)
587 if (pControl->GetChangingEventTarget() == true && pControl->GetVisibleState() == true)
589 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
590 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
591 SysSecureLog(NID_UI, "touch_moved, touch_released : pointId = %d, AddControl = 0x%x", pointId, pControl);
597 virtual ~_TouchEvent(void)
602 virtual result SendImpl(void)
604 _Control* pTarget = __pTouchEventManager->GetControl(__touchInfo.GetPointId());
607 if (__touchInfo.GetTouchStatus() == _TOUCH_MOVED)
609 SysLog(NID_UI, "Target is null for the move event, skip sendImpl");
613 _TouchManager* pTouchManager = _TouchManager::GetInstance();
614 pTouchManager->SetTouchCanceled(null);
615 pTouchManager->ResetTouchInfo();
617 SysLog(NID_UI, "ResetTouchInfo");
621 _UiTouchEvent event(pTarget->GetHandle(), __touchInfo);
623 return _pEventManager->SendEvent(event);
627 _TouchEvent(const _TouchEvent& rhs);
628 _TouchEvent& operator =(const _TouchEvent& rhs);
630 _Control* GetTarget(int x, int y, const _Control* pRootControl) const
634 _TouchManager* pTouchManager = _TouchManager::GetInstance();
635 SysTryReturn(NID_UI, pTouchManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
637 _Control* pCapturedControl = pTouchManager->GetCapturedControl();
638 _Control* pControl = null;
640 if (pCapturedControl)
642 if (pTouchManager->IsCaptureAllowedOwnerBounds())
644 if (pTouchManager->IsCaptureAllowedOutOfBounds())
646 pControl = pCapturedControl;
649 _Window * pWindow = dynamic_cast<_Window*>(pCapturedControl);
652 _Control* pOwner = pWindow->GetOwner();
655 Tizen::Graphics::Rectangle ownerRc(pOwner->GetAbsoluteBounds());
656 if ((x >= ownerRc.x) && (x <= (ownerRc.x + ownerRc.width)) && (y >= ownerRc.y) && (y <= (ownerRc.y + ownerRc.height)))
663 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
664 if ((x >= rc.x) && (x <= (rc.x + rc.width)) && (y >= rc.y) && (y <= (rc.y + rc.height)))
666 pControl = pCapturedControl;
671 if (pTouchManager->IsCaptureAllowedOutOfBounds())
673 pControl = pCapturedControl;
677 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
679 if ((x < rc.x) || (x > (rc.x + rc.width)) || (y < rc.y) || (y > (rc.y + rc.height)))
681 pControl = pCapturedControl;
686 if (pControl != null)
692 _ControlManager* pControlManager = _ControlManager::GetInstance();
693 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
695 Tizen::Graphics::FloatPoint ptf(static_cast<float>(x), static_cast<float>(y));
697 _ControlVisualElement* pRootControlElement = null;
700 pRootControlElement = dynamic_cast<_ControlVisualElement*>(pRootControl->GetVisualElement());
704 _Window* pWindow = null;
705 pWindow = pControlManager->GetTouchedWindow();
706 SysTryReturn(NID_UI, pWindow, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
708 Rectangle winBounds = pWindow->GetBounds();
710 ptf.x = static_cast<float>(x - winBounds.x);
711 ptf.y = static_cast<float>(y - winBounds.y);
713 pRootControlElement = dynamic_cast <_ControlVisualElement*>(pWindow->GetVisualElement());
716 SysTryReturn(NID_UI, pRootControlElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
718 _ControlVisualElement* pControlVisualElement = pRootControlElement->GetControlChildAtPoint(ptf);
719 SysTryReturn(NID_UI, pControlVisualElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
721 pControl = static_cast <_Control*>(pControlVisualElement->GetUserData());
722 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
727 result GetPosition(_TouchStatus status, int x, int y, Point& point) const
729 result r = E_SUCCESS;
731 _ControlManager* pControlManager = _ControlManager::GetInstance();
732 SysTryReturn(NID_UI, pControlManager, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
734 _Window* pWindow = pControlManager->GetTouchedWindow();
737 _TouchManager* pTouchManager = _TouchManager::GetInstance();
740 pTouchManager->ResetTouchInfo();
741 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
744 SysTryReturn(NID_UI, pWindow, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
746 _RootVisualElement* pRootVE = pWindow->GetRootVisualElement();
747 SysTryReturn(NID_UI, pRootVE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
749 _EflLayer* pLayer = static_cast<_EflLayer*>(pRootVE->GetNativeLayer());
750 SysTryReturn(NID_UI, pLayer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
752 Ecore_Evas* pEE = pLayer->GetEcoreEvas();
753 SysTryReturn(NID_UI, pEE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
755 const int PORTRAIT = 0;
756 const int LANDSCAPE = 270;
757 const int PORTRAIT_REVERSE = 180;
758 const int LANDSCAPE_REVERSE = 90;
760 Dimension dimension = pControlManager->GetScreenSize();
761 Point output(_CoordinateSystemUtils::InverseTransform(point));
762 int rotation = ecore_evas_rotation_get(pEE);
773 point.y = dimension.width - output.x;
776 case PORTRAIT_REVERSE:
777 point.x = dimension.width - output.x;
778 point.y = dimension.height - output.y;
781 case LANDSCAPE_REVERSE:
782 point.x = dimension.height - output.y;
787 SysAssertf(0, "[E_SYSTEM][%d]", rotation);
796 _TouchInfo __touchInfo;
797 _TouchEventManager* __pTouchEventManager;
804 _MouseEvent(int deviceId, _TouchStatus status, int x, int y, int z, unsigned int buttons, unsigned int timeStamp, const _Control* pRootControl)
805 : __pTouchEventManager(null)
807 __pTouchEventManager = _TouchEventManager::GetInstance();
808 SysTryReturnVoidResult(NID_UI, __pTouchEventManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
810 result r = E_SUCCESS;
811 Tizen::Graphics::Point current(x, y);
813 _TouchManager* pTouchManager = _TouchManager::GetInstance();
814 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
816 unsigned int pointId = 0;
818 if (status == _TOUCH_PRESSED)
820 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
821 SysTryReturnVoidResult(NID_UI, pFingerInfoList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
823 const int count = pFingerInfoList->GetCount();
825 for (int i = 0; i < count; i++)
827 _FingerInfo* pFingerInfo = null;
828 pFingerInfoList->GetAt(i, pFingerInfo);
829 if (pFingerInfo == null)
834 if (static_cast<int>(pFingerInfo->GetDeviceId()) == deviceId && pFingerInfo->GetStatus() == _TOUCH_PRESSED)
836 pTouchManager->ResetTouchInfo();
837 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pFingerInfo->GetPointId());
841 delete pFingerInfoList;
843 pointId = pTouchManager->GeneratePointId(deviceId);
847 pointId = pTouchManager->GetPointId(deviceId);
850 if (pointId == INVALID_POINT_ID)
852 if (status == _TOUCH_RELEASED)
854 _ControlManager* pControlManager = _ControlManager::GetInstance();
855 SysTryReturnVoidResult(NID_UI, pControlManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
857 _Window* pWindow = pControlManager->GetTouchedWindow();
860 _TouchManager* pTouchManager = _TouchManager::GetInstance();
863 pTouchManager->ResetTouchInfo();
864 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
868 SetLastResult(E_INVALID_CONDITION);
874 r = GetPosition(status, x, y, current);
875 SysTryReturnVoidResult(NID_UI, r != E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
876 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
880 current = _CoordinateSystemUtils::InverseTransform(current);
883 __mouseInfo.SetTouchInfo(pointId, status, current, z, buttons, false, timeStamp);
885 if (status == _TOUCH_PRESSED)
887 _Control* pControl = GetTarget(current.x, current.y, pRootControl);
889 if (pControl == null)
891 pTouchManager->ResetTouchInfo();
892 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pointId);
893 SysTryReturnVoidResult(NID_UI, false, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
897 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
898 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
903 _Control* pControl = pTouchManager->GetChangedTouchableTarget();
904 if (pControl == null)
910 if (pControl->GetChangingEventTarget() == true && pControl->GetVisibleState() == true)
912 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
913 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
919 virtual ~_MouseEvent(void)
924 virtual result SendImpl(void)
926 _Control* pTarget = __pTouchEventManager->GetControl(__mouseInfo.GetPointId());
929 _TouchManager* pTouchManager = _TouchManager::GetInstance();
930 pTouchManager->ResetTouchInfo();
932 SysLog(NID_UI, "ResetTouchInfo");
936 _UiMouseEvent event(pTarget->GetHandle(), __mouseInfo);
938 return _pEventManager->SendEvent(event);
942 _MouseEvent(const _MouseEvent& rhs);
943 _MouseEvent& operator =(const _MouseEvent& rhs);
945 _Control* GetTarget(int x, int y, const _Control* pRootControl) const
949 _TouchManager* pTouchManager = _TouchManager::GetInstance();
950 SysTryReturn(NID_UI, pTouchManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
952 _Control* pCapturedControl = pTouchManager->GetCapturedControl();
953 _Control* pControl = null;
955 if (pCapturedControl)
957 if (pTouchManager->IsCaptureAllowedOwnerBounds())
959 if (pTouchManager->IsCaptureAllowedOutOfBounds())
961 pControl = pCapturedControl;
964 _Window * pWindow = dynamic_cast<_Window*>(pCapturedControl);
967 _Control* pOwner = pWindow->GetOwner();
970 Tizen::Graphics::Rectangle ownerRc(pOwner->GetAbsoluteBounds());
971 if ((x >= ownerRc.x) && (x <= (ownerRc.x + ownerRc.width)) && (y >= ownerRc.y) && (y <= (ownerRc.y + ownerRc.height)))
978 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
979 if ((x >= rc.x) && (x <= (rc.x + rc.width)) && (y >= rc.y) && (y <= (rc.y + rc.height)))
981 pControl = pCapturedControl;
986 if (pTouchManager->IsCaptureAllowedOutOfBounds())
988 pControl = pCapturedControl;
992 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
994 if ((x < rc.x) || (x > (rc.x + rc.width)) || (y < rc.y) || (y > (rc.y + rc.height)))
996 pControl = pCapturedControl;
1001 if (pControl != null)
1007 _ControlManager* pControlManager = _ControlManager::GetInstance();
1008 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1010 Tizen::Graphics::FloatPoint ptf(static_cast<float>(x), static_cast<float>(y));
1012 _ControlVisualElement* pRootControlElement = null;
1015 pRootControlElement = dynamic_cast<_ControlVisualElement*>(pRootControl->GetVisualElement());
1019 _Window* pWindow = null;
1020 pWindow = pControlManager->GetTouchedWindow();
1021 SysTryReturn(NID_UI, pWindow, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1023 Rectangle winBounds = pWindow->GetBounds();
1025 ptf.x = static_cast<float>(x - winBounds.x);
1026 ptf.y = static_cast<float>(y - winBounds.y);
1028 pRootControlElement = dynamic_cast <_ControlVisualElement*>(pWindow->GetVisualElement());
1031 SysTryReturn(NID_UI, pRootControlElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1033 _ControlVisualElement* pControlVisualElement = pRootControlElement->GetControlChildAtPoint(ptf);
1034 SysTryReturn(NID_UI, pControlVisualElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1036 pControl = static_cast <_Control*>(pControlVisualElement->GetUserData());
1037 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1042 result GetPosition(_TouchStatus status, int x, int y, Point& point) const
1044 result r = E_SUCCESS;
1046 _ControlManager* pControlManager = _ControlManager::GetInstance();
1047 SysTryReturn(NID_UI, pControlManager, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1049 _Window* pWindow = pControlManager->GetTouchedWindow();
1050 if (pWindow == null)
1052 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1055 pTouchManager->ResetTouchInfo();
1056 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
1059 SysTryReturn(NID_UI, pWindow, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
1061 _RootVisualElement* pRootVE = pWindow->GetRootVisualElement();
1062 SysTryReturn(NID_UI, pRootVE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1064 _EflLayer* pLayer = static_cast<_EflLayer*>(pRootVE->GetNativeLayer());
1065 SysTryReturn(NID_UI, pLayer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1067 Ecore_Evas* pEE = pLayer->GetEcoreEvas();
1068 SysTryReturn(NID_UI, pEE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1070 const int PORTRAIT = 0;
1071 const int LANDSCAPE = 270;
1072 const int PORTRAIT_REVERSE = 180;
1073 const int LANDSCAPE_REVERSE = 90;
1075 Dimension dimension = pControlManager->GetScreenSize();
1076 Point output(_CoordinateSystemUtils::InverseTransform(point));
1077 int rotation = ecore_evas_rotation_get(pEE);
1088 point.y = dimension.width - output.x;
1091 case PORTRAIT_REVERSE:
1092 point.x = dimension.width - output.x;
1093 point.y = dimension.height - output.y;
1096 case LANDSCAPE_REVERSE:
1097 point.x = dimension.height - output.y;
1102 SysAssertf(0, "[E_SYSTEM][%d]", rotation);
1111 _MouseInfo __mouseInfo;
1112 _TouchEventManager* __pTouchEventManager;
1116 OnNotified(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1120 _UiEvent* pUiEvent = static_cast <_UiEvent*>(pEventInfo);
1121 SysTryReturn(NID_UI, pUiEvent, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1123 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
1124 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1126 result r = pEventManager->SendEvent(*pUiEvent);
1127 SysTryReturn(NID_UI, r == E_SUCCESS, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1130 SetLastResult(E_SUCCESS);
1132 return ECORE_CALLBACK_PASS_ON;
1136 FreeEvent(void* pData __UNUSED__, void* pEventInfo)
1138 _UiEvent* pUiEvent = static_cast <_UiEvent*>(pEventInfo);
1146 OnKeyPressed(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1148 Ecore_Event_Key* pEv = static_cast <Ecore_Event_Key*>(pEventInfo);
1149 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1151 if (_KeyEvent::GetKeyCode(pEv->keyname) == _KEY_INVALID)
1153 SysLog(NID_UI, "KeyCode is Invalid");
1154 return ECORE_CALLBACK_PASS_ON;
1157 _KeyEvent event(KEY_PRESSED, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers), pEv);
1158 SysSecureLog(NID_UI, "KeyName = %s, KeyCode = %d, KeyModifier = %x", pEv->keyname, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers));
1161 SetLastResult(E_SUCCESS);
1163 return ECORE_CALLBACK_PASS_ON;
1167 OnKeyReleased(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1169 Ecore_Event_Key* pEv = static_cast <Ecore_Event_Key*>(pEventInfo);
1170 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1172 if (_KeyEvent::GetKeyCode(pEv->keyname) == _KEY_INVALID)
1174 SysLog(NID_UI, "KeyCode is Invalid");
1175 return ECORE_CALLBACK_PASS_ON;
1178 _KeyEvent event(KEY_RELEASED, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers), pEv);
1179 SysSecureLog(NID_UI, "KeyName = %s, KeyCode = %d, KeyModifier = %x", pEv->keyname, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers));
1182 SetLastResult(E_SUCCESS);
1184 return ECORE_CALLBACK_PASS_ON;
1188 OnClipboardMessageReceived(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1190 Ecore_X_Event_Client_Message *pEv = static_cast<Ecore_X_Event_Client_Message*>(pEventInfo);
1192 if (pEv->message_type != ecore_x_atom_get("CBHM_MSG"))
1194 return ECORE_CALLBACK_PASS_ON;
1197 if (!strcmp("SET_OWNER", pEv->data.b))
1199 _KeyEvent event(KEY_PRESSED, _KEY_OEM_1, 0, pEv);
1200 SysSecureLog(NID_UI, "KeyName = clipboard, KeyCode = _KEY_OEM_1, KeyModifier = 0");
1203 SetLastResult(E_SUCCESS);
1206 return ECORE_CALLBACK_PASS_ON;
1211 OnTouchPressed(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1213 Ecore_Event_Mouse_Button* pEv = static_cast <Ecore_Event_Mouse_Button*>(pEventInfo);
1214 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1216 SysSecureLog(NID_UI, "OnTouchPressed - x(%d), y(%d), deviceId(%d), buttons(%d)", pEv->root.x, pEv->root.y, pEv->multi.device, pEv->buttons);
1218 _ControlManager* pControlManager = _ControlManager::GetInstance();
1219 SysTryReturn(NID_UI, pControlManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1221 pControlManager->SetTouchedWindow((unsigned int)pEv->window);
1223 if (touchPressed[pEv->multi.device] == true)
1225 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1228 pTouchManager->SetTouchCanceled(null);
1229 SysLog(NID_UI, "pWindow is null, CancelTouch");
1231 for(int i=0; i<DEVICE_COUNT; i++)
1233 touchPressed[pEv->multi.device] = false;
1236 pTouchManager->ResetTouchInfo();
1237 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
1241 touchPressed[pEv->multi.device] = true;
1243 if (pEv->buttons == _MOUSE_BUTTON_LEFT || pEv->buttons == _MOUSE_BUTTON_NONE)
1245 _TouchEvent event(pEv->multi.device, _TOUCH_PRESSED, pEv->root.x, pEv->root.y, pEv->timestamp, null);
1247 result r = GetLastResult();
1250 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1251 return ECORE_CALLBACK_PASS_ON;
1258 //_MouseEvent event(pEv->multi.device, _TOUCH_PRESSED, pEv->root.x, pEv->root.y, 0, pEv->buttons, pEv->timestamp, null);
1259 _MouseEvent event(pEv->multi.device, _TOUCH_PRESSED, pEv->root.x, pEv->root.y, 0, _MOUSE_BUTTON_RIGHT, pEv->timestamp, null);
1261 result r = GetLastResult();
1264 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1265 return ECORE_CALLBACK_PASS_ON;
1270 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
1271 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1273 pEventManager->GenerateKeyEvent(KEY_PRESSED, _KEY_OEM_2, _KEY_MODIFIER_NONE, false);
1274 pEventManager->GenerateKeyEvent(KEY_RELEASED, _KEY_OEM_2, _KEY_MODIFIER_NONE, false);
1277 SetLastResult(E_SUCCESS);
1279 return ECORE_CALLBACK_PASS_ON;
1283 OnTouchReleased(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, "OnTouchReleased - x(%d), y(%d), deviceId(%d) buttons(%d)", pEv->root.x, pEv->root.y, pEv->multi.device, pEv->buttons);
1290 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1291 SysTryReturn(NID_UI, pTouchManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] _TouchManager does not exist.");
1293 touchPressed[pEv->multi.device] = false;
1295 if (pEv->buttons == _MOUSE_BUTTON_LEFT || pEv->buttons == _MOUSE_BUTTON_NONE)
1297 _TouchEvent event(pEv->multi.device, _TOUCH_RELEASED, pEv->root.x, pEv->root.y, pEv->timestamp, null);
1299 result r = GetLastResult();
1302 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1303 return ECORE_CALLBACK_PASS_ON;
1310 //_MouseEvent event(pEv->multi.device, _TOUCH_RELEASED, pEv->root.x, pEv->root.y, 0, pEv->buttons, pEv->timestamp, null);
1311 _MouseEvent event(pEv->multi.device, _TOUCH_RELEASED, pEv->root.x, pEv->root.y, 0, _MOUSE_BUTTON_RIGHT, pEv->timestamp, null);
1314 result r = GetLastResult();
1317 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1318 return ECORE_CALLBACK_PASS_ON;
1323 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1326 pTouchManager->ResetTouchInfo();
1327 SysLog(NID_UI, "ResetTouchInfo");
1331 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
1332 SysTryReturn(NID_UI, pFingerInfoList, ECORE_CALLBACK_PASS_ON, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1334 int count = pFingerInfoList->GetCount();
1336 for (int i = 0; i < count; i++)
1338 _FingerInfo* pFingerInfo = null;
1339 pFingerInfoList->GetAt(i, pFingerInfo);
1340 if (pFingerInfo == null)
1345 if (static_cast<int>(pFingerInfo->GetDeviceId()) == pEv->multi.device)
1347 pFingerInfo->SetPointId(INVALID_POINT_ID);
1351 delete pFingerInfoList;
1353 pTouchManager->SetChangedTouchableTarget(null);
1355 SetLastResult(E_SUCCESS);
1356 return ECORE_CALLBACK_PASS_ON;
1360 OnTouchMoved(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1362 Ecore_Event_Mouse_Move* pEv = static_cast <Ecore_Event_Mouse_Move*>(pEventInfo);
1363 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1365 //SysSecureLog(NID_UI, "OnTouchMoved - x(%d), y(%d), deviceId(%d)", pEv->root.x, pEv->root.y, pEv->multi.device);
1366 _TouchEvent event(pEv->multi.device, _TOUCH_MOVED, pEv->root.x, pEv->root.y, pEv->timestamp, null);
1368 result r = GetLastResult();
1371 return ECORE_CALLBACK_PASS_ON;
1376 SetLastResult(E_SUCCESS);
1378 return ECORE_CALLBACK_PASS_ON;
1382 OnMouseWheeled(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1384 _Ecore_Event_Mouse_Wheel* pEv = static_cast <_Ecore_Event_Mouse_Wheel*>(pEventInfo);
1385 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1387 SysSecureLog(NID_UI, "OnMouseWheeled - x(%d), y(%d), z(%d)", pEv->root.x, pEv->root.y, pEv->z);
1388 _MouseEvent event(0, _WHEEL_MOVED, pEv->root.x, pEv->root.y, pEv->z, _MOUSE_BUTTON_NONE, pEv->timestamp, null);
1390 result r = GetLastResult();
1393 return ECORE_CALLBACK_PASS_ON;
1398 SetLastResult(E_SUCCESS);
1400 return ECORE_CALLBACK_PASS_ON;
1404 OnKeyboardInserted(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1406 Ecore_X_Event_Window_Property *pEv = static_cast <Ecore_X_Event_Window_Property*>(pEventInfo);
1407 if ( pEv->atom != keyboardExist)
1409 // SysLog(NID_UI, "OnKeyboardInserted - atom of event(%d), keyboardExist(%d)", pEv->atom, keyboardExist);
1410 return ECORE_CALLBACK_PASS_ON;
1413 ArrayList* pArgs = null;
1414 result r = E_SUCCESS;
1415 Boolean* pIsKeyboardOn = null;
1416 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
1417 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1419 _Control* pControl = _ControlManager::GetInstance()->GetFocusControl();
1420 SysTryReturn(NID_UI, pControl, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1422 bool isKeyboardOn = false;
1423 unsigned int value = 0;
1424 int returnResult = -1;
1426 returnResult = ecore_x_window_prop_card32_get(pEv->win, keyboardExist, &value, 1);
1431 isKeyboardOn = true;
1434 pArgs = new (std::nothrow) ArrayList;
1435 SysTryReturn(NID_UI, pArgs, ECORE_CALLBACK_PASS_ON, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1437 r = pArgs->Construct();
1438 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1440 String* pString = new (std::nothrow) String(KEYBOARD_INSERTED_EVENT);
1441 r = pArgs->Add(*pString);
1442 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1444 pIsKeyboardOn = new (std::nothrow) Boolean(isKeyboardOn);
1445 r = pArgs->Add(*pIsKeyboardOn);
1446 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1448 _UiNotificationEvent event(pControl->GetHandle(), pArgs);
1449 r = pEventManager->SendEvent(event);
1450 // SysLog(NID_UI, "OnKeyboardInserted - sent keyboard inserted noti");
1455 return ECORE_CALLBACK_PASS_ON;
1465 delete pIsKeyboardOn;
1468 return ECORE_CALLBACK_PASS_ON;
1472 OnWindowFocusIn(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1474 SysLog(NID_UI, "Enter");
1476 Ecore_X_Event_Window_Focus_In* pEv = static_cast<Ecore_X_Event_Window_Focus_In*>(pEventInfo);
1477 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1479 _ControlManager* pControlManager = _ControlManager::GetInstance();
1480 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1482 int count = pControlManager->GetWindowCount();
1484 _Control* pFocusedControl = null;
1485 for (int i = count - 1; i >= 0; --i)
1487 _Window* pWindow = pControlManager->GetWindow(i);
1490 NativeWindowHandle nativeWindowHandle = pWindow->GetNativeHandle();
1491 if (pEv->win == nativeWindowHandle)
1493 pFocusedControl = pWindow->GetFocusControl();
1495 if (pFocusedControl)
1497 pFocusedControl->SetFocused();
1503 _AccessibilityManager::GetInstance()->RequestAutoReading(_ACCESSIBILITY_AUTO_READING_MODE_FIRST_ITEM);
1504 return ECORE_CALLBACK_PASS_ON;
1508 OnWindowFocusOut(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1510 SysLog(NID_UI, "Enter");
1512 Ecore_X_Event_Window_Focus_Out* pEv = static_cast<Ecore_X_Event_Window_Focus_Out*>(pEventInfo);
1513 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1515 _ControlManager* pControlManager = _ControlManager::GetInstance();
1516 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1518 _Control* pFocusedControl = pControlManager->GetFocusControl();
1519 if (pFocusedControl)
1521 _Window* pRootWindow = pFocusedControl->GetRootWindow();
1524 NativeWindowHandle nativeWindowHandle = pRootWindow->GetNativeHandle();
1525 if (pEv->win == nativeWindowHandle)
1527 pControlManager->TakeFocusFromControl(*pFocusedControl);
1531 _AccessibilityManager::GetInstance()->RequestAutoReading(_ACCESSIBILITY_AUTO_READING_MODE_RESET);
1532 return ECORE_CALLBACK_PASS_ON;
1537 OnEvasKeyPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1539 Evas_Event_Key_Down* pEv = static_cast <Evas_Event_Key_Down*>(pEventInfo);
1540 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1542 SetLastResult(E_SUCCESS);
1546 OnEvasKeyReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1548 Evas_Event_Key_Up* pEv = static_cast <Evas_Event_Key_Up*>(pEventInfo);
1549 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1551 SetLastResult(E_SUCCESS);
1555 OnEvasTouchPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1557 Evas_Event_Mouse_Down* pEv = static_cast <Evas_Event_Mouse_Down*>(pEventInfo);
1558 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1560 _Control* pControl = static_cast<_Control*>(pData);
1561 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1563 SysSecureLog(NID_UI, "OnEvasTouchPressed - x(%d), y(%d)", pEv->canvas.x, pEv->canvas.y);
1564 _TouchEvent event(0, _TOUCH_PRESSED, pEv->canvas.x, pEv->canvas.y, pEv->timestamp, pControl);
1566 result r = GetLastResult();
1569 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1575 SetLastResult(E_SUCCESS);
1579 OnEvasTouchReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1581 Evas_Event_Mouse_Up* pEv = static_cast <Evas_Event_Mouse_Up*>(pEventInfo);
1582 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1584 _Control* pControl = static_cast<_Control*>(pData);
1585 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1587 SysSecureLog(NID_UI, "OnEvasTouchReleased - x(%d), y(%d)", pEv->canvas.x, pEv->canvas.y);
1588 _TouchEvent event(0, _TOUCH_RELEASED, pEv->canvas.x, pEv->canvas.y, pEv->timestamp, pControl);
1590 result r = GetLastResult();
1593 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1599 SetLastResult(E_SUCCESS);
1603 OnEvasTouchMoved(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1605 Evas_Event_Mouse_Move* pEv = static_cast <Evas_Event_Mouse_Move*>(pEventInfo);
1606 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1608 _Control* pControl = static_cast<_Control*>(pData);
1609 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1611 SysSecureLog(NID_UI, "OnEvasTouchMoved - x(%d), y(%d)", pEv->cur.canvas.x, pEv->cur.canvas.x);
1612 _TouchEvent event(0, _TOUCH_MOVED, pEv->cur.canvas.x, pEv->cur.canvas.y, pEv->timestamp, pControl);
1614 result r = GetLastResult();
1617 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1623 SetLastResult(E_SUCCESS);
1627 OnEvasMultiTouchPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1629 Evas_Event_Multi_Down* pEv = static_cast <Evas_Event_Multi_Down*>(pEventInfo);
1630 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1632 SetLastResult(E_SUCCESS);
1636 OnEvasMultiTouchReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1638 Evas_Event_Multi_Up* pEv = static_cast <Evas_Event_Multi_Up*>(pEventInfo);
1639 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1641 SetLastResult(E_SUCCESS);
1645 OnEvasMultiTouchMoved(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1647 Evas_Event_Multi_Move* pEv = static_cast <Evas_Event_Multi_Move*>(pEventInfo);
1648 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1650 SetLastResult(E_SUCCESS);
1655 namespace Tizen { namespace Ui
1658 _EflUiEventManager::_EflUiEventManager(void)
1659 : __notificaitonEventType(-1)
1661 unique_ptr<LinkedListT<Ecore_Event_Handler*> > pEventHandlers(new (std::nothrow) LinkedListT<Ecore_Event_Handler*>);
1662 SysTryReturnVoidResult(NID_UI, pEventHandlers, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
1665 __notificaitonEventType = ecore_event_type_new();
1666 SysTryReturnVoidResult(NID_UI, __notificaitonEventType >= 1, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1668 Ecore_Event_Handler* pEventHandler = ecore_event_handler_add(__notificaitonEventType, OnNotified, null);
1669 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1671 pEventHandlers->Add(pEventHandler);
1674 pEventHandler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, OnKeyPressed, null);
1675 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1677 pEventHandlers->Add(pEventHandler);
1679 pEventHandler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, OnKeyReleased, null);
1680 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1682 pEventHandlers->Add(pEventHandler);
1685 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, OnClipboardMessageReceived, null);
1686 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1688 pEventHandlers->Add(pEventHandler);
1691 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, OnTouchPressed, null);
1692 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1694 pEventHandlers->Add(pEventHandler);
1696 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, OnTouchReleased, null);
1697 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1699 pEventHandlers->Add(pEventHandler);
1701 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, OnTouchMoved, null);
1702 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1704 pEventHandlers->Add(pEventHandler);
1707 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, OnKeyboardInserted, null);
1708 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1710 pEventHandlers->Add(pEventHandler);
1713 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, OnWindowFocusIn, null);
1714 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1716 pEventHandlers->Add(pEventHandler);
1718 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, OnWindowFocusOut, null);
1719 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1721 pEventHandlers->Add(pEventHandler);
1723 __pEventHandlers = move(pEventHandlers);
1725 keyboardExist = XInternAtom(static_cast<Display*>(ecore_x_display_get()), "X External Keyboard Exist", 0);
1727 SetLastResult(E_SUCCESS);
1730 _EflUiEventManager::~_EflUiEventManager(void)
1732 Tizen::Base::Collection::IEnumeratorT<Ecore_Event_Handler*>* pEnumerator = __pEventHandlers->GetEnumeratorN();
1733 SysTryReturnVoidResult(NID_UI, pEnumerator, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
1735 while (pEnumerator->MoveNext() == E_SUCCESS)
1737 Ecore_Event_Handler* pEventHandler = null;
1738 pEnumerator->GetCurrent(pEventHandler);
1741 ecore_event_handler_del(pEventHandler);
1749 _EflUiEventManager::RegisterKeyEventHandler(const _Control& control)
1751 result r = E_SUCCESS;
1753 Evas_Object* pEvasObject = GetEvasObject(control);
1754 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1756 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_KEY_UP, OnEvasKeyReleased, &control);
1757 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_KEY_DOWN, OnEvasKeyPressed, &control);
1763 _EflUiEventManager::RegisterTouchEventHandler(const _Control& control)
1765 result r = E_SUCCESS;
1767 Evas_Object* pEvasObject = GetEvasObject(control);
1768 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1770 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MOUSE_UP, OnEvasTouchReleased, &control);
1771 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MOUSE_DOWN, OnEvasTouchPressed, &control);
1772 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MOUSE_MOVE, OnEvasTouchMoved, &control);
1774 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MULTI_UP, OnEvasMultiTouchReleased, &control);
1775 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MULTI_DOWN, OnEvasMultiTouchPressed, &control);
1776 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MULTI_MOVE, OnEvasMultiTouchMoved, &control);
1782 _EflUiEventManager::UnregisterKeyEventHandler(const _Control& control)
1784 result r = E_SUCCESS;
1786 Evas_Object* pEvasObject = GetEvasObject(control);
1787 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1789 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_KEY_UP, OnEvasKeyReleased);
1790 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_KEY_DOWN, OnEvasKeyPressed);
1796 _EflUiEventManager::UnregisterTouchEventHandler(const _Control& control)
1798 result r = E_SUCCESS;
1800 Evas_Object* pEvasObject = GetEvasObject(control);
1801 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1803 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MOUSE_UP, OnEvasTouchReleased);
1804 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MOUSE_DOWN, OnEvasTouchPressed);
1805 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MOUSE_MOVE, OnEvasTouchMoved);
1807 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MULTI_UP, OnEvasMultiTouchReleased);
1808 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MULTI_DOWN, OnEvasMultiTouchPressed);
1809 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MULTI_MOVE, OnEvasMultiTouchMoved);
1815 _EflUiEventManager::PostEvent(const _UiEvent& event)
1819 result r = E_SUCCESS;
1821 _UiEvent* pEvent = event.CloneN();
1822 SysTryReturn(NID_UI, pEvent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1824 Ecore_Event* pEcoreEvent = ecore_event_add(__notificaitonEventType, pEvent, FreeEvent, null);
1825 SysTryReturn(NID_UI, pEcoreEvent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1831 _EflUiEventManager::SetKeyCapture(const _Control& control, _KeyCode keyCode)
1833 Ecore_X_Window win = ecore_evas_software_x11_window_get(ecore_evas_ecore_evas_get(evas_object_evas_get(GetEvasObject(control))));
1835 for (unsigned int i = 0; i < sizeof(keyTable) / sizeof(_EvasConvertKeys); ++i)
1837 if (keyTable[i].code == keyCode)
1839 if (keyTable[i].pName)
1841 utilx_grab_key((Display*)ecore_x_display_get(), win, keyTable[i].pName, TOP_POSITION_GRAB);
1849 _EflUiEventManager::ReleaseKeyCapture(const _Control& control, _KeyCode keyCode)
1851 Ecore_X_Window win = ecore_evas_software_x11_window_get(ecore_evas_ecore_evas_get(evas_object_evas_get(GetEvasObject(control))));
1853 for (unsigned int i = 0; i < sizeof(keyTable) / sizeof(_EvasConvertKeys); ++i)
1855 if (keyTable[i].code == keyCode)
1857 if (keyTable[i].pName)
1859 utilx_ungrab_key((Display*)ecore_x_display_get(), win, keyTable[i].pName);