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
51 #if defined KEY_QUICKPANEL
56 #include <FBaseColIEnumeratorT.h>
57 #include <FBaseSysLog.h>
58 #include "FUi_CoordinateSystemUtils.h"
59 #include "FUi_Control.h"
60 #include "FUi_ControlManager.h"
61 #include "FUi_KeyEventManager.h"
62 #include "FUi_Window.h"
63 #include "FUi_UiEventManager.h"
64 #include "FUi_EflUiEventManager.h"
65 #include "FUi_UiTouchEvent.h"
66 #include "FUi_UiNotificationEvent.h"
67 #include "FUi_UiKeyEvent.h"
68 #include "FUi_UiFocusEvent.h"
69 #include "FUi_EcoreEvasMgr.h"
70 #include "FUi_EcoreEvas.h"
71 #include "FUi_TouchManager.h"
72 #include "FUiAnim_EflNode.h"
73 #include "FUiAnim_ControlVisualElement.h"
74 #include "FUiAnim_RootVisualElement.h"
75 #include "FUiAnim_EflLayer.h"
76 #include "FUi_AccessibilityManager.h"
79 using namespace Tizen::Ui;
80 using namespace Tizen::Ui::Animations;
81 using namespace Tizen::Graphics;
82 using namespace Tizen::Base::Collection;
83 using namespace Tizen::Base;
84 using namespace Tizen::Ui::Controls;
90 Ecore_X_Atom keyboardExist = 0;
91 const wchar_t* KEYBOARD_INSERTED_EVENT = L"KEYBOARD_INSERTED";
92 const int DEVICE_COUNT = 999;
93 bool touchPressed[DEVICE_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_CONTEXT_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_QUICKPANEL, "XF86Tools" }
288 //{ _KEY_SIDE_UP, "XF86AudioRaiseVolume" },
289 //{ _KEY_SIDE_DOWN, "XF86AudioLowerVolume" },
290 //{ _KEY_POWER_HOLD, "XF86PowerOff" },
297 _KeyEvent(KeyState keyState, _KeyCode keyCode, int keyModifier, void* pUserData)
299 , __keyInfo(keyState, keyCode, keyModifier, pUserData)
301 __pTarget = GetTarget(keyCode);
304 virtual ~_KeyEvent(void)
308 static _KeyCode GetKeyCode(const char* pKeyName)
312 SysTryReturn(NID_UI, pKeyName, _KEY_INVALID, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
314 for (unsigned int i = 0; i < sizeof(keyTable) / sizeof(_EvasConvertKeys); ++i)
316 if (strcmp(keyTable[i].pName, pKeyName) == 0)
318 return keyTable[i].code;
325 static int GetKeyModifier(const int keyModifier)
328 unsigned int modifier = _KEY_MODIFIER_NONE;
330 if(ECORE_EVENT_MODIFIER_SHIFT & keyModifier)
332 modifier |= _KEY_MODIFIER_SHIFT;
334 if(ECORE_EVENT_MODIFIER_CTRL & keyModifier)
336 modifier |= _KEY_MODIFIER_CTRL;
338 if(ECORE_EVENT_MODIFIER_ALT & keyModifier)
340 modifier |= _KEY_MODIFIER_ALT;
342 if(ECORE_EVENT_MODIFIER_WIN & keyModifier)
344 modifier |= _KEY_MODIFIER_WIN;
346 if(ECORE_EVENT_MODIFIER_SCROLL & keyModifier)
348 modifier |= _KEY_MODIFIER_SCROLL;
350 if(ECORE_EVENT_MODIFIER_NUM & keyModifier)
352 modifier |= _KEY_MODIFIER_NUM;
354 if(ECORE_EVENT_MODIFIER_CAPS & keyModifier)
356 modifier |= _KEY_MODIFIER_CAPS;
358 if(ECORE_EVENT_LOCK_SCROLL & keyModifier)
360 modifier |= _KEY_LOCK_SCROLL;
362 if(ECORE_EVENT_LOCK_NUM & keyModifier)
364 modifier |= _KEY_LOCK_NUM;
366 if(ECORE_EVENT_LOCK_CAPS & keyModifier)
368 modifier |= _KEY_LOCK_CAPS;
370 if(ECORE_EVENT_LOCK_SHIFT & keyModifier)
372 modifier |= _KEY_LOCK_SHIFT;
374 if(ECORE_EVENT_MODIFIER_ALTGR & keyModifier)
376 modifier |= _KEY_MODIFIER_ALTGR;
383 _KeyEvent(const _KeyEvent& rhs);
384 _KeyEvent& operator =(const _KeyEvent& rhs);
386 virtual result SendImpl(void)
388 SysTryReturn(NID_UI, __pTarget, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
390 _UiKeyEvent event(__pTarget->GetHandle(), __keyInfo);
392 return _pEventManager->SendEvent(event);
395 _Control* GetTarget(_KeyCode keyCode) const
397 _KeyEventManager* pKeyEventManager = _KeyEventManager::GetInstance();
398 SysTryReturn(NID_UI, pKeyEventManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
400 _Control* pControl = pKeyEventManager->GetCapturingControl(keyCode);
402 if (pControl == null)
404 _ControlManager* pControlManager = _ControlManager::GetInstance();
405 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
407 pControl = pControlManager->GetFocusControl();
411 pControl = pControlManager->GetCurrentFrame();
413 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
416 _ControlManager* pControlManager = _ControlManager::GetInstance();
417 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
419 pControl = pControlManager->GetFocusControl();
422 pControl = pControlManager->GetCurrentFrame();
424 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
426 SetLastResult(E_SUCCESS);
436 class _TouchEventManager
439 static _TouchEventManager* GetInstance(void)
441 if (__pInstance == null)
443 __pInstance = new (std::nothrow) _TouchEventManager;
444 SysTryReturn(NID_UI, __pInstance, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
447 SetLastResult(E_SUCCESS);
452 result AddControl(int pointId, const _ControlHandle& controlHandle)
455 result r = E_SUCCESS;
457 __pTargetMap->ContainsKey(pointId, exist);
461 r = __pTargetMap->Remove(pointId);
462 SysTryReturnResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
465 r = __pTargetMap->Add(pointId, controlHandle);
466 SysTryReturnResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
471 _Control* GetControl(int pointId)
473 SysTryReturn(NID_UI, __pTargetMap, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
475 _ControlHandle controlHandle;
477 __pTargetMap->GetValue(pointId, controlHandle);
479 _ControlManager* pControlManager = _ControlManager::GetInstance();
480 result r = GetLastResult();
481 SysTryReturn(NID_UI, pControlManager, null, r, "[%s] Propagating.", GetErrorMessage(r));
483 return pControlManager->GetObject(controlHandle);
487 _TouchEventManager(void)
489 result r = E_SUCCESS;
490 unique_ptr<HashMapT<int, _ControlHandle> > pTargetMap(new (std::nothrow) HashMapT<int, _ControlHandle>);
491 SysTryReturnVoidResult(NID_UI, pTargetMap, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
493 r = pTargetMap->Construct();
494 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
496 __pTargetMap = move(pTargetMap);
498 SetLastResult(E_SUCCESS);
501 ~_TouchEventManager(void)
505 _TouchEventManager(const _TouchEventManager& rhs);
506 _TouchEventManager& operator =(const _TouchEventManager& rhs);
509 static _TouchEventManager* __pInstance;
510 unique_ptr<HashMapT<int, _ControlHandle> > __pTargetMap;
513 _TouchEventManager* _TouchEventManager::__pInstance = null;
519 _TouchEvent(int deviceId, _TouchStatus status, int x, int y, unsigned int timeStamp, const _Control* pRootControl)
520 : __pTouchEventManager(null)
522 __pTouchEventManager = _TouchEventManager::GetInstance();
523 SysTryReturnVoidResult(NID_UI, __pTouchEventManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
525 result r = E_SUCCESS;
526 Tizen::Graphics::Point current(x, y);
528 _TouchManager* pTouchManager = _TouchManager::GetInstance();
529 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
531 unsigned int pointId = 0;
533 if (status == _TOUCH_PRESSED)
535 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
536 SysTryReturnVoidResult(NID_UI, pFingerInfoList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
538 const int count = pFingerInfoList->GetCount();
540 for (int i = 0; i < count; i++)
542 _FingerInfo* pFingerInfo = null;
543 pFingerInfoList->GetAt(i, pFingerInfo);
544 if (pFingerInfo == null)
549 if (static_cast<int>(pFingerInfo->GetDeviceId()) == deviceId && pFingerInfo->GetStatus() == _TOUCH_PRESSED)
551 pTouchManager->ResetTouchInfo();
552 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pFingerInfo->GetPointId());
556 delete pFingerInfoList;
558 pointId = pTouchManager->GeneratePointId(deviceId);
559 SysSecureLog(NID_UI, "OnTouchPressed GeneratePointId = pointId %d", pointId);
563 pointId = pTouchManager->GetPointId(deviceId);
566 if (status == _TOUCH_RELEASED)
568 SysSecureLog(NID_UI, "OnTouchReleased GetPointId = pointId %d", pointId);
571 if (pointId == INVALID_POINT_ID)
573 if (status == _TOUCH_RELEASED)
575 _ControlManager* pControlManager = _ControlManager::GetInstance();
576 SysTryReturnVoidResult(NID_UI, pControlManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
578 _Window* pWindow = pControlManager->GetTouchedWindow();
581 _TouchManager* pTouchManager = _TouchManager::GetInstance();
584 pTouchManager->ResetTouchInfo();
585 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
589 SetLastResult(E_INVALID_CONDITION);
595 r = GetPosition(status, x, y, current);
596 SysTryReturnVoidResult(NID_UI, r != E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
597 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
601 current = _CoordinateSystemUtils::InverseTransform(current);
604 __touchInfo.SetTouchInfo(pointId, status, current, false, timeStamp);
606 if (status == _TOUCH_PRESSED)
608 _Control* pControl = GetTarget(current.x, current.y, pRootControl);
610 if (pControl == null)
612 pTouchManager->ResetTouchInfo();
613 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pointId);
614 SysTryReturnVoidResult(NID_UI, false, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
618 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
619 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
620 SysSecureLog(NID_UI, "touch_pressed : pointId = %d, AddControl = 0x%x", pointId, pControl);
625 _Control* pControl = pTouchManager->GetChangedTouchableTarget();
626 if (pControl == null)
632 if (pControl->GetChangingEventTarget() == true && pControl->GetVisibleState() == true)
634 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
635 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
636 SysSecureLog(NID_UI, "touch_moved, touch_released : pointId = %d, AddControl = 0x%x", pointId, pControl);
642 virtual ~_TouchEvent(void)
647 virtual result SendImpl(void)
649 _Control* pTarget = __pTouchEventManager->GetControl(__touchInfo.GetPointId());
652 if (__touchInfo.GetTouchStatus() == _TOUCH_MOVED)
654 SysLog(NID_UI, "Target is null for the move event, skip sendImpl");
658 _TouchManager* pTouchManager = _TouchManager::GetInstance();
659 pTouchManager->SetTouchCanceled(null);
660 pTouchManager->ResetTouchInfo();
662 SysLog(NID_UI, "ResetTouchInfo");
666 _UiTouchEvent event(pTarget->GetHandle(), __touchInfo);
668 return _pEventManager->SendEvent(event);
672 _TouchEvent(const _TouchEvent& rhs);
673 _TouchEvent& operator =(const _TouchEvent& rhs);
675 _Control* GetTarget(int x, int y, const _Control* pRootControl) const
679 _TouchManager* pTouchManager = _TouchManager::GetInstance();
680 SysTryReturn(NID_UI, pTouchManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
682 _Control* pCapturedControl = pTouchManager->GetCapturedControl();
683 _Control* pControl = null;
685 if (pCapturedControl)
687 if (pTouchManager->IsCaptureAllowedOwnerBounds())
689 if (pTouchManager->IsCaptureAllowedOutOfBounds())
691 pControl = pCapturedControl;
694 _Window * pWindow = dynamic_cast<_Window*>(pCapturedControl);
697 _Control* pOwner = pWindow->GetOwner();
700 Tizen::Graphics::Rectangle ownerRc(pOwner->GetAbsoluteBounds());
701 if ((x >= ownerRc.x) && (x <= (ownerRc.x + ownerRc.width)) && (y >= ownerRc.y) && (y <= (ownerRc.y + ownerRc.height)))
708 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
709 if ((x >= rc.x) && (x <= (rc.x + rc.width)) && (y >= rc.y) && (y <= (rc.y + rc.height)))
711 pControl = pCapturedControl;
716 if (pTouchManager->IsCaptureAllowedOutOfBounds())
718 pControl = pCapturedControl;
722 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
724 if ((x < rc.x) || (x > (rc.x + rc.width)) || (y < rc.y) || (y > (rc.y + rc.height)))
726 pControl = pCapturedControl;
731 if (pControl != null)
737 _ControlManager* pControlManager = _ControlManager::GetInstance();
738 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
740 Tizen::Graphics::FloatPoint ptf(static_cast<float>(x), static_cast<float>(y));
742 _ControlVisualElement* pRootControlElement = null;
745 pRootControlElement = dynamic_cast<_ControlVisualElement*>(pRootControl->GetVisualElement());
749 _Window* pWindow = null;
750 pWindow = pControlManager->GetTouchedWindow();
751 SysTryReturn(NID_UI, pWindow, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
753 Rectangle winBounds = pWindow->GetBounds();
755 ptf.x = static_cast<float>(x - winBounds.x);
756 ptf.y = static_cast<float>(y - winBounds.y);
758 pRootControlElement = dynamic_cast <_ControlVisualElement*>(pWindow->GetVisualElement());
761 SysTryReturn(NID_UI, pRootControlElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
763 _ControlVisualElement* pControlVisualElement = pRootControlElement->GetControlChildAtPoint(ptf);
764 SysTryReturn(NID_UI, pControlVisualElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
766 pControl = static_cast <_Control*>(pControlVisualElement->GetUserData());
767 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
772 result GetPosition(_TouchStatus status, int x, int y, Point& point) const
774 result r = E_SUCCESS;
776 _ControlManager* pControlManager = _ControlManager::GetInstance();
777 SysTryReturn(NID_UI, pControlManager, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
779 _Window* pWindow = pControlManager->GetTouchedWindow();
782 _TouchManager* pTouchManager = _TouchManager::GetInstance();
785 pTouchManager->ResetTouchInfo();
786 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
789 SysTryReturn(NID_UI, pWindow, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
791 _RootVisualElement* pRootVE = pWindow->GetRootVisualElement();
792 SysTryReturn(NID_UI, pRootVE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
794 _EflLayer* pLayer = static_cast<_EflLayer*>(pRootVE->GetNativeLayer());
795 SysTryReturn(NID_UI, pLayer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
797 Ecore_Evas* pEE = pLayer->GetEcoreEvas();
798 SysTryReturn(NID_UI, pEE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
800 const int PORTRAIT = 0;
801 const int LANDSCAPE = 270;
802 const int PORTRAIT_REVERSE = 180;
803 const int LANDSCAPE_REVERSE = 90;
805 Dimension dimension = pControlManager->GetScreenSize();
806 Point output(_CoordinateSystemUtils::InverseTransform(point));
807 int rotation = ecore_evas_rotation_get(pEE);
818 point.y = dimension.width - output.x;
821 case PORTRAIT_REVERSE:
822 point.x = dimension.width - output.x;
823 point.y = dimension.height - output.y;
826 case LANDSCAPE_REVERSE:
827 point.x = dimension.height - output.y;
832 SysAssertf(0, "[E_SYSTEM][%d]", rotation);
841 _TouchInfo __touchInfo;
842 _TouchEventManager* __pTouchEventManager;
849 _MouseEvent(int deviceId, _TouchStatus status, int x, int y, int z, unsigned int buttons, unsigned int timeStamp, const _Control* pRootControl)
850 : __pTouchEventManager(null)
852 __pTouchEventManager = _TouchEventManager::GetInstance();
853 SysTryReturnVoidResult(NID_UI, __pTouchEventManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
855 result r = E_SUCCESS;
856 Tizen::Graphics::Point current(x, y);
858 _TouchManager* pTouchManager = _TouchManager::GetInstance();
859 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
861 unsigned int pointId = 0;
863 if (status == _TOUCH_PRESSED)
865 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
866 SysTryReturnVoidResult(NID_UI, pFingerInfoList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
868 const int count = pFingerInfoList->GetCount();
870 for (int i = 0; i < count; i++)
872 _FingerInfo* pFingerInfo = null;
873 pFingerInfoList->GetAt(i, pFingerInfo);
874 if (pFingerInfo == null)
879 if (static_cast<int>(pFingerInfo->GetDeviceId()) == deviceId && pFingerInfo->GetStatus() == _TOUCH_PRESSED)
881 pTouchManager->ResetTouchInfo();
882 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pFingerInfo->GetPointId());
886 delete pFingerInfoList;
888 pointId = pTouchManager->GeneratePointId(deviceId);
892 pointId = pTouchManager->GetPointId(deviceId);
895 if (pointId == INVALID_POINT_ID)
897 if (status == _TOUCH_RELEASED)
899 _ControlManager* pControlManager = _ControlManager::GetInstance();
900 SysTryReturnVoidResult(NID_UI, pControlManager, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
902 _Window* pWindow = pControlManager->GetTouchedWindow();
905 _TouchManager* pTouchManager = _TouchManager::GetInstance();
908 pTouchManager->ResetTouchInfo();
909 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
913 SetLastResult(E_INVALID_CONDITION);
919 r = GetPosition(status, x, y, current);
920 SysTryReturnVoidResult(NID_UI, r != E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
921 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
925 current = _CoordinateSystemUtils::InverseTransform(current);
928 __mouseInfo.SetTouchInfo(pointId, status, current, z, buttons, false, timeStamp);
930 if (status == _TOUCH_PRESSED)
932 _Control* pControl = GetTarget(current.x, current.y, pRootControl);
934 if (pControl == null)
936 pTouchManager->ResetTouchInfo();
937 SysSecureLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pointId);
938 SysTryReturnVoidResult(NID_UI, false, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
942 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
943 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
948 _Control* pControl = pTouchManager->GetChangedTouchableTarget();
949 if (pControl == null)
955 if (pControl->GetChangingEventTarget() == true && pControl->GetVisibleState() == true)
957 r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
958 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
964 virtual ~_MouseEvent(void)
969 virtual result SendImpl(void)
971 _Control* pTarget = __pTouchEventManager->GetControl(__mouseInfo.GetPointId());
974 _TouchManager* pTouchManager = _TouchManager::GetInstance();
975 pTouchManager->ResetTouchInfo();
977 SysLog(NID_UI, "ResetTouchInfo");
981 _UiMouseEvent event(pTarget->GetHandle(), __mouseInfo);
983 return _pEventManager->SendEvent(event);
987 _MouseEvent(const _MouseEvent& rhs);
988 _MouseEvent& operator =(const _MouseEvent& rhs);
990 _Control* GetTarget(int x, int y, const _Control* pRootControl) const
994 _TouchManager* pTouchManager = _TouchManager::GetInstance();
995 SysTryReturn(NID_UI, pTouchManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
997 _Control* pCapturedControl = pTouchManager->GetCapturedControl();
998 _Control* pControl = null;
1000 if (pCapturedControl)
1002 if (pTouchManager->IsCaptureAllowedOwnerBounds())
1004 if (pTouchManager->IsCaptureAllowedOutOfBounds())
1006 pControl = pCapturedControl;
1009 _Window * pWindow = dynamic_cast<_Window*>(pCapturedControl);
1012 _Control* pOwner = pWindow->GetOwner();
1015 Tizen::Graphics::Rectangle ownerRc(pOwner->GetAbsoluteBounds());
1016 if ((x >= ownerRc.x) && (x <= (ownerRc.x + ownerRc.width)) && (y >= ownerRc.y) && (y <= (ownerRc.y + ownerRc.height)))
1023 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
1024 if ((x >= rc.x) && (x <= (rc.x + rc.width)) && (y >= rc.y) && (y <= (rc.y + rc.height)))
1026 pControl = pCapturedControl;
1031 if (pTouchManager->IsCaptureAllowedOutOfBounds())
1033 pControl = pCapturedControl;
1037 Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
1039 if ((x < rc.x) || (x > (rc.x + rc.width)) || (y < rc.y) || (y > (rc.y + rc.height)))
1041 pControl = pCapturedControl;
1046 if (pControl != null)
1052 _ControlManager* pControlManager = _ControlManager::GetInstance();
1053 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1055 Tizen::Graphics::FloatPoint ptf(static_cast<float>(x), static_cast<float>(y));
1057 _ControlVisualElement* pRootControlElement = null;
1060 pRootControlElement = dynamic_cast<_ControlVisualElement*>(pRootControl->GetVisualElement());
1064 _Window* pWindow = null;
1065 pWindow = pControlManager->GetTouchedWindow();
1066 SysTryReturn(NID_UI, pWindow, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1068 Rectangle winBounds = pWindow->GetBounds();
1070 ptf.x = static_cast<float>(x - winBounds.x);
1071 ptf.y = static_cast<float>(y - winBounds.y);
1073 pRootControlElement = dynamic_cast <_ControlVisualElement*>(pWindow->GetVisualElement());
1076 SysTryReturn(NID_UI, pRootControlElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1078 _ControlVisualElement* pControlVisualElement = pRootControlElement->GetControlChildAtPoint(ptf);
1079 SysTryReturn(NID_UI, pControlVisualElement, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1081 pControl = static_cast <_Control*>(pControlVisualElement->GetUserData());
1082 SysTryReturn(NID_UI, pControl, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1087 result GetPosition(_TouchStatus status, int x, int y, Point& point) const
1089 result r = E_SUCCESS;
1091 _ControlManager* pControlManager = _ControlManager::GetInstance();
1092 SysTryReturn(NID_UI, pControlManager, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1094 _Window* pWindow = pControlManager->GetTouchedWindow();
1095 if (pWindow == null)
1097 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1100 pTouchManager->ResetTouchInfo();
1101 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
1104 SysTryReturn(NID_UI, pWindow, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] A system error occurred.");
1106 _RootVisualElement* pRootVE = pWindow->GetRootVisualElement();
1107 SysTryReturn(NID_UI, pRootVE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1109 _EflLayer* pLayer = static_cast<_EflLayer*>(pRootVE->GetNativeLayer());
1110 SysTryReturn(NID_UI, pLayer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1112 Ecore_Evas* pEE = pLayer->GetEcoreEvas();
1113 SysTryReturn(NID_UI, pEE, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1115 const int PORTRAIT = 0;
1116 const int LANDSCAPE = 270;
1117 const int PORTRAIT_REVERSE = 180;
1118 const int LANDSCAPE_REVERSE = 90;
1120 Dimension dimension = pControlManager->GetScreenSize();
1121 Point output(_CoordinateSystemUtils::InverseTransform(point));
1122 int rotation = ecore_evas_rotation_get(pEE);
1133 point.y = dimension.width - output.x;
1136 case PORTRAIT_REVERSE:
1137 point.x = dimension.width - output.x;
1138 point.y = dimension.height - output.y;
1141 case LANDSCAPE_REVERSE:
1142 point.x = dimension.height - output.y;
1147 SysAssertf(0, "[E_SYSTEM][%d]", rotation);
1156 _MouseInfo __mouseInfo;
1157 _TouchEventManager* __pTouchEventManager;
1161 OnNotified(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1165 _UiEvent* pUiEvent = static_cast <_UiEvent*>(pEventInfo);
1166 SysTryReturn(NID_UI, pUiEvent, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1168 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
1169 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1171 result r = pEventManager->SendEvent(*pUiEvent);
1172 SysTryReturn(NID_UI, r == E_SUCCESS, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1175 SetLastResult(E_SUCCESS);
1177 return ECORE_CALLBACK_PASS_ON;
1181 FreeEvent(void* pData __UNUSED__, void* pEventInfo)
1183 _UiEvent* pUiEvent = static_cast <_UiEvent*>(pEventInfo);
1191 OnKeyPressed(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1193 Ecore_Event_Key* pEv = static_cast <Ecore_Event_Key*>(pEventInfo);
1194 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1196 if (_KeyEvent::GetKeyCode(pEv->keyname) == _KEY_INVALID)
1198 SysLog(NID_UI, "KeyCode is Invalid");
1199 return ECORE_CALLBACK_PASS_ON;
1202 _KeyEvent event(KEY_PRESSED, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers), pEv);
1203 SysSecureLog(NID_UI, "KeyName = %s, KeyCode = %d, KeyModifier = %x", pEv->keyname, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers));
1206 SetLastResult(E_SUCCESS);
1208 return ECORE_CALLBACK_PASS_ON;
1212 OnKeyReleased(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1214 Ecore_Event_Key* pEv = static_cast <Ecore_Event_Key*>(pEventInfo);
1215 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1217 if (_KeyEvent::GetKeyCode(pEv->keyname) == _KEY_INVALID)
1219 SysLog(NID_UI, "KeyCode is Invalid");
1220 return ECORE_CALLBACK_PASS_ON;
1223 _KeyEvent event(KEY_RELEASED, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers), pEv);
1224 SysSecureLog(NID_UI, "KeyName = %s, KeyCode = %d, KeyModifier = %x", pEv->keyname, _KeyEvent::GetKeyCode(pEv->keyname), _KeyEvent::GetKeyModifier(pEv->modifiers));
1227 SetLastResult(E_SUCCESS);
1229 return ECORE_CALLBACK_PASS_ON;
1233 OnClipboardMessageReceived(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1235 Ecore_X_Event_Client_Message *pEv = static_cast<Ecore_X_Event_Client_Message*>(pEventInfo);
1237 if (pEv->message_type != ecore_x_atom_get("CBHM_MSG"))
1239 return ECORE_CALLBACK_PASS_ON;
1242 if (!strcmp("SET_OWNER", pEv->data.b))
1244 _KeyEvent event(KEY_PRESSED, _KEY_OEM_1, 0, pEv);
1245 SysSecureLog(NID_UI, "KeyName = clipboard, KeyCode = _KEY_OEM_1, KeyModifier = 0");
1248 SetLastResult(E_SUCCESS);
1251 return ECORE_CALLBACK_PASS_ON;
1256 OnTouchPressed(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1258 Ecore_Event_Mouse_Button* pEv = static_cast <Ecore_Event_Mouse_Button*>(pEventInfo);
1259 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1261 SysSecureLog(NID_UI, "OnTouchPressed - x(%d), y(%d), deviceId(%d), buttons(%d)", pEv->root.x, pEv->root.y, pEv->multi.device, pEv->buttons);
1263 _ControlManager* pControlManager = _ControlManager::GetInstance();
1264 SysTryReturn(NID_UI, pControlManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1266 pControlManager->SetTouchedWindow((unsigned int)pEv->window);
1268 if (touchPressed[pEv->multi.device] == true)
1270 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1273 pTouchManager->SetTouchCanceled(null);
1274 SysLog(NID_UI, "pWindow is null, CancelTouch");
1276 for(int i=0; i<DEVICE_COUNT; i++)
1278 touchPressed[pEv->multi.device] = false;
1281 pTouchManager->ResetTouchInfo();
1282 SysLog(NID_UI, "pWindow is null, ResetTouchInfo");
1286 touchPressed[pEv->multi.device] = true;
1288 if (pEv->buttons == _MOUSE_BUTTON_LEFT || pEv->buttons == _MOUSE_BUTTON_NONE)
1290 _TouchEvent event(pEv->multi.device, _TOUCH_PRESSED, pEv->root.x, pEv->root.y, pEv->timestamp, null);
1292 result r = GetLastResult();
1295 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1296 return ECORE_CALLBACK_PASS_ON;
1303 //_MouseEvent event(pEv->multi.device, _TOUCH_PRESSED, pEv->root.x, pEv->root.y, 0, pEv->buttons, pEv->timestamp, null);
1304 _MouseEvent event(pEv->multi.device, _TOUCH_PRESSED, pEv->root.x, pEv->root.y, 0, _MOUSE_BUTTON_RIGHT, pEv->timestamp, null);
1306 result r = GetLastResult();
1309 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1310 return ECORE_CALLBACK_PASS_ON;
1315 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
1316 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1318 pEventManager->GenerateKeyEvent(KEY_PRESSED, _KEY_OEM_2, _KEY_MODIFIER_NONE, false);
1319 pEventManager->GenerateKeyEvent(KEY_RELEASED, _KEY_OEM_2, _KEY_MODIFIER_NONE, false);
1322 SetLastResult(E_SUCCESS);
1324 return ECORE_CALLBACK_PASS_ON;
1328 OnTouchReleased(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1330 Ecore_Event_Mouse_Button* pEv = static_cast <Ecore_Event_Mouse_Button*>(pEventInfo);
1331 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1333 SysSecureLog(NID_UI, "OnTouchReleased - x(%d), y(%d), deviceId(%d) buttons(%d)", pEv->root.x, pEv->root.y, pEv->multi.device, pEv->buttons);
1335 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1336 SysTryReturn(NID_UI, pTouchManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] _TouchManager does not exist.");
1338 touchPressed[pEv->multi.device] = false;
1340 if (pEv->buttons == _MOUSE_BUTTON_LEFT || pEv->buttons == _MOUSE_BUTTON_NONE)
1342 _TouchEvent event(pEv->multi.device, _TOUCH_RELEASED, pEv->root.x, pEv->root.y, pEv->timestamp, null);
1344 result r = GetLastResult();
1347 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1348 return ECORE_CALLBACK_PASS_ON;
1355 //_MouseEvent event(pEv->multi.device, _TOUCH_RELEASED, pEv->root.x, pEv->root.y, 0, pEv->buttons, pEv->timestamp, null);
1356 _MouseEvent event(pEv->multi.device, _TOUCH_RELEASED, pEv->root.x, pEv->root.y, 0, _MOUSE_BUTTON_RIGHT, pEv->timestamp, null);
1359 result r = GetLastResult();
1362 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1363 return ECORE_CALLBACK_PASS_ON;
1368 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1371 pTouchManager->ResetTouchInfo();
1372 SysLog(NID_UI, "ResetTouchInfo");
1376 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
1377 SysTryReturn(NID_UI, pFingerInfoList, ECORE_CALLBACK_PASS_ON, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1379 int count = pFingerInfoList->GetCount();
1381 for (int i = 0; i < count; i++)
1383 _FingerInfo* pFingerInfo = null;
1384 pFingerInfoList->GetAt(i, pFingerInfo);
1385 if (pFingerInfo == null)
1390 if (static_cast<int>(pFingerInfo->GetDeviceId()) == pEv->multi.device)
1392 pFingerInfo->SetPointId(INVALID_POINT_ID);
1396 delete pFingerInfoList;
1398 pTouchManager->SetChangedTouchableTarget(null);
1400 SetLastResult(E_SUCCESS);
1401 return ECORE_CALLBACK_PASS_ON;
1405 OnTouchMoved(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1407 Ecore_Event_Mouse_Move* pEv = static_cast <Ecore_Event_Mouse_Move*>(pEventInfo);
1408 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1410 //SysSecureLog(NID_UI, "OnTouchMoved - x(%d), y(%d), deviceId(%d)", pEv->root.x, pEv->root.y, pEv->multi.device);
1411 _TouchEvent event(pEv->multi.device, _TOUCH_MOVED, pEv->root.x, pEv->root.y, pEv->timestamp, null);
1413 result r = GetLastResult();
1416 return ECORE_CALLBACK_PASS_ON;
1421 SetLastResult(E_SUCCESS);
1423 return ECORE_CALLBACK_PASS_ON;
1427 OnMouseWheeled(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1429 _Ecore_Event_Mouse_Wheel* pEv = static_cast <_Ecore_Event_Mouse_Wheel*>(pEventInfo);
1430 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1432 SysSecureLog(NID_UI, "OnMouseWheeled - x(%d), y(%d), z(%d)", pEv->root.x, pEv->root.y, pEv->z);
1433 _MouseEvent event(0, _WHEEL_MOVED, pEv->root.x, pEv->root.y, pEv->z, _MOUSE_BUTTON_NONE, pEv->timestamp, null);
1435 result r = GetLastResult();
1438 return ECORE_CALLBACK_PASS_ON;
1443 SetLastResult(E_SUCCESS);
1445 return ECORE_CALLBACK_PASS_ON;
1449 OnKeyboardInserted(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1451 Ecore_X_Event_Window_Property *pEv = static_cast <Ecore_X_Event_Window_Property*>(pEventInfo);
1452 if ( pEv->atom != keyboardExist)
1454 // SysLog(NID_UI, "OnKeyboardInserted - atom of event(%d), keyboardExist(%d)", pEv->atom, keyboardExist);
1455 return ECORE_CALLBACK_PASS_ON;
1458 ArrayList* pArgs = null;
1459 result r = E_SUCCESS;
1460 Boolean* pIsKeyboardOn = null;
1461 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
1462 SysTryReturn(NID_UI, pEventManager, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1464 _Control* pControl = _ControlManager::GetInstance()->GetFocusControl();
1465 SysTryReturn(NID_UI, pControl, ECORE_CALLBACK_PASS_ON, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1467 bool isKeyboardOn = false;
1468 unsigned int value = 0;
1469 int returnResult = -1;
1471 returnResult = ecore_x_window_prop_card32_get(pEv->win, keyboardExist, &value, 1);
1476 isKeyboardOn = true;
1479 pArgs = new (std::nothrow) ArrayList;
1480 SysTryReturn(NID_UI, pArgs, ECORE_CALLBACK_PASS_ON, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1482 r = pArgs->Construct();
1483 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1485 String* pString = new (std::nothrow) String(KEYBOARD_INSERTED_EVENT);
1486 r = pArgs->Add(*pString);
1487 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1489 pIsKeyboardOn = new (std::nothrow) Boolean(isKeyboardOn);
1490 r = pArgs->Add(*pIsKeyboardOn);
1491 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1493 _UiNotificationEvent event(pControl->GetHandle(), pArgs);
1494 r = pEventManager->SendEvent(event);
1495 // SysLog(NID_UI, "OnKeyboardInserted - sent keyboard inserted noti");
1500 return ECORE_CALLBACK_PASS_ON;
1510 delete pIsKeyboardOn;
1513 return ECORE_CALLBACK_PASS_ON;
1517 OnWindowFocusIn(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1519 SysLog(NID_UI, "Enter");
1521 Ecore_X_Event_Window_Focus_In* pEv = static_cast<Ecore_X_Event_Window_Focus_In*>(pEventInfo);
1522 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1524 _ControlManager* pControlManager = _ControlManager::GetInstance();
1525 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1527 int count = pControlManager->GetWindowCount();
1529 _Control* pFocusedControl = null;
1530 for (int i = count - 1; i >= 0; --i)
1532 _Window* pWindow = pControlManager->GetWindow(i);
1535 NativeWindowHandle nativeWindowHandle = pWindow->GetNativeHandle();
1536 if (pEv->win == nativeWindowHandle)
1538 pFocusedControl = pWindow->GetFocusControl();
1540 if (pFocusedControl)
1542 pFocusedControl->SetFocused();
1548 _AccessibilityManager::GetInstance()->RequestAutoReading(_ACCESSIBILITY_AUTO_READING_MODE_FIRST_ITEM);
1549 return ECORE_CALLBACK_PASS_ON;
1553 OnWindowFocusOut(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
1555 SysLog(NID_UI, "Enter");
1557 Ecore_X_Event_Window_Focus_Out* pEv = static_cast<Ecore_X_Event_Window_Focus_Out*>(pEventInfo);
1558 SysTryReturn(NID_UI, pEv, ECORE_CALLBACK_PASS_ON, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1560 _ControlManager* pControlManager = _ControlManager::GetInstance();
1561 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1563 _Control* pFocusedControl = pControlManager->GetFocusControl();
1564 if (pFocusedControl)
1566 _Window* pRootWindow = pFocusedControl->GetRootWindow();
1569 NativeWindowHandle nativeWindowHandle = pRootWindow->GetNativeHandle();
1570 if (pEv->win == nativeWindowHandle)
1572 pControlManager->TakeFocusFromControl(*pFocusedControl);
1576 _AccessibilityManager::GetInstance()->RequestAutoReading(_ACCESSIBILITY_AUTO_READING_MODE_RESET);
1577 return ECORE_CALLBACK_PASS_ON;
1582 OnEvasKeyPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1584 Evas_Event_Key_Down* pEv = static_cast <Evas_Event_Key_Down*>(pEventInfo);
1585 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1587 SetLastResult(E_SUCCESS);
1591 OnEvasKeyReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1593 Evas_Event_Key_Up* pEv = static_cast <Evas_Event_Key_Up*>(pEventInfo);
1594 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1596 SetLastResult(E_SUCCESS);
1600 OnEvasTouchPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1602 Evas_Event_Mouse_Down* pEv = static_cast <Evas_Event_Mouse_Down*>(pEventInfo);
1603 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1605 _Control* pControl = static_cast<_Control*>(pData);
1606 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1608 SysSecureLog(NID_UI, "OnEvasTouchPressed - x(%d), y(%d)", pEv->canvas.x, pEv->canvas.y);
1609 _TouchEvent event(0, _TOUCH_PRESSED, pEv->canvas.x, pEv->canvas.y, pEv->timestamp, pControl);
1611 result r = GetLastResult();
1614 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1620 SetLastResult(E_SUCCESS);
1624 OnEvasTouchReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1626 Evas_Event_Mouse_Up* pEv = static_cast <Evas_Event_Mouse_Up*>(pEventInfo);
1627 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1629 _Control* pControl = static_cast<_Control*>(pData);
1630 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1632 SysSecureLog(NID_UI, "OnEvasTouchReleased - x(%d), y(%d)", pEv->canvas.x, pEv->canvas.y);
1633 _TouchEvent event(0, _TOUCH_RELEASED, pEv->canvas.x, pEv->canvas.y, pEv->timestamp, pControl);
1635 result r = GetLastResult();
1638 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1644 SetLastResult(E_SUCCESS);
1648 OnEvasTouchMoved(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1650 Evas_Event_Mouse_Move* pEv = static_cast <Evas_Event_Mouse_Move*>(pEventInfo);
1651 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1653 _Control* pControl = static_cast<_Control*>(pData);
1654 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1656 SysSecureLog(NID_UI, "OnEvasTouchMoved - x(%d), y(%d)", pEv->cur.canvas.x, pEv->cur.canvas.x);
1657 _TouchEvent event(0, _TOUCH_MOVED, pEv->cur.canvas.x, pEv->cur.canvas.y, pEv->timestamp, pControl);
1659 result r = GetLastResult();
1662 SysLog(NID_UI, "[%s] Propagating.", GetErrorMessage(r));
1668 SetLastResult(E_SUCCESS);
1672 OnEvasMultiTouchPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1674 Evas_Event_Multi_Down* pEv = static_cast <Evas_Event_Multi_Down*>(pEventInfo);
1675 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1677 SetLastResult(E_SUCCESS);
1681 OnEvasMultiTouchReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1683 Evas_Event_Multi_Up* pEv = static_cast <Evas_Event_Multi_Up*>(pEventInfo);
1684 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1686 SetLastResult(E_SUCCESS);
1690 OnEvasMultiTouchMoved(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEventInfo)
1692 Evas_Event_Multi_Move* pEv = static_cast <Evas_Event_Multi_Move*>(pEventInfo);
1693 SysTryReturnVoidResult(NID_UI, pEv, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1695 SetLastResult(E_SUCCESS);
1700 namespace Tizen { namespace Ui
1703 _EflUiEventManager::_EflUiEventManager(void)
1704 : __notificaitonEventType(-1)
1706 unique_ptr<LinkedListT<Ecore_Event_Handler*> > pEventHandlers(new (std::nothrow) LinkedListT<Ecore_Event_Handler*>);
1707 SysTryReturnVoidResult(NID_UI, pEventHandlers, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
1710 __notificaitonEventType = ecore_event_type_new();
1711 SysTryReturnVoidResult(NID_UI, __notificaitonEventType >= 1, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1713 Ecore_Event_Handler* pEventHandler = ecore_event_handler_add(__notificaitonEventType, OnNotified, null);
1714 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1716 pEventHandlers->Add(pEventHandler);
1719 pEventHandler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, OnKeyPressed, null);
1720 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1722 pEventHandlers->Add(pEventHandler);
1724 pEventHandler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, OnKeyReleased, null);
1725 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1727 pEventHandlers->Add(pEventHandler);
1730 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, OnClipboardMessageReceived, null);
1731 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1733 pEventHandlers->Add(pEventHandler);
1736 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, OnTouchPressed, null);
1737 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1739 pEventHandlers->Add(pEventHandler);
1741 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, OnTouchReleased, null);
1742 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1744 pEventHandlers->Add(pEventHandler);
1746 pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, OnTouchMoved, null);
1747 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1749 pEventHandlers->Add(pEventHandler);
1752 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, OnKeyboardInserted, null);
1753 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1755 pEventHandlers->Add(pEventHandler);
1758 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, OnWindowFocusIn, null);
1759 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1761 pEventHandlers->Add(pEventHandler);
1763 pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, OnWindowFocusOut, null);
1764 SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1766 pEventHandlers->Add(pEventHandler);
1768 __pEventHandlers = move(pEventHandlers);
1770 keyboardExist = XInternAtom(static_cast<Display*>(ecore_x_display_get()), "X External Keyboard Exist", 0);
1772 SetLastResult(E_SUCCESS);
1775 _EflUiEventManager::~_EflUiEventManager(void)
1777 Tizen::Base::Collection::IEnumeratorT<Ecore_Event_Handler*>* pEnumerator = __pEventHandlers->GetEnumeratorN();
1778 SysTryReturnVoidResult(NID_UI, pEnumerator, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
1780 while (pEnumerator->MoveNext() == E_SUCCESS)
1782 Ecore_Event_Handler* pEventHandler = null;
1783 pEnumerator->GetCurrent(pEventHandler);
1786 ecore_event_handler_del(pEventHandler);
1794 _EflUiEventManager::RegisterKeyEventHandler(const _Control& control)
1796 result r = E_SUCCESS;
1798 Evas_Object* pEvasObject = GetEvasObject(control);
1799 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1801 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_KEY_UP, OnEvasKeyReleased, &control);
1802 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_KEY_DOWN, OnEvasKeyPressed, &control);
1808 _EflUiEventManager::RegisterTouchEventHandler(const _Control& control)
1810 result r = E_SUCCESS;
1812 Evas_Object* pEvasObject = GetEvasObject(control);
1813 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1815 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MOUSE_UP, OnEvasTouchReleased, &control);
1816 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MOUSE_DOWN, OnEvasTouchPressed, &control);
1817 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MOUSE_MOVE, OnEvasTouchMoved, &control);
1819 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MULTI_UP, OnEvasMultiTouchReleased, &control);
1820 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MULTI_DOWN, OnEvasMultiTouchPressed, &control);
1821 evas_object_event_callback_add(pEvasObject, EVAS_CALLBACK_MULTI_MOVE, OnEvasMultiTouchMoved, &control);
1827 _EflUiEventManager::UnregisterKeyEventHandler(const _Control& control)
1829 result r = E_SUCCESS;
1831 Evas_Object* pEvasObject = GetEvasObject(control);
1832 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1834 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_KEY_UP, OnEvasKeyReleased);
1835 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_KEY_DOWN, OnEvasKeyPressed);
1841 _EflUiEventManager::UnregisterTouchEventHandler(const _Control& control)
1843 result r = E_SUCCESS;
1845 Evas_Object* pEvasObject = GetEvasObject(control);
1846 SysTryReturn(NID_UI, pEvasObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1848 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MOUSE_UP, OnEvasTouchReleased);
1849 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MOUSE_DOWN, OnEvasTouchPressed);
1850 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MOUSE_MOVE, OnEvasTouchMoved);
1852 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MULTI_UP, OnEvasMultiTouchReleased);
1853 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MULTI_DOWN, OnEvasMultiTouchPressed);
1854 evas_object_event_callback_del(pEvasObject, EVAS_CALLBACK_MULTI_MOVE, OnEvasMultiTouchMoved);
1860 _EflUiEventManager::PostEvent(const _UiEvent& event)
1864 result r = E_SUCCESS;
1866 _UiEvent* pEvent = event.CloneN();
1867 SysTryReturn(NID_UI, pEvent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1869 Ecore_Event* pEcoreEvent = ecore_event_add(__notificaitonEventType, pEvent, FreeEvent, null);
1870 SysTryReturn(NID_UI, pEcoreEvent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
1876 _EflUiEventManager::SetKeyCapture(const _Control& control, _KeyCode keyCode)
1878 Ecore_X_Window win = ecore_evas_software_x11_window_get(ecore_evas_ecore_evas_get(evas_object_evas_get(GetEvasObject(control))));
1880 for (unsigned int i = 0; i < sizeof(keyTable) / sizeof(_EvasConvertKeys); ++i)
1882 if (keyTable[i].code == keyCode)
1884 if (keyTable[i].pName)
1886 utilx_grab_key((Display*)ecore_x_display_get(), win, keyTable[i].pName, TOP_POSITION_GRAB);
1894 _EflUiEventManager::ReleaseKeyCapture(const _Control& control, _KeyCode keyCode)
1896 Ecore_X_Window win = ecore_evas_software_x11_window_get(ecore_evas_ecore_evas_get(evas_object_evas_get(GetEvasObject(control))));
1898 for (unsigned int i = 0; i < sizeof(keyTable) / sizeof(_EvasConvertKeys); ++i)
1900 if (keyTable[i].code == keyCode)
1902 if (keyTable[i].pName)
1904 utilx_ungrab_key((Display*)ecore_x_display_get(), win, keyTable[i].pName);