diff options
author | Szabolcs David <davidsz@inf.u-szeged.hu> | 2017-09-12 18:53:59 +0200 |
---|---|---|
committer | Szabolcs David <davidsz@inf.u-szeged.hu> | 2017-11-03 00:46:30 +0000 |
commit | 0bbaf0d5d7b2d406eda57d40370b00fb79cc0aeb (patch) | |
tree | c23285ae71d4733c4bdd3d9c6749daba371610fb /src/core/web_event_factory.cpp | |
parent | 18ea13a7f5e083538910646c52a96a5e4642d1f2 (diff) |
Support tablet devices
Process QTabletEvents and forward them to Chromium in order to
support pressure, tilting, rotation, eraser and similar
features of tablet devices.
Change-Id: I763d9e6e7036c29715a0b5531d3c6363eb4fcd8c
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'src/core/web_event_factory.cpp')
-rw-r--r-- | src/core/web_event_factory.cpp | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/src/core/web_event_factory.cpp b/src/core/web_event_factory.cpp index 18f8d393f..b785adec0 100644 --- a/src/core/web_event_factory.cpp +++ b/src/core/web_event_factory.cpp @@ -76,6 +76,7 @@ #include <QKeyEvent> #include <QMouseEvent> #include <QStyleHints> +#include <QTabletEvent> #include <QWheelEvent> using namespace blink; @@ -1032,7 +1033,8 @@ static inline double currentTimeForEvent(const QInputEvent* event) return static_cast<double>(timer.elapsed()) / 1000; } -static WebMouseEvent::Button mouseButtonForEvent(QMouseEvent *event) +template<class T> +static WebMouseEvent::Button mouseButtonForEvent(T *event) { if (event->button() == Qt::LeftButton) return WebMouseEvent::Button::kLeft; @@ -1041,7 +1043,7 @@ static WebMouseEvent::Button mouseButtonForEvent(QMouseEvent *event) else if (event->button() == Qt::MidButton) return WebMouseEvent::Button::kMiddle; - if (event->type() != QEvent::MouseMove) + if (event->type() != QEvent::MouseMove && event->type() != QEvent::TabletMove) return WebMouseEvent::Button::kNoButton; // This is technically wrong, mouse move should always have ButtonNone, @@ -1147,14 +1149,17 @@ static WebInputEvent::Type webEventTypeForEvent(const QEvent* event) { switch (event->type()) { case QEvent::MouseButtonPress: + case QEvent::TabletPress: return WebInputEvent::kMouseDown; case QEvent::MouseButtonRelease: + case QEvent::TabletRelease: return WebInputEvent::kMouseUp; case QEvent::Enter: return WebInputEvent::kMouseEnter; case QEvent::Leave: return WebInputEvent::kMouseLeave; case QEvent::MouseMove: + case QEvent::TabletMove: return WebInputEvent::kMouseMove; case QEvent::Wheel: return WebInputEvent::kMouseWheel; @@ -1178,6 +1183,20 @@ static WebInputEvent::Type webEventTypeForEvent(const QEvent* event) } } +static WebPointerProperties::PointerType pointerTypeForTabletEvent(const QTabletEvent *ev) +{ + switch (ev->pointerType()) { + case QTabletEvent::UnknownPointer: + return WebPointerProperties::PointerType::kUnknown; + case QTabletEvent::Pen: + return WebPointerProperties::PointerType::kPen; + case QTabletEvent::Eraser: + return WebPointerProperties::PointerType::kEraser; + default: + return WebPointerProperties::PointerType::kMouse; + } +} + WebMouseEvent WebEventFactory::toWebMouseEvent(QMouseEvent *ev, double dpiScale) { WebMouseEvent webKitEvent(webEventTypeForEvent(ev), @@ -1188,7 +1207,7 @@ WebMouseEvent WebEventFactory::toWebMouseEvent(QMouseEvent *ev, double dpiScale) modifiersForEvent(ev), currentTimeForEvent(ev)); - webKitEvent.button = mouseButtonForEvent(ev); + webKitEvent.button = mouseButtonForEvent<QMouseEvent>(ev); webKitEvent.click_count = 0; return webKitEvent; @@ -1208,6 +1227,29 @@ WebMouseEvent WebEventFactory::toWebMouseEvent(QHoverEvent *ev, double dpiScale) return webKitEvent; } +WebMouseEvent WebEventFactory::toWebMouseEvent(QTabletEvent *ev, double dpiScale) +{ + WebMouseEvent webKitEvent(webEventTypeForEvent(ev), + ev->x() / dpiScale, + ev->y() / dpiScale, + ev->globalX(), + ev->globalY(), + modifiersForEvent(ev), + currentTimeForEvent(ev)); + + webKitEvent.force = ev->pressure(); + webKitEvent.tilt_x = ev->xTilt(); + webKitEvent.tilt_y = ev->yTilt(); + webKitEvent.tangential_pressure = ev->tangentialPressure(); + webKitEvent.twist = ev->rotation(); + webKitEvent.pointer_type = pointerTypeForTabletEvent(ev); + + webKitEvent.button = mouseButtonForEvent<QTabletEvent>(ev); + webKitEvent.click_count = 0; + + return webKitEvent; +} + #ifndef QT_NO_GESTURES WebGestureEvent WebEventFactory::toWebGestureEvent(QNativeGestureEvent *ev, double dpiScale) { |