summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2013-07-22 11:19:14 +0200
committerJocelyn Turcotte <jocelyn.turcotte@digia.com>2013-07-29 17:38:29 +0200
commit519367a98334b658a93ed1ba096dba92858445c7 (patch)
tree44d2e328d3f3075c4c64859ae3d3880c2d9f6116
parentc4083f0d8b06f7ede95968a010153fcc49f8d51c (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.cpp11
-rw-r--r--lib/render_widget_host_view_qt.h2
-rw-r--r--lib/render_widget_host_view_qt_delegate_quick.cpp5
-rw-r--r--lib/render_widget_host_view_qt_delegate_quick.h1
-rw-r--r--lib/render_widget_host_view_qt_delegate_widget.cpp1
-rw-r--r--lib/web_event_factory.cpp48
-rw-r--r--lib/web_event_factory.h2
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*);
};