From 1ca3a574117bdd8e67381b178a823e7d695f4bfd Mon Sep 17 00:00:00 2001 From: Jocelyn Turcotte Date: Wed, 7 May 2014 15:18:46 +0200 Subject: Fix double clicks needing three presses in QWebEngineView Since Qt 5.3 QWidget has the same behavior as Qt 4 where it will replace a second MouseButtonPress event with a MouseButtonDblClick instead of sending both. Fix the issue by moving the MouseButtonDblClick ignore code up to the QtQuick code, assume that upper layers will not send MouseButtonDblClick events, and re-replace the MouseButtonDblClick event with a MouseButtonPress in the QtWidgets code. Change-Id: I529dad2de538f486b00eb900ea6d2ed849a3b1f0 Reviewed-by: Andras Becsi --- src/core/render_widget_host_view_qt.cpp | 7 +------ .../render_widget_host_view_qt_delegate_quick.cpp | 5 ----- src/webengine/render_widget_host_view_qt_delegate_quick.h | 1 - .../render_widget_host_view_qt_delegate_widget.cpp | 15 ++++++++++++++- 4 files changed, 15 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index fa3fe2312..f02729cd2 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -694,7 +694,6 @@ void RenderWidgetHostViewQt::notifyResize() bool RenderWidgetHostViewQt::forwardEvent(QEvent *event) { switch (event->type()) { - case QEvent::MouseButtonDblClick: case QEvent::MouseButtonPress: Focus(); // Fall through. case QEvent::MouseButtonRelease: @@ -869,12 +868,8 @@ bool RenderWidgetHostViewQt::IsPopup() const void RenderWidgetHostViewQt::handleMouseEvent(QMouseEvent* event) { - int eventType = event->type(); - if (eventType == QEvent::MouseButtonDblClick) - return; - blink::WebMouseEvent webEvent = WebEventFactory::toWebMouseEvent(event, dpiScale()); - if (eventType == QMouseEvent::MouseButtonPress) { + if (event->type() == QMouseEvent::MouseButtonPress) { if (event->button() != m_clickHelper.lastPressButton || (event->timestamp() - m_clickHelper.lastPressTimestamp > static_cast(qGuiApp->styleHints()->mouseDoubleClickInterval())) || (event->pos() - m_clickHelper.lastPressPosition).manhattanLength() > qGuiApp->styleHints()->startDragDistance()) 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 4dc9031ad..8d7f298e7 100644 --- a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp +++ b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp @@ -172,11 +172,6 @@ void RenderWidgetHostViewQtDelegateQuick::mouseReleaseEvent(QMouseEvent *event) m_client->forwardEvent(event); } -void RenderWidgetHostViewQtDelegateQuick::mouseDoubleClickEvent(QMouseEvent *event) -{ - m_client->forwardEvent(event); -} - void RenderWidgetHostViewQtDelegateQuick::keyPressEvent(QKeyEvent *event) { m_client->forwardEvent(event); diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.h b/src/webengine/render_widget_host_view_qt_delegate_quick.h index 71a2de013..2efb2d098 100644 --- a/src/webengine/render_widget_host_view_qt_delegate_quick.h +++ b/src/webengine/render_widget_host_view_qt_delegate_quick.h @@ -74,7 +74,6 @@ protected: virtual void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; virtual void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE; virtual void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; - virtual void mouseDoubleClickEvent(QMouseEvent *event) Q_DECL_OVERRIDE; virtual void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE; virtual void keyReleaseEvent(QKeyEvent *event) Q_DECL_OVERRIDE; virtual void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE; diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp index 6c3f1cb1c..46f531e52 100644 --- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp +++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp @@ -178,7 +178,20 @@ void RenderWidgetHostViewQtDelegateWidget::resizeEvent(QResizeEvent *resizeEvent bool RenderWidgetHostViewQtDelegateWidget::event(QEvent *event) { - if (!m_client->forwardEvent(event)) + bool handled = false; + if (event->type() == QEvent::MouseButtonDblClick) { + // QWidget keeps the Qt4 behavior where the DblClick event would replace the Press event. + // QtQuick is different by sending both the Press and DblClick events for the second press + // where we can simply ignore the DblClick event. + QMouseEvent *dblClick = static_cast(event); + QMouseEvent press(QEvent::MouseButtonPress, dblClick->localPos(), dblClick->windowPos(), dblClick->screenPos(), + dblClick->button(), dblClick->buttons(), dblClick->modifiers()); + press.setTimestamp(dblClick->timestamp()); + handled = m_client->forwardEvent(&press); + } else + handled = m_client->forwardEvent(event); + + if (!handled) return QOpenGLWidget::event(event); return true; } -- cgit v1.2.3