bool NewEventHandler::handlePointerDownEvent(const WebPointerEvent& event) { // In principle, we shouldn't get another pointer down for the same // pointer ID, but for mice, we don't get a pointer cancel when you // drag outside the window frame on Linux. For now, send the pointer // cancel at this point. bool alreadyDown = m_stateForPointer.find(event.pointer) != m_stateForPointer.end(); if (event.kind == WebPointerEvent::Mouse && alreadyDown) { WebPointerEvent fakeCancel = event; fakeCancel.type = WebInputEvent::PointerCancel; handlePointerCancelEvent(fakeCancel); } DCHECK(!alreadyDown) << "Pointer id " << event.pointer << "already down!"; HitTestResult hitTestResult = performHitTest(positionForEvent(event)); RefPtr<Node> target = targetForHitTestResult(hitTestResult); if (!target) return false; PointerState& state = m_stateForPointer[event.pointer]; state.target = target; bool eventSwallowed = !dispatchPointerEvent(state, event); // TODO(abarth): Set the target for the pointer to something determined when // dispatching the event. updateSelectionForPointerDown(hitTestResult, event); return eventSwallowed; }
bool NewEventHandler::handlePointerMoveEvent(const WebPointerEvent& event) { auto it = m_stateForPointer.find(event.pointer); if (it == m_stateForPointer.end()) return false; PointerState& state = it->second; ASSERT(state.target); return dispatchPointerEvent(state, event); }
bool NewEventHandler::handlePointerCancelEvent(const WebPointerEvent& event) { auto it = m_stateForPointer.find(event.pointer); if (it == m_stateForPointer.end()) return false; PointerState stateCopy = it->second; m_stateForPointer.erase(it); ASSERT(stateCopy.target); return dispatchPointerEvent(stateCopy, event); }
bool NewEventHandler::handlePointerUpEvent(const WebPointerEvent& event) { auto it = m_stateForPointer.find(event.pointer); if (it == m_stateForPointer.end()) return false; PointerState stateCopy = it->second; m_stateForPointer.erase(it); ASSERT(stateCopy.target); bool eventSwallowed = !dispatchPointerEvent(stateCopy, event); // When the user releases the primary pointer, we need to dispatch a tap // event to the common ancestor for where the pointer went down and where // it came up. if (!eventSwallowed && !dispatchClickEvent(*stateCopy.target, event)) eventSwallowed = true; return eventSwallowed; }
void QMirClientInput::dispatchInputEvent(QMirClientWindow *window, const MirInputEvent *ev) { switch (mir_input_event_get_type(ev)) { case mir_input_event_type_key: dispatchKeyEvent(window, ev); break; case mir_input_event_type_touch: dispatchTouchEvent(window, ev); break; case mir_input_event_type_pointer: dispatchPointerEvent(window, ev); break; default: break; } }