diff options
author | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2013-07-22 11:19:14 +0200 |
---|---|---|
committer | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2013-07-29 17:38:29 +0200 |
commit | 519367a98334b658a93ed1ba096dba92858445c7 (patch) | |
tree | 44d2e328d3f3075c4c64859ae3d3880c2d9f6116 | |
parent | c4083f0d8b06f7ede95968a010153fcc49f8d51c (diff) |
Forward touch events.
This lets the page receive touch events sent to the QWidget/QQuickItem.
Change-Id: Ic358d4963d6af3df57d37a02b471cd442e8947ce
Reviewed-by: Andras Becsi <andras.becsi@digia.com>
-rw-r--r-- | lib/render_widget_host_view_qt.cpp | 11 | ||||
-rw-r--r-- | lib/render_widget_host_view_qt.h | 2 | ||||
-rw-r--r-- | lib/render_widget_host_view_qt_delegate_quick.cpp | 5 | ||||
-rw-r--r-- | lib/render_widget_host_view_qt_delegate_quick.h | 1 | ||||
-rw-r--r-- | lib/render_widget_host_view_qt_delegate_widget.cpp | 1 | ||||
-rw-r--r-- | lib/web_event_factory.cpp | 48 | ||||
-rw-r--r-- | lib/web_event_factory.h | 2 |
7 files changed, 67 insertions, 3 deletions
diff --git a/lib/render_widget_host_view_qt.cpp b/lib/render_widget_host_view_qt.cpp index 849b13c7d..2bf9d4317 100644 --- a/lib/render_widget_host_view_qt.cpp +++ b/lib/render_widget_host_view_qt.cpp @@ -86,6 +86,11 @@ bool RenderWidgetHostViewQt::handleEvent(QEvent* event) { case QEvent::Wheel: handleWheelEvent(static_cast<QWheelEvent*>(event)); break; + case QEvent::TouchBegin: + case QEvent::TouchUpdate: + case QEvent::TouchEnd: + handleTouchEvent(static_cast<QTouchEvent*>(event)); + break; case QEvent::FocusIn: case QEvent::FocusOut: handleFocusEvent(static_cast<QFocusEvent*>(event)); @@ -462,6 +467,12 @@ void RenderWidgetHostViewQt::handleWheelEvent(QWheelEvent *ev) m_host->ForwardWheelEvent(WebEventFactory::toWebWheelEvent(ev)); } +void RenderWidgetHostViewQt::handleTouchEvent(QTouchEvent *ev) +{ + if (m_host->ShouldForwardTouchEvent()) + m_host->ForwardTouchEventWithLatencyInfo(WebEventFactory::toWebTouchEvent(ev), ui::LatencyInfo()); +} + void RenderWidgetHostViewQt::handleFocusEvent(QFocusEvent *ev) { if (ev->gotFocus()) { diff --git a/lib/render_widget_host_view_qt.h b/lib/render_widget_host_view_qt.h index 8ad3ceed2..7a29e1d4b 100644 --- a/lib/render_widget_host_view_qt.h +++ b/lib/render_widget_host_view_qt.h @@ -52,6 +52,7 @@ class QEvent; class QFocusEvent; class QKeyEvent; class QMouseEvent; +class QTouchEvent; class QWheelEvent; class RenderWidgetHostViewQtDelegate; @@ -126,6 +127,7 @@ public: void handleMouseEvent(QMouseEvent*); void handleKeyEvent(QKeyEvent*); void handleWheelEvent(QWheelEvent*); + void handleTouchEvent(QTouchEvent*); void handleFocusEvent(QFocusEvent*); #if defined(OS_MACOSX) diff --git a/lib/render_widget_host_view_qt_delegate_quick.cpp b/lib/render_widget_host_view_qt_delegate_quick.cpp index a2dc55096..fabd4174c 100644 --- a/lib/render_widget_host_view_qt_delegate_quick.cpp +++ b/lib/render_widget_host_view_qt_delegate_quick.cpp @@ -167,3 +167,8 @@ void RenderWidgetHostViewQtDelegateQuick::wheelEvent(QWheelEvent *event) { m_view->handleWheelEvent(event); } + +void RenderWidgetHostViewQtDelegateQuick::touchEvent(QTouchEvent *event) +{ + m_view->handleTouchEvent(event); +} diff --git a/lib/render_widget_host_view_qt_delegate_quick.h b/lib/render_widget_host_view_qt_delegate_quick.h index 5131b446b..1b77de50b 100644 --- a/lib/render_widget_host_view_qt_delegate_quick.h +++ b/lib/render_widget_host_view_qt_delegate_quick.h @@ -89,6 +89,7 @@ public: void keyPressEvent(QKeyEvent*); void keyReleaseEvent(QKeyEvent*); void wheelEvent(QWheelEvent*); + void touchEvent(QTouchEvent*); protected: void updatePolish(); diff --git a/lib/render_widget_host_view_qt_delegate_widget.cpp b/lib/render_widget_host_view_qt_delegate_widget.cpp index 2ee2872ff..5baf6a3b0 100644 --- a/lib/render_widget_host_view_qt_delegate_widget.cpp +++ b/lib/render_widget_host_view_qt_delegate_widget.cpp @@ -55,6 +55,7 @@ RenderWidgetHostViewQtDelegateWidget::RenderWidgetHostViewQtDelegateWidget(Rende , m_painter(0) { setFocusPolicy(Qt::ClickFocus); + setAttribute(Qt::WA_AcceptTouchEvents); setAttribute(Qt::WA_OpaquePaintEvent); } diff --git a/lib/web_event_factory.cpp b/lib/web_event_factory.cpp index ed24c5b6d..388e0f9b2 100644 --- a/lib/web_event_factory.cpp +++ b/lib/web_event_factory.cpp @@ -43,11 +43,12 @@ #include "web_event_factory.h" #include "third_party/WebKit/Source/core/platform/WindowsKeyboardCodes.h" -#include <QMouseEvent> -#include <QKeyEvent> +#include <QApplication> #include <QElapsedTimer> +#include <QEvent> +#include <QKeyEvent> +#include <QMouseEvent> #include <QWheelEvent> -#include <QApplication> using namespace WebKit; @@ -522,6 +523,25 @@ static WebInputEvent::Type webEventTypeForEvent(const QEvent* event) } } +static WebKit::WebTouchPoint::State toWebTouchPointState(Qt::TouchPointState state) { + switch (state) { + case Qt::TouchPointPressed: + return WebKit::WebTouchPoint::StatePressed; + case Qt::TouchPointMoved: + return WebKit::WebTouchPoint::StateMoved; + case Qt::TouchPointStationary: + return WebKit::WebTouchPoint::StateStationary; + case Qt::TouchPointReleased: + return WebKit::WebTouchPoint::StateReleased; + default: + Q_ASSERT(false); + return WebKit::WebTouchPoint::StateUndefined; + } +} + +static inline WebKit::WebPoint toWebPoint(const QPoint& point) { + return WebKit::WebPoint(point.x(), point.y()); +} WebMouseEvent WebEventFactory::toWebMouseEvent(QMouseEvent *ev) { @@ -585,6 +605,28 @@ WebKit::WebMouseWheelEvent WebEventFactory::toWebWheelEvent(QWheelEvent *ev) return webEvent; } +WebKit::WebTouchEvent WebEventFactory::toWebTouchEvent(QTouchEvent *ev) +{ + WebTouchEvent webEvent; + webEvent.type = webEventTypeForEvent(ev); + webEvent.timeStampSeconds = currentTimeForEvent(ev); + webEvent.modifiers = modifiersForEvent(ev); + + webEvent.touchesLength = ev->touchPoints().size(); + webEvent.changedTouchesLength = 0; + for (unsigned i = 0; i < webEvent.touchesLength; ++i) { + const QTouchEvent::TouchPoint& touchPoint = ev->touchPoints()[i]; + WebTouchPoint& webTouchPoint = webEvent.touches[i]; + webTouchPoint.id = touchPoint.id(); + webTouchPoint.state = toWebTouchPointState(touchPoint.state()); + webTouchPoint.screenPosition = toWebPoint(touchPoint.screenPos().toPoint()); + webTouchPoint.position = toWebPoint(touchPoint.pos().toPoint()); + if (webTouchPoint.state != WebKit::WebTouchPoint::StateStationary) + webEvent.changedTouches[webEvent.changedTouchesLength++] = webTouchPoint; + } + return webEvent; +} + content::NativeWebKeyboardEvent WebEventFactory::toWebKeyboardEvent(QKeyEvent *ev) { content::NativeWebKeyboardEvent webKitEvent; diff --git a/lib/web_event_factory.h b/lib/web_event_factory.h index bacb7132c..a8f5ab306 100644 --- a/lib/web_event_factory.h +++ b/lib/web_event_factory.h @@ -47,6 +47,7 @@ class QMouseEvent; class QKeyEvent; +class QTouchEvent; class QWheelEvent; class WebEventFactory { @@ -54,6 +55,7 @@ class WebEventFactory { public: static WebKit::WebMouseEvent toWebMouseEvent(QMouseEvent*); static WebKit::WebMouseWheelEvent toWebWheelEvent(QWheelEvent*); + static WebKit::WebTouchEvent toWebTouchEvent(QTouchEvent*); static content::NativeWebKeyboardEvent toWebKeyboardEvent(QKeyEvent*); }; |