summaryrefslogtreecommitdiffstats
path: root/src/core/web_event_factory.cpp
diff options
context:
space:
mode:
authorSzabolcs David <davidsz@inf.u-szeged.hu>2017-09-12 18:53:59 +0200
committerSzabolcs David <davidsz@inf.u-szeged.hu>2017-11-03 00:46:30 +0000
commit0bbaf0d5d7b2d406eda57d40370b00fb79cc0aeb (patch)
treec23285ae71d4733c4bdd3d9c6749daba371610fb /src/core/web_event_factory.cpp
parent18ea13a7f5e083538910646c52a96a5e4642d1f2 (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.cpp48
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)
{