std::shared_ptr<View> WindowView_Impl::get_capture_view(PointerEvent &e, std::shared_ptr<View> &view_above_cursor) { if (e.type() == PointerEventType::press || e.type() == PointerEventType::double_click) { capture_down_counter++; if (capture_down_counter == 1) { captured_view = view_above_cursor; if (captured_view) window.capture_mouse(true); } } std::shared_ptr<View> view = captured_view; if (e.type() == PointerEventType::release) { if (capture_down_counter > 0) { capture_down_counter--; if (capture_down_counter == 0) { if (captured_view) release_capture(); } } } return view; }
void WindowView_Impl::window_pointer_event(PointerEvent &e) { std::shared_ptr<View> view_above_cursor = window_view->find_view_at(e.pos(window_view)); auto view = get_capture_view(e, view_above_cursor); if (!view) view = view_above_cursor; dispatch_hot_event(view, e); if (e.type() == PointerEventType::enter || e.type() == PointerEventType::leave) // Ignore window enter/leave events return; if (view) view->dispatch_event(&e); else window_view->dispatch_event(&e); }
void PointerEventFactoryTest::createAndCheckPointerTransitionEvent( PointerEvent* pointerEvent, const AtomicString& type) { PointerEvent* clonePointerEvent = m_pointerEventFactory. createPointerTransitionEvent(pointerEvent, type, nullptr); EXPECT_EQ(clonePointerEvent->pointerType(), pointerEvent->pointerType()); EXPECT_EQ(clonePointerEvent->pointerId(), pointerEvent->pointerId()); EXPECT_EQ(clonePointerEvent->isPrimary(), pointerEvent->isPrimary()); EXPECT_EQ(clonePointerEvent->type(), type); }