summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael BrĂ¼ning <michael.bruning@digia.com>2013-09-13 12:46:16 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-16 17:03:56 +0200
commite0a9f95d5b710664b115a99317fcabd7950686c7 (patch)
tree462248f84385f5ba233ba02295f8b3bdb0e5b88e
parente0653be7a315dc0b66af35c340a094de8a284117 (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.cpp23
-rw-r--r--lib/render_widget_host_view_qt.h18
-rw-r--r--lib/web_event_factory.cpp15
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;
}