diff options
author | Kirill Burtsev <kirill.burtsev@qt.io> | 2022-05-05 13:52:32 +0200 |
---|---|---|
committer | Kirill Burtsev <kirill.burtsev@qt.io> | 2022-05-12 16:44:50 +0200 |
commit | 1f6495af6331f5504de9d3f7e43f5202345c7a8c (patch) | |
tree | 7b584ab2c2cc4edfca5b367410c369c7151eed96 | |
parent | 9334feb682db6e6e35bc98dce377a091eb640438 (diff) |
Fix touch input for widget's delegate for html popup
Earlier fix cf8bc1899a introduced the logic, where all system
synthesized mouse events are ignored. But after c56169f7a1 this is
undesired since for widget with Qt::Popup flag touch input is
ignored by QWidgetWindow, and input is expected to be delivered to
popup as synthesized mouse event (either synthesized by Qt or for
capabable devices by system). So allow system synthesized mouse events
to let through for popup. Synthesis by Qt is suppress automatically
for accepted touch event, it's only system event are still delivered
unconditionally, so still ignore them for widgets impl. Global ignore
in core is not needed, since QQuickWidget ignores system synthesized
events unconditionally.
Fixes: QTBUG-79254
Pick-to: 5.15 6.2 6.3
Change-Id: Ie8f55eb8b9c2677d8a98381effb3cb31d9388ac7
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Reviewed-by: Martin Negyokru <negyokru@inf.u-szeged.hu>
-rw-r--r-- | src/core/render_widget_host_view_qt_delegate_client.cpp | 6 | ||||
-rw-r--r-- | src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp | 20 |
2 files changed, 20 insertions, 6 deletions
diff --git a/src/core/render_widget_host_view_qt_delegate_client.cpp b/src/core/render_widget_host_view_qt_delegate_client.cpp index 40f08b5e5..aa48b869e 100644 --- a/src/core/render_widget_host_view_qt_delegate_client.cpp +++ b/src/core/render_widget_host_view_qt_delegate_client.cpp @@ -476,12 +476,6 @@ void RenderWidgetHostViewQtDelegateClient::handleMouseEvent(QMouseEvent *event) if (event->type() == QEvent::MouseButtonRelease) m_mouseButtonPressed--; - // Don't forward mouse events synthesized by the system, which are caused by genuine touch - // events. Chromium would then process for e.g. a mouse click handler twice, once due to the - // system synthesized mouse event, and another time due to a touch-to-gesture-to-mouse - // transformation done by Chromium. - if (event->source() == Qt::MouseEventSynthesizedBySystem) - return; handlePointerEvent<QMouseEvent>(event); } 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 05ca9e3b1..986c1e650 100644 --- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp +++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp @@ -436,6 +436,26 @@ bool RenderWidgetHostViewQtDelegateWidget::event(QEvent *event) break; } + switch (event->type()) { + case QEvent::MouseButtonPress: + case QEvent::MouseButtonRelease: + case QEvent::MouseButtonDblClick: + case QEvent::MouseMove: + // Don't forward mouse events synthesized by the system, which are caused by genuine touch + // events. Chromium would then process for e.g. a mouse click handler twice, once due to the + // system synthesized mouse event, and another time due to a touch-to-gesture-to-mouse + // transformation done by Chromium. + // Only allow them for popup type, since QWidgetWindow will ignore them for Qt::Popup flag, + // which is expected to get input through synthesized mouse events (either by system or Qt) + if (!m_isPopup && static_cast<QMouseEvent *>(event)->source() == Qt::MouseEventSynthesizedBySystem) { + Q_ASSERT(!windowFlags().testFlag(Qt::Popup)); + return true; + } + break; + default: + break; + } + 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 |