wasm: Handle stylus events by generating QTabletEvents
Pick-to: 6.6 Fixes: QTBUG-120327 Change-Id: I37a92b9850385712b638c30f9a43028d8134f416 Reviewed-by: Lorn Potter <lorn.potter@gmail.com> (cherry picked from commit bc578ec6efcf667e0be2ea5c3d68bd22135cadd0) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
c28e68c729
commit
d7bc61ac51
@ -187,6 +187,10 @@ PointerEvent::PointerEvent(EventType type, emscripten::val event) : MouseEvent(t
|
|||||||
width = event["width"].as<qreal>();
|
width = event["width"].as<qreal>();
|
||||||
height = event["height"].as<qreal>();
|
height = event["height"].as<qreal>();
|
||||||
pressure = event["pressure"].as<qreal>();
|
pressure = event["pressure"].as<qreal>();
|
||||||
|
tiltX = event["tiltX"].as<qreal>();
|
||||||
|
tiltY = event["tiltY"].as<qreal>();
|
||||||
|
tangentialPressure = event["tangentialPressure"].as<qreal>();
|
||||||
|
twist = event["twist"].as<qreal>();
|
||||||
isPrimary = event["isPrimary"].as<bool>();
|
isPrimary = event["isPrimary"].as<bool>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,6 +221,10 @@ struct PointerEvent : public MouseEvent
|
|||||||
PointerType pointerType;
|
PointerType pointerType;
|
||||||
int pointerId;
|
int pointerId;
|
||||||
qreal pressure;
|
qreal pressure;
|
||||||
|
qreal tiltX;
|
||||||
|
qreal tiltY;
|
||||||
|
qreal tangentialPressure;
|
||||||
|
qreal twist;
|
||||||
qreal width;
|
qreal width;
|
||||||
qreal height;
|
qreal height;
|
||||||
bool isPrimary;
|
bool isPrimary;
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <qpa/qwindowsysteminterface.h>
|
#include <qpa/qwindowsysteminterface.h>
|
||||||
#include <QtCore/qcoreapplication.h>
|
#include <QtCore/qcoreapplication.h>
|
||||||
#include <qpa/qplatforminputcontextfactory_p.h>
|
#include <qpa/qplatforminputcontextfactory_p.h>
|
||||||
|
#include <qpa/qwindowsysteminterface_p.h>
|
||||||
|
|
||||||
#include <emscripten/bind.h>
|
#include <emscripten/bind.h>
|
||||||
#include <emscripten/val.h>
|
#include <emscripten/val.h>
|
||||||
@ -94,6 +95,7 @@ QWasmIntegration::QWasmIntegration()
|
|||||||
qt_set_sequence_auto_mnemonic(false);
|
qt_set_sequence_auto_mnemonic(false);
|
||||||
|
|
||||||
touchPoints = emscripten::val::global("navigator")["maxTouchPoints"].as<int>();
|
touchPoints = emscripten::val::global("navigator")["maxTouchPoints"].as<int>();
|
||||||
|
QWindowSystemInterfacePrivate::TabletEvent::setPlatformSynthesizesMouse(false);
|
||||||
|
|
||||||
// Create screens for container elements. Each container element will ultimately become a
|
// Create screens for container elements. Each container element will ultimately become a
|
||||||
// div element. Qt historically supported supplying canvas for screen elements - these elements
|
// div element. Qt historically supported supplying canvas for screen elements - these elements
|
||||||
|
@ -92,6 +92,16 @@ QWasmScreen::QWasmScreen(const emscripten::val &containerOrCanvas)
|
|||||||
QPointingDevice::Capability::Position | QPointingDevice::Capability::Area
|
QPointingDevice::Capability::Position | QPointingDevice::Capability::Area
|
||||||
| QPointingDevice::Capability::NormalizedPosition,
|
| QPointingDevice::Capability::NormalizedPosition,
|
||||||
10, 0);
|
10, 0);
|
||||||
|
m_tabletDevice = std::make_unique<QPointingDevice>(
|
||||||
|
"stylus", 2, QInputDevice::DeviceType::Stylus,
|
||||||
|
QPointingDevice::PointerType::Pen,
|
||||||
|
QPointingDevice::Capability::Position | QPointingDevice::Capability::Pressure
|
||||||
|
| QPointingDevice::Capability::NormalizedPosition
|
||||||
|
| QInputDevice::Capability::MouseEmulation
|
||||||
|
| QInputDevice::Capability::Hover | QInputDevice::Capability::Rotation
|
||||||
|
| QInputDevice::Capability::XTilt | QInputDevice::Capability::YTilt
|
||||||
|
| QInputDevice::Capability::TangentialPressure,
|
||||||
|
0, 0);
|
||||||
|
|
||||||
QWindowSystemInterface::registerInputDevice(m_touchDevice.get());
|
QWindowSystemInterface::registerInputDevice(m_touchDevice.get());
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,7 @@ public:
|
|||||||
QString eventTargetId() const;
|
QString eventTargetId() const;
|
||||||
QString outerScreenId() const;
|
QString outerScreenId() const;
|
||||||
QPointingDevice *touchDevice() { return m_touchDevice.get(); }
|
QPointingDevice *touchDevice() { return m_touchDevice.get(); }
|
||||||
|
QPointingDevice *tabletDevice() { return m_tabletDevice.get(); }
|
||||||
|
|
||||||
QWasmCompositor *compositor();
|
QWasmCompositor *compositor();
|
||||||
QWasmDeadKeySupport *deadKeySupport() { return m_deadKeySupport.get(); }
|
QWasmDeadKeySupport *deadKeySupport() { return m_deadKeySupport.get(); }
|
||||||
@ -82,6 +83,7 @@ private:
|
|||||||
emscripten::val m_shadowContainer;
|
emscripten::val m_shadowContainer;
|
||||||
std::unique_ptr<QWasmCompositor> m_compositor;
|
std::unique_ptr<QWasmCompositor> m_compositor;
|
||||||
std::unique_ptr<QPointingDevice> m_touchDevice;
|
std::unique_ptr<QPointingDevice> m_touchDevice;
|
||||||
|
std::unique_ptr<QPointingDevice> m_tabletDevice;
|
||||||
std::unique_ptr<QWasmDeadKeySupport> m_deadKeySupport;
|
std::unique_ptr<QWasmDeadKeySupport> m_deadKeySupport;
|
||||||
QRect m_geometry = QRect(0, 0, 100, 100);
|
QRect m_geometry = QRect(0, 0, 100, 100);
|
||||||
int m_depth = 32;
|
int m_depth = 32;
|
||||||
|
@ -514,7 +514,7 @@ bool QWasmWindow::processKey(const KeyEvent &event)
|
|||||||
|
|
||||||
bool QWasmWindow::processPointer(const PointerEvent &event)
|
bool QWasmWindow::processPointer(const PointerEvent &event)
|
||||||
{
|
{
|
||||||
if (event.pointerType != PointerType::Mouse)
|
if (event.pointerType != PointerType::Mouse && event.pointerType != PointerType::Pen)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
|
@ -105,6 +105,31 @@ bool ClientArea::deliverEvent(const PointerEvent &event)
|
|||||||
eventType, event.modifiers);
|
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;
|
QWindowSystemInterface::TouchPoint *touchPoint;
|
||||||
|
|
||||||
QPointF pointInTargetWindowCoords =
|
QPointF pointInTargetWindowCoords =
|
||||||
|
Loading…
x
Reference in New Issue
Block a user