diff options
author | Michael BrĂ¼ning <michael.bruning@digia.com> | 2013-09-13 12:46:16 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-16 17:03:56 +0200 |
commit | e0a9f95d5b710664b115a99317fcabd7950686c7 (patch) | |
tree | 462248f84385f5ba233ba02295f8b3bdb0e5b88e | |
parent | e0653be7a315dc0b66af35c340a094de8a284117 (diff) |
Implement multiple mouse click detection.
Fixes the ASSERT we were seeing on double clicks and
implements detection for triple, quadruple etc. clicks.
Double mouse clicks forwarded from QMouseEvent are swallowed.
Change-Id: I9be83f809805ab3dea7a508b648046238ce36a90
Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
-rw-r--r-- | lib/render_widget_host_view_qt.cpp | 23 | ||||
-rw-r--r-- | lib/render_widget_host_view_qt.h | 18 | ||||
-rw-r--r-- | lib/web_event_factory.cpp | 15 |
3 files changed, 40 insertions, 16 deletions
diff --git a/lib/render_widget_host_view_qt.cpp b/lib/render_widget_host_view_qt.cpp index 692592469..99bf94653 100644 --- a/lib/render_widget_host_view_qt.cpp +++ b/lib/render_widget_host_view_qt.cpp @@ -57,9 +57,11 @@ #include <QEvent> #include <QFocusEvent> +#include <QGuiApplication> #include <QKeyEvent> #include <QMouseEvent> #include <QScreen> +#include <QStyleHints> #include <QWheelEvent> #include <QWindow> @@ -664,9 +666,26 @@ bool RenderWidgetHostViewQt::IsPopup() const return popup_type_ != WebKit::WebPopupTypeNone; } -void RenderWidgetHostViewQt::handleMouseEvent(QMouseEvent* ev) +void RenderWidgetHostViewQt::handleMouseEvent(QMouseEvent* event) { - m_host->ForwardMouseEvent(WebEventFactory::toWebMouseEvent(ev)); + int eventType = event->type(); + if (eventType == QEvent::MouseButtonDblClick) + return; + + WebKit::WebMouseEvent webEvent = WebEventFactory::toWebMouseEvent(event); + if (eventType == QMouseEvent::MouseButtonPress) { + if (event->button() != m_clickHelper.lastPressButton + || (event->timestamp() - m_clickHelper.lastPressTimestamp > static_cast<ulong>(qGuiApp->styleHints()->mouseDoubleClickInterval())) + || (event->pos() - m_clickHelper.lastPressPosition).manhattanLength() > qGuiApp->styleHints()->startDragDistance()) + m_clickHelper.clickCounter = 0; + + m_clickHelper.lastPressTimestamp = event->timestamp(); + webEvent.clickCount = ++m_clickHelper.clickCounter; + m_clickHelper.lastPressButton = event->button(); + m_clickHelper.lastPressPosition = QPointF(event->pos()).toPoint(); + } + + m_host->ForwardMouseEvent(webEvent); } void RenderWidgetHostViewQt::handleKeyEvent(QKeyEvent *ev) diff --git a/lib/render_widget_host_view_qt.h b/lib/render_widget_host_view_qt.h index 7a9546a48..6b84db392 100644 --- a/lib/render_widget_host_view_qt.h +++ b/lib/render_widget_host_view_qt.h @@ -49,6 +49,7 @@ #include "ui/base/gestures/gesture_recognizer.h" #include "ui/base/gestures/gesture_types.h" #include <QMap> +#include <QPoint> #include <QtGlobal> class BackingStoreQt; @@ -62,6 +63,22 @@ class QWheelEvent; class RenderWidgetHostViewQtDelegate; class WebContentsAdapterClient; +struct MultipleMouseClickHelper +{ + QPoint lastPressPosition; + Qt::MouseButton lastPressButton; + int clickCounter; + ulong lastPressTimestamp; + + MultipleMouseClickHelper() + : lastPressPosition(QPoint()) + , lastPressButton(Qt::NoButton) + , clickCounter(0) + , lastPressTimestamp(0) + { + } +}; + class RenderWidgetHostViewQt : public content::RenderWidgetHostViewBase , public ui::GestureConsumer @@ -173,6 +190,7 @@ private: WebKit::WebTouchEvent m_accumTouchEvent; scoped_ptr<RenderWidgetHostViewQtDelegate> m_delegate; WebContentsAdapterClient *m_adapterClient; + MultipleMouseClickHelper m_clickHelper; bool m_initPending; }; diff --git a/lib/web_event_factory.cpp b/lib/web_event_factory.cpp index 29629823d..d750aa3e0 100644 --- a/lib/web_event_factory.cpp +++ b/lib/web_event_factory.cpp @@ -521,8 +521,6 @@ static WebInputEvent::Type webEventTypeForEvent(const QEvent* event) return WebInputEvent::TouchEnd; case QEvent::TouchCancel: return WebInputEvent::TouchCancel; - case QEvent::MouseButtonDblClick: - return WebInputEvent::Undefined; default: Q_ASSERT(false); return WebInputEvent::MouseMove; @@ -542,18 +540,7 @@ WebMouseEvent WebEventFactory::toWebMouseEvent(QMouseEvent *ev) webKitEvent.globalY = ev->globalY(); webKitEvent.type = webEventTypeForEvent(ev); - - switch (ev->type()) { - case QEvent::MouseButtonPress: - webKitEvent.clickCount = 1; - break; - case QEvent::MouseButtonDblClick: - webKitEvent.clickCount = 2; - break; - default: - webKitEvent.clickCount = 0; - break; - }; + webKitEvent.clickCount = 0; return webKitEvent; } |