summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/render_widget_host_view_qt.cpp19
-rw-r--r--src/core/render_widget_host_view_qt.h1
-rw-r--r--src/core/web_event_factory.cpp37
-rw-r--r--src/core/web_event_factory.h3
-rw-r--r--src/webengine/render_widget_host_view_qt_delegate_quick.cpp3
5 files changed, 63 insertions, 0 deletions
diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp
index ab9fb66f..96cddfb4 100644
--- a/src/core/render_widget_host_view_qt.cpp
+++ b/src/core/render_widget_host_view_qt.cpp
@@ -905,6 +905,9 @@ bool RenderWidgetHostViewQt::forwardEvent(QEvent *event)
case QEvent::TouchCancel:
handleTouchEvent(static_cast<QTouchEvent*>(event));
break;
+ case QEvent::NativeGesture:
+ handleGestureEvent(static_cast<QNativeGestureEvent *>(event));
+ break;
case QEvent::HoverEnter:
case QEvent::HoverLeave:
case QEvent::HoverMove:
@@ -1295,8 +1298,24 @@ void RenderWidgetHostViewQt::clearPreviousTouchMotionState()
m_touchMotionStarted = false;
}
+void RenderWidgetHostViewQt::handleGestureEvent(QNativeGestureEvent *ev)
+{
+ const Qt::NativeGestureType type = ev->gestureType();
+ // These are the only supported gestures by Chromium so far.
+ if (type == Qt::ZoomNativeGesture || type == Qt::SmartZoomNativeGesture) {
+ m_host->ForwardGestureEvent(WebEventFactory::toWebGestureEvent(
+ ev,
+ static_cast<double>(dpiScale())));
+ }
+}
+
void RenderWidgetHostViewQt::handleTouchEvent(QTouchEvent *ev)
{
+ // On macOS instead of handling touch events, we use the OS provided QNativeGestureEvents.
+#ifdef Q_OS_MACOS
+ return;
+#endif
+
// Chromium expects the touch event timestamps to be comparable to base::TimeTicks::Now().
// Most importantly we also have to preserve the relative time distance between events.
// Calculate a delta between event timestamps and Now() on the first received event, and
diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h
index 304fa0e1..09e02749 100644
--- a/src/core/render_widget_host_view_qt.h
+++ b/src/core/render_widget_host_view_qt.h
@@ -189,6 +189,7 @@ public:
void handleKeyEvent(QKeyEvent*);
void handleWheelEvent(QWheelEvent*);
void handleTouchEvent(QTouchEvent*);
+ void handleGestureEvent(QNativeGestureEvent *);
void handleHoverEvent(QHoverEvent*);
void handleFocusEvent(QFocusEvent*);
void handleInputMethodEvent(QInputMethodEvent*);
diff --git a/src/core/web_event_factory.cpp b/src/core/web_event_factory.cpp
index 2cd15aa5..a7df934e 100644
--- a/src/core/web_event_factory.cpp
+++ b/src/core/web_event_factory.cpp
@@ -1212,6 +1212,43 @@ WebMouseEvent WebEventFactory::toWebMouseEvent(QHoverEvent *ev, double dpiScale)
return webKitEvent;
}
+WebGestureEvent WebEventFactory::toWebGestureEvent(QNativeGestureEvent *ev, double dpiScale)
+{
+ WebGestureEvent webKitEvent;
+ webKitEvent.timeStampSeconds = currentTimeForEvent(ev);
+ webKitEvent.modifiers = modifiersForEvent(ev);
+
+ webKitEvent.x = static_cast<int>(ev->localPos().x() / dpiScale);
+ webKitEvent.y = static_cast<int>(ev->localPos().y() / dpiScale);
+
+ webKitEvent.globalX = static_cast<int>(ev->screenPos().x() / dpiScale);
+ webKitEvent.globalY = static_cast<int>(ev->screenPos().y() / dpiScale);
+
+ webKitEvent.sourceDevice = blink::WebGestureDeviceTouchpad;
+
+ Qt::NativeGestureType gestureType = ev->gestureType();
+ switch (gestureType) {
+ case Qt::ZoomNativeGesture:
+ webKitEvent.type = WebInputEvent::GesturePinchUpdate;
+ webKitEvent.data.pinchUpdate.scale = static_cast<float>(ev->value() + 1.0);
+ break;
+ case Qt::SmartZoomNativeGesture:
+ webKitEvent.type = WebInputEvent::GestureDoubleTap;
+ webKitEvent.data.tap.tapCount = 1;
+ break;
+ case Qt::BeginNativeGesture:
+ case Qt::EndNativeGesture:
+ case Qt::RotateNativeGesture:
+ case Qt::PanNativeGesture:
+ case Qt::SwipeNativeGesture:
+ // Not implemented by Chromium for now.
+ webKitEvent.type = blink::WebInputEvent::Undefined;
+ break;
+ }
+
+ return webKitEvent;
+}
+
blink::WebMouseWheelEvent WebEventFactory::toWebWheelEvent(QWheelEvent *ev, double dpiScale)
{
WebMouseWheelEvent webEvent;
diff --git a/src/core/web_event_factory.h b/src/core/web_event_factory.h
index c9871a4b..d82113db 100644
--- a/src/core/web_event_factory.h
+++ b/src/core/web_event_factory.h
@@ -42,6 +42,7 @@
#include "content/public/browser/native_web_keyboard_event.h"
#include "third_party/WebKit/public/platform/WebInputEvent.h"
+#include "third_party/WebKit/public/platform/WebGestureEvent.h"
#include <QtGlobal>
@@ -50,6 +51,7 @@ class QHoverEvent;
class QKeyEvent;
class QMouseEvent;
class QWheelEvent;
+class QNativeGestureEvent;
QT_END_NAMESPACE
class WebEventFactory {
@@ -57,6 +59,7 @@ class WebEventFactory {
public:
static blink::WebMouseEvent toWebMouseEvent(QMouseEvent*, double dpiScale);
static blink::WebMouseEvent toWebMouseEvent(QHoverEvent*, double dpiScale);
+ static blink::WebGestureEvent toWebGestureEvent(QNativeGestureEvent *, double dpiScale);
static blink::WebMouseWheelEvent toWebWheelEvent(QWheelEvent*, double dpiScale);
static content::NativeWebKeyboardEvent toWebKeyboardEvent(QKeyEvent*);
};
diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
index 4e4fc406..b3348b43 100644
--- a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
+++ b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
@@ -247,6 +247,9 @@ bool RenderWidgetHostViewQtDelegateQuick::event(QEvent *event)
}
}
+ if (event->type() == QEvent::NativeGesture)
+ return m_client->forwardEvent(event);
+
return QQuickItem::event(event);
}