From 738c07542a0bbf867661520559fed9feda985935 Mon Sep 17 00:00:00 2001
From: Alexander Volkov <a.volkov@rusbitech.ru>
Date: Thu, 19 Mar 2015 14:51:53 +0300
Subject: [PATCH] Don't replay mouse press event which closes a popup on X11

Add a new style hint to QPlatformIntegration: ReplayMousePressOutsidePopup.
Return false for it in the xcb plugin.

This commit restores the behavior which was in Qt 4.

Task-number: QTBUG-34814
Change-Id: I19fee762395a51475cc67b52b368c70679ca736b
Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
---
 src/gui/kernel/qplatformintegration.cpp       | 2 ++
 src/gui/kernel/qplatformintegration.h         | 3 ++-
 src/plugins/platforms/xcb/qxcbintegration.cpp | 2 ++
 src/widgets/kernel/qwidgetwindow.cpp          | 3 ++-
 4 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/gui/kernel/qplatformintegration.cpp b/src/gui/kernel/qplatformintegration.cpp
index 6147a2a53a8..f2a92e10dfe 100644
--- a/src/gui/kernel/qplatformintegration.cpp
+++ b/src/gui/kernel/qplatformintegration.cpp
@@ -392,6 +392,8 @@ QVariant QPlatformIntegration::styleHint(StyleHint hint) const
         return QPlatformTheme::defaultThemeHint(QPlatformTheme::MousePressAndHoldInterval);
     case TabFocusBehavior:
         return QPlatformTheme::defaultThemeHint(QPlatformTheme::TabFocusBehavior);
+    case ReplayMousePressOutsidePopup:
+        return true;
     }
 
     return 0;
diff --git a/src/gui/kernel/qplatformintegration.h b/src/gui/kernel/qplatformintegration.h
index 24e19f68e65..34639e6929e 100644
--- a/src/gui/kernel/qplatformintegration.h
+++ b/src/gui/kernel/qplatformintegration.h
@@ -145,7 +145,8 @@ public:
         SetFocusOnTouchRelease,
         ShowIsMaximized,
         MousePressAndHoldInterval,
-        TabFocusBehavior
+        TabFocusBehavior,
+        ReplayMousePressOutsidePopup
     };
 
     virtual QVariant styleHint(StyleHint hint) const;
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp
index 258359d20f2..04c527c6872 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.cpp
+++ b/src/plugins/platforms/xcb/qxcbintegration.cpp
@@ -374,6 +374,8 @@ QVariant QXcbIntegration::styleHint(QPlatformIntegration::StyleHint hint) const
         // X11 always has support for windows, but the
         // window manager could prevent it (e.g. matchbox)
         return false;
+    case QPlatformIntegration::ReplayMousePressOutsidePopup:
+        return false;
     default:
         break;
     }
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp
index 12f5d4b8b06..ba8c16e838d 100644
--- a/src/widgets/kernel/qwidgetwindow.cpp
+++ b/src/widgets/kernel/qwidgetwindow.cpp
@@ -465,7 +465,8 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
         }
 
         if (qApp->activePopupWidget() != activePopupWidget
-            && qt_replay_popup_mouse_event) {
+            && qt_replay_popup_mouse_event
+            && QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::ReplayMousePressOutsidePopup).toBool()) {
             if (m_widget->windowType() != Qt::Popup)
                 qt_button_down = 0;
             if (event->type() == QEvent::MouseButtonPress) {
-- 
GitLab