void HKUserInterface::OnInputEvent(HKInputManager &manager, const HKInputManager::EventInfo &ev) { HKWidget *pFocusWidget = pFocusList[ev.pSource->sourceID]; if(ev.pSource->device == IDD_Mouse || ev.pSource->device == IDD_TouchPanel) { // positional events will be sent to the hierarchy MFVector pos = { ev.hover.x, ev.hover.y, 0.f, 1.f }; MFVector dir = { 0.f, 0.f, 1.f, 1.f }; MFVector localPos; HKWidget *pWidget = NULL; if(pFocusWidget) { pWidget = pFocusWidget->IntersectWidget(pos, dir, &localPos); if(!pWidget) pWidget = pFocusWidget; } else { pWidget = pRoot->IntersectWidget(pos, dir, &localPos); } // update the down widget if(ev.ev == HKInputManager::IE_Down) pDownOver[ev.pSource->sourceID] = pWidget; else if(ev.ev == HKInputManager::IE_Tap) { // if we receive a tap event, check that it was on the same widget we recorded the down event for if(pDownOver[ev.pSource->sourceID] != pWidget) return; } // check if the hover has changed HKWidget *pHover = pHoverList[ev.pSource->sourceID]; if(pHover != pWidget) { pHoverList[ev.pSource->sourceID] = pWidget; if(pHover) { HKWidgetInputEvent ie(pHover, ev.pSource); pHover->OnHoverOut(*pHover, ie); } if(pWidget) { HKWidgetInputEvent ie(pWidget, ev.pSource); pWidget->OnHoverOver(*pWidget, ie); } } if(pWidget) { HKInputManager::EventInfo transformedEv = ev; LocaliseInput(transformedEv, pWidget, localPos); // send the input event if(pWidget->InputEvent(manager, transformedEv)) return; } } else if(pFocusWidget) { // non-positional events pFocusWidget->InputEvent(manager, ev); } }