From 6080db8c6d345cf4ad573215828246e86f9dc41b Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@digia.com>
Date: Tue, 14 Oct 2014 16:58:01 +0200
Subject: [PATCH] Check geometry correctly when replaying popup mouse events.

Task-number: QTBUG-41869
Task-number: QTBUG-39313
Change-Id: I2b59f5db6f0ae4007b1a3b58a79eed958e662272
Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
---
 src/widgets/kernel/qwidgetwindow.cpp | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp
index d40fc84d778..1cd042f99d2 100644
--- a/src/widgets/kernel/qwidgetwindow.cpp
+++ b/src/widgets/kernel/qwidgetwindow.cpp
@@ -433,14 +433,19 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
                     QWindow *win = w->windowHandle();
                     if (!win)
                         win = w->nativeParentWidget()->windowHandle();
-                    if (win && win->geometry().contains(event->globalPos())) {
-                        // Use postEvent() to ensure the local QEventLoop terminates when called from QMenu::exec()
-                        const QPoint localPos = win->mapFromGlobal(event->globalPos());
-                        QMouseEvent *e = new QMouseEvent(QEvent::MouseButtonPress, localPos, localPos, event->globalPos(), event->button(), event->buttons(), event->modifiers());
-                        QCoreApplicationPrivate::setEventSpontaneous(e, true);
-                        QGuiApplicationPrivate::setMouseEventSource(e, QGuiApplicationPrivate::mouseEventSource(event));
-                        e->setTimestamp(event->timestamp());
-                        QCoreApplication::postEvent(win, e);
+                    if (win) {
+                        const QRect globalGeometry = win->isTopLevel()
+                            ? win->geometry()
+                            : QRect(win->mapToGlobal(QPoint(0, 0)), win->size());
+                        if (globalGeometry.contains(event->globalPos())) {
+                            // Use postEvent() to ensure the local QEventLoop terminates when called from QMenu::exec()
+                            const QPoint localPos = win->mapFromGlobal(event->globalPos());
+                            QMouseEvent *e = new QMouseEvent(QEvent::MouseButtonPress, localPos, localPos, event->globalPos(), event->button(), event->buttons(), event->modifiers());
+                            QCoreApplicationPrivate::setEventSpontaneous(e, true);
+                            QGuiApplicationPrivate::setMouseEventSource(e, QGuiApplicationPrivate::mouseEventSource(event));
+                            e->setTimestamp(event->timestamp());
+                            QCoreApplication::postEvent(win, e);
+                        }
                     }
                 }
             }
-- 
GitLab