diff options
| author | Mikolaj Boc <mikolaj.boc@qt.io> | 2022-12-20 15:56:49 +0100 |
|---|---|---|
| committer | Mikolaj Boc <mikolaj.boc@qt.io> | 2022-12-22 19:39:00 +0100 |
| commit | c15a8750bcce3d4dabeebcc8bb4c15db31c7f637 (patch) | |
| tree | 6e9eccefbe350488b4c2d51fbd142a0b19e86d19 /src/plugins/platforms/wasm/qwasmcompositor.cpp | |
| parent | cf2651ae80a34b388a6bbb41b5e62c7b352e8a80 (diff) | |
Handle the mouse events in the window itself
It is now not the screen that handles all of the events and relays
them to individual windows, but the window elements themselves.
This allows us to get rid of manual window targeting logic and let
the browser do its job.
Fixes: QTBUG-107217
Pick-to: 6.5
Change-Id: I4dc5a74b1343f027f72c1da4623b99cd28bfbb38
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmcompositor.cpp')
| -rw-r--r-- | src/plugins/platforms/wasm/qwasmcompositor.cpp | 191 |
1 files changed, 6 insertions, 185 deletions
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.cpp b/src/plugins/platforms/wasm/qwasmcompositor.cpp index a530cd1f7ae..b81a4ed5be7 100644 --- a/src/plugins/platforms/wasm/qwasmcompositor.cpp +++ b/src/plugins/platforms/wasm/qwasmcompositor.cpp @@ -60,8 +60,6 @@ QWasmCompositor::QWasmCompositor(QWasmScreen *screen) QWasmCompositor::~QWasmCompositor() { - m_windowUnderMouse.clear(); - if (m_requestAnimationFrameId != -1) emscripten_cancel_animation_frame(m_requestAnimationFrameId); @@ -75,8 +73,6 @@ void QWasmCompositor::deregisterEventHandlers() emscripten_set_keydown_callback(screenElementSelector.constData(), 0, 0, NULL); emscripten_set_keyup_callback(screenElementSelector.constData(), 0, 0, NULL); - emscripten_set_focus_callback(screenElementSelector.constData(), 0, 0, NULL); - emscripten_set_wheel_callback(screenElementSelector.constData(), 0, 0, NULL); emscripten_set_touchstart_callback(screenElementSelector.constData(), 0, 0, NULL); @@ -112,26 +108,6 @@ void QWasmCompositor::initEventHandlers() emscripten_set_keyup_callback(screenElementSelector.constData(), (void *)this, UseCapture, &keyboard_cb); - val screenElement = screen()->element(); - const auto callback = std::function([this](emscripten::val event) { - if (processPointer(*PointerEvent::fromWeb(event))) - event.call<void>("preventDefault"); - }); - - m_pointerDownCallback = - std::make_unique<qstdweb::EventCallback>(screenElement, "pointerdown", callback); - m_pointerMoveCallback = - std::make_unique<qstdweb::EventCallback>(screenElement, "pointermove", callback); - m_pointerUpCallback = - std::make_unique<qstdweb::EventCallback>(screenElement, "pointerup", callback); - m_pointerEnterCallback = - std::make_unique<qstdweb::EventCallback>(screenElement, "pointerenter", callback); - m_pointerLeaveCallback = - std::make_unique<qstdweb::EventCallback>(screenElement, "pointerleave", callback); - - emscripten_set_focus_callback(screenElementSelector.constData(), (void *)this, UseCapture, - &focus_cb); - emscripten_set_wheel_callback(screenElementSelector.constData(), (void *)this, UseCapture, &wheel_cb); @@ -144,10 +120,10 @@ void QWasmCompositor::initEventHandlers() emscripten_set_touchcancel_callback(screenElementSelector.constData(), (void *)this, UseCapture, &touchCallback); - screenElement.call<void>("addEventListener", std::string("drop"), - val::module_property("qtDrop"), val(true)); - screenElement.set("data-qtdropcontext", // ? unique - emscripten::val(quintptr(reinterpret_cast<void *>(screen())))); + screen()->element().call<void>("addEventListener", std::string("drop"), + val::module_property("qtDrop"), val(true)); + screen()->element().set("data-qtdropcontext", // ? unique + emscripten::val(quintptr(reinterpret_cast<void *>(screen())))); } void QWasmCompositor::addWindow(QWasmWindow *window) @@ -162,8 +138,6 @@ void QWasmCompositor::removeWindow(QWasmWindow *window) { m_requestUpdateWindows.remove(window); m_windowStack.removeWindow(window); - if (m_lastMouseTargetWindow == window->window()) - m_lastMouseTargetWindow = nullptr; if (m_windowStack.topWindow()) m_windowStack.topWindow()->requestActivateWindow(); @@ -344,15 +318,6 @@ int QWasmCompositor::keyboard_cb(int eventType, const EmscriptenKeyboardEvent *k return static_cast<int>(wasmCompositor->processKeyboard(eventType, keyEvent)); } -int QWasmCompositor::focus_cb(int eventType, const EmscriptenFocusEvent *focusEvent, void *userData) -{ - Q_UNUSED(eventType) - Q_UNUSED(focusEvent) - Q_UNUSED(userData) - - return 0; -} - int QWasmCompositor::wheel_cb(int eventType, const EmscriptenWheelEvent *wheelEvent, void *userData) { QWasmCompositor *compositor = (QWasmCompositor *) userData; @@ -365,112 +330,6 @@ int QWasmCompositor::touchCallback(int eventType, const EmscriptenTouchEvent *to return static_cast<int>(compositor->processTouch(eventType, touchEvent)); } -bool QWasmCompositor::processPointer(const PointerEvent& event) -{ - if (event.pointerType != PointerType::Mouse) - return false; - - const auto pointInScreen = screen()->mapFromLocal(event.localPoint); - - QWindow *const targetWindow = ([this, pointInScreen]() -> QWindow * { - auto *targetWindow = m_mouseCaptureWindow != nullptr - ? m_mouseCaptureWindow.get() - : windowAt(pointInScreen, 5); - - return targetWindow ? targetWindow : m_lastMouseTargetWindow.get(); - })(); - if (!targetWindow) - return false; - m_lastMouseTargetWindow = targetWindow; - - const QPoint pointInTargetWindowCoords = targetWindow->mapFromGlobal(pointInScreen); - const bool pointerIsWithinTargetWindowBounds = targetWindow->geometry().contains(pointInScreen); - - if (m_mouseInScreen && m_windowUnderMouse != targetWindow - && pointerIsWithinTargetWindowBounds) { - // delayed mouse enter - enterWindow(targetWindow, pointInTargetWindowCoords, pointInScreen); - m_windowUnderMouse = targetWindow; - } - - switch (event.type) { - case EventType::PointerDown: - { - screen()->element().call<void>("setPointerCapture", event.pointerId); - - if (targetWindow) - targetWindow->requestActivate(); - - break; - } - case EventType::PointerUp: - { - screen()->element().call<void>("releasePointerCapture", event.pointerId); - - break; - } - case EventType::PointerEnter: - processMouseEnter(nullptr); - break; - case EventType::PointerLeave: - processMouseLeave(); - break; - default: - break; - }; - - if (!pointerIsWithinTargetWindowBounds && event.mouseButtons.testFlag(Qt::NoButton)) { - leaveWindow(m_lastMouseTargetWindow); - } - - const bool eventAccepted = deliverEventToTarget(event, targetWindow); - if (!eventAccepted && event.type == EventType::PointerDown) - QGuiApplicationPrivate::instance()->closeAllPopups(); - return eventAccepted; -} - -bool QWasmCompositor::deliverEventToTarget(const PointerEvent &event, QWindow *eventTarget) -{ - Q_ASSERT(!m_mouseCaptureWindow || m_mouseCaptureWindow.get() == eventTarget); - - const auto pointInScreen = screen()->mapFromLocal(event.localPoint); - - const QPoint targetPointClippedToScreen( - std::max(screen()->geometry().left(), - std::min(screen()->geometry().right(), pointInScreen.x())), - std::max(screen()->geometry().top(), - std::min(screen()->geometry().bottom(), pointInScreen.y()))); - - bool deliveringToPreviouslyClickedWindow = false; - - if (!eventTarget) { - if (event.type != EventType::PointerUp || !m_lastMouseTargetWindow) - return false; - - eventTarget = m_lastMouseTargetWindow; - m_lastMouseTargetWindow = nullptr; - deliveringToPreviouslyClickedWindow = true; - } - - WindowArea windowArea = WindowArea::Client; - if (!deliveringToPreviouslyClickedWindow && !m_mouseCaptureWindow - && !eventTarget->geometry().contains(targetPointClippedToScreen)) { - if (!eventTarget->frameGeometry().contains(targetPointClippedToScreen)) - return false; - windowArea = WindowArea::NonClient; - } - - const QEvent::Type eventType = - MouseEvent::mouseEventTypeFromEventType(event.type, windowArea); - - return eventType != QEvent::None && - QWindowSystemInterface::handleMouseEvent( - eventTarget, QWasmIntegration::getTimestamp(), - eventTarget->mapFromGlobal(targetPointClippedToScreen), - targetPointClippedToScreen, event.mouseButtons, event.mouseButton, - eventType, event.modifiers); -} - bool QWasmCompositor::processKeyboard(int eventType, const EmscriptenKeyboardEvent *emKeyEvent) { constexpr bool ProceedToNativeEvent = false; @@ -521,9 +380,8 @@ bool QWasmCompositor::processWheel(int eventType, const EmscriptenWheelEvent *wh scrollFactor = -scrollFactor; // Web scroll deltas are inverted from Qt deltas. Qt::KeyboardModifiers modifiers = KeyboardModifier::getForEvent(*mouseEvent); - QPoint targetPointInScreenElementCoords(mouseEvent->targetX, mouseEvent->targetY); QPoint targetPointInScreenCoords = - screen()->geometry().topLeft() + targetPointInScreenElementCoords; + screen()->mapFromLocal(QPoint(mouseEvent->targetX, mouseEvent->targetY)); QWindow *targetWindow = screen()->compositor()->windowAt(targetPointInScreenCoords, 5); if (!targetWindow) @@ -555,9 +413,8 @@ bool QWasmCompositor::processTouch(int eventType, const EmscriptenTouchEvent *to const EmscriptenTouchPoint *touches = &touchEvent->touches[i]; - QPoint targetPointInScreenElementCoords(touches->targetX, touches->targetY); QPoint targetPointInScreenCoords = - screen()->geometry().topLeft() + targetPointInScreenElementCoords; + screen()->mapFromLocal(QPoint(touches->targetX, touches->targetY)); targetWindow = screen()->compositor()->windowAt(targetPointInScreenCoords, 5); if (targetWindow == nullptr) @@ -624,39 +481,3 @@ bool QWasmCompositor::processTouch(int eventType, const EmscriptenTouchEvent *to return static_cast<int>(accepted); } - -void QWasmCompositor::setCapture(QWasmWindow *window) -{ - Q_ASSERT(std::find(m_windowStack.begin(), m_windowStack.end(), window) != m_windowStack.end()); - m_mouseCaptureWindow = window->window(); -} - -void QWasmCompositor::releaseCapture() -{ - m_mouseCaptureWindow = nullptr; -} - -void QWasmCompositor::leaveWindow(QWindow *window) -{ - m_windowUnderMouse = nullptr; - QWindowSystemInterface::handleLeaveEvent(window); -} - -void QWasmCompositor::enterWindow(QWindow *window, const QPoint &pointInTargetWindowCoords, const QPoint &targetPointInScreenCoords) -{ - QWindowSystemInterface::handleEnterEvent(window, pointInTargetWindowCoords, targetPointInScreenCoords); -} - -bool QWasmCompositor::processMouseEnter(const EmscriptenMouseEvent *mouseEvent) -{ - Q_UNUSED(mouseEvent) - // mouse has entered the screen area - m_mouseInScreen = true; - return true; -} - -bool QWasmCompositor::processMouseLeave() -{ - m_mouseInScreen = false; - return true; -} |
