summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp
diff options
context:
space:
mode:
authorMorten Sørvig <morten.sorvig@qt.io>2024-12-09 12:32:32 +0100
committerMorten Sørvig <morten.sorvig@qt.io>2025-01-29 13:59:09 +0100
commitadce1fe9b5b707dfd0ef492af7a61e6f6f735a1d (patch)
treee850b4af91ff777f5b7a8715fd608c5ccbfc25ab /src/plugins/platforms/wasm/qwasmwindowclientarea.cpp
parent59e057ef4217c095b0bdd2ec892ee46da466e291 (diff)
wasm: move qwasmwindowclientarea content to qwasmwindow
This allows us to keep all event handlers in one place. Move event handler registration to registerEventHandlers(), which is called from the QWasmWindow constructor. Change-Id: I31f22d6eb876b92bb15d4a140e0569f0288a5915 Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmwindowclientarea.cpp')
-rw-r--r--src/plugins/platforms/wasm/qwasmwindowclientarea.cpp198
1 files changed, 0 insertions, 198 deletions
diff --git a/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp b/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp
deleted file mode 100644
index 4403740fa47..00000000000
--- a/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright (C) 2022 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
-
-#include "qwasmwindowclientarea.h"
-
-#include "qwasmdom.h"
-#include "qwasmevent.h"
-#include "qwasmscreen.h"
-#include "qwasmwindow.h"
-#include "qwasmdrag.h"
-
-#include <QtGui/private/qguiapplication_p.h>
-#include <QtGui/qpointingdevice.h>
-
-#include <QtCore/qassert.h>
-
-QT_BEGIN_NAMESPACE
-
-ClientArea::ClientArea(QWasmWindow *window, QWasmScreen *screen, emscripten::val element)
- : m_screen(screen), m_window(window), m_element(element)
-{
- m_pointerDownCallback = std::make_unique<qstdweb::EventCallback>(element, "pointerdown",
- [this](emscripten::val event){ processPointer(PointerEvent(EventType::PointerDown, event)); }
- );
- m_pointerMoveCallback = std::make_unique<qstdweb::EventCallback>(element, "pointermove",
- [this](emscripten::val event){ processPointer(PointerEvent(EventType::PointerMove, event)); }
- );
- m_pointerUpCallback = std::make_unique<qstdweb::EventCallback>(element, "pointerup",
- [this](emscripten::val event){ processPointer(PointerEvent(EventType::PointerUp, event)); }
- );
- m_pointerCancelCallback = std::make_unique<qstdweb::EventCallback>(element, "pointercancel",
- [this](emscripten::val event){ processPointer(PointerEvent(EventType::PointerCancel, event)); }
- );
-
- element.call<void>("setAttribute", emscripten::val("draggable"), emscripten::val("true"));
- m_dragStartCallback = std::make_unique<qstdweb::EventCallback>(element, "dragstart",
- [this](emscripten::val event) {
- DragEvent dragEvent(EventType::DragStart, event, m_window->window());
- QWasmDrag::instance()->onNativeDragStarted(&dragEvent);
- }
- );
- m_dragOverCallback = std::make_unique<qstdweb::EventCallback>(element, "dragover",
- [this](emscripten::val event) {
- DragEvent dragEvent(EventType::DragOver, event, m_window->window());
- QWasmDrag::instance()->onNativeDragOver(&dragEvent);
- }
- );
- m_dropCallback = std::make_unique<qstdweb::EventCallback>(element, "drop",
- [this](emscripten::val event) {
- DragEvent dragEvent(EventType::Drop, event, m_window->window());
- QWasmDrag::instance()->onNativeDrop(&dragEvent);
- }
- );
- m_dragEndCallback = std::make_unique<qstdweb::EventCallback>(element, "dragend",
- [this](emscripten::val event) {
- DragEvent dragEvent(EventType::DragEnd, event, m_window->window());
- QWasmDrag::instance()->onNativeDragFinished(&dragEvent);
- }
- );
- m_dragLeaveCallback = std::make_unique<qstdweb::EventCallback>(element, "dragleave",
- [this](emscripten::val event) {
- DragEvent dragEvent(EventType::DragLeave, event, m_window->window());
- QWasmDrag::instance()->onNativeDragLeave(&dragEvent);
- }
- );
-}
-
-void ClientArea::processPointer(const PointerEvent &event)
-{
- switch (event.type) {
- case EventType::PointerDown:
- m_element.call<void>("setPointerCapture", event.pointerId);
- if ((m_window->window()->flags() & Qt::WindowDoesNotAcceptFocus)
- != Qt::WindowDoesNotAcceptFocus
- && m_window->window()->isTopLevel())
- m_window->window()->requestActivate();
- break;
- case EventType::PointerUp:
- m_element.call<void>("releasePointerCapture", event.pointerId);
- break;
- default:
- break;
- };
-
- const bool eventAccepted = deliverEvent(event);
- if (!eventAccepted && event.type == EventType::PointerDown)
- QGuiApplicationPrivate::instance()->closeAllPopups();
- event.webEvent.call<void>("preventDefault");
- event.webEvent.call<void>("stopPropagation");
-}
-
-bool ClientArea::deliverEvent(const PointerEvent &event)
-{
- const auto pointInScreen = m_screen->mapFromLocal(
- dom::mapPoint(event.target(), m_screen->element(), event.localPoint));
-
- const auto geometryF = m_screen->geometry().toRectF();
- const QPointF targetPointClippedToScreen(
- qBound(geometryF.left(), pointInScreen.x(), geometryF.right()),
- qBound(geometryF.top(), pointInScreen.y(), geometryF.bottom()));
-
- if (event.pointerType == PointerType::Mouse) {
- const QEvent::Type eventType =
- MouseEvent::mouseEventTypeFromEventType(event.type, WindowArea::Client);
-
- return eventType != QEvent::None
- && QWindowSystemInterface::handleMouseEvent(
- m_window->window(), QWasmIntegration::getTimestamp(),
- m_window->window()->mapFromGlobal(targetPointClippedToScreen),
- targetPointClippedToScreen, event.mouseButtons, event.mouseButton,
- eventType, event.modifiers);
- }
-
- if (event.pointerType == PointerType::Pen) {
- qreal pressure;
- switch (event.type) {
- case EventType::PointerDown :
- case EventType::PointerMove :
- pressure = event.pressure;
- break;
- case EventType::PointerUp :
- pressure = 0.0;
- break;
- default:
- return false;
- }
- // Tilt in the browser is in the range +-90, but QTabletEvent only goes to +-60.
- qreal xTilt = qBound(-60.0, event.tiltX, 60.0);
- qreal yTilt = qBound(-60.0, event.tiltY, 60.0);
- // Barrel rotation is reported as 0 to 359, but QTabletEvent wants a signed value.
- qreal rotation = event.twist > 180.0 ? 360.0 - event.twist : event.twist;
- return QWindowSystemInterface::handleTabletEvent(
- m_window->window(), QWasmIntegration::getTimestamp(), m_screen->tabletDevice(),
- m_window->window()->mapFromGlobal(targetPointClippedToScreen),
- targetPointClippedToScreen, event.mouseButtons, pressure, xTilt, yTilt,
- event.tangentialPressure, rotation, event.modifiers);
- }
-
- QWindowSystemInterface::TouchPoint *touchPoint;
-
- QPointF pointInTargetWindowCoords =
- QPointF(m_window->window()->mapFromGlobal(targetPointClippedToScreen));
- QPointF normalPosition(pointInTargetWindowCoords.x() / m_window->window()->width(),
- pointInTargetWindowCoords.y() / m_window->window()->height());
-
- const auto tp = m_pointerIdToTouchPoints.find(event.pointerId);
- if (event.pointerType != PointerType::Pen && tp != m_pointerIdToTouchPoints.end()) {
- touchPoint = &tp.value();
- } else {
- touchPoint = &m_pointerIdToTouchPoints
- .insert(event.pointerId, QWindowSystemInterface::TouchPoint())
- .value();
-
- // Assign touch point id. TouchPoint::id is int, but QGuiApplicationPrivate::processTouchEvent()
- // will not synthesize mouse events for touch points with negative id; use the absolute value for
- // the touch point id.
- touchPoint->id = qAbs(event.pointerId);
-
- touchPoint->state = QEventPoint::State::Pressed;
- }
-
- const bool stationaryTouchPoint = (normalPosition == touchPoint->normalPosition);
- touchPoint->normalPosition = normalPosition;
- touchPoint->area = QRectF(targetPointClippedToScreen, QSizeF(event.width, event.height))
- .translated(-event.width / 2, -event.height / 2);
- touchPoint->pressure = event.pressure;
-
- switch (event.type) {
- case EventType::PointerUp:
- touchPoint->state = QEventPoint::State::Released;
- break;
- case EventType::PointerMove:
- touchPoint->state = (stationaryTouchPoint ? QEventPoint::State::Stationary
- : QEventPoint::State::Updated);
- break;
- default:
- break;
- }
-
- QList<QWindowSystemInterface::TouchPoint> touchPointList;
- touchPointList.reserve(m_pointerIdToTouchPoints.size());
- std::transform(m_pointerIdToTouchPoints.begin(), m_pointerIdToTouchPoints.end(),
- std::back_inserter(touchPointList),
- [](const QWindowSystemInterface::TouchPoint &val) { return val; });
-
- if (event.type == EventType::PointerUp)
- m_pointerIdToTouchPoints.remove(event.pointerId);
-
- return event.type == EventType::PointerCancel
- ? QWindowSystemInterface::handleTouchCancelEvent(
- m_window->window(), QWasmIntegration::getTimestamp(), m_screen->touchDevice(),
- event.modifiers)
- : QWindowSystemInterface::handleTouchEvent(
- m_window->window(), QWasmIntegration::getTimestamp(), m_screen->touchDevice(),
- touchPointList, event.modifiers);
-}
-
-QT_END_NAMESPACE