diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index ab9fb66fb1c3e4bbe8980f3ec91d2b0bba1190eb..96cddfb4b447d7624374663fbf63bd915b534c51 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 304fa0e1aefb693b060de5e77f791edd2d14be9a..09e027497d3ea4ce8da5b56309ae2d5368d387d0 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 2cd15aa58f1c71cfde1d59bcd8127fb1f788b8d7..a7df934e41e2df604d7ac7a8d84f50dadbadde06 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 c9871a4b97d55a15a5268e8c3676cad43a94d582..d82113db36de9c6ae02e7072fd7c305f7f09fb59 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 4e4fc406fde7266620520ff011c8beb44db972b9..b3348b43e4ceef57ee873669ab02bdd72e940b5e 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); }