From 7146cbed6e3a42389593b775bf4a26f05b4b8d82 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= <morten.sorvig@digia.com>
Date: Wed, 22 Oct 2014 00:41:55 +0200
Subject: [PATCH] Cocoa: Guard against recursive event delivery

Fix "Recursive repaint" crash.

Add guard to QCococaWindow::setGeometry and QNSView
updateGeometry to prevent processing window system
events during setGeometry.

Task-number: QTBUG-41449
Change-Id: I304fdf134d433cbc50fafd997ecd91e31cb57f4e
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com>
---
 src/plugins/platforms/cocoa/qcocoawindow.h  | 1 +
 src/plugins/platforms/cocoa/qcocoawindow.mm | 3 +++
 src/plugins/platforms/cocoa/qnsview.mm      | 5 ++++-
 3 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index a43cf73d348..b232c7a4d34 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -268,6 +268,7 @@ public: // for QNSView
 
     bool m_inConstructor;
     bool m_inSetVisible;
+    bool m_inSetGeometry;
 #ifndef QT_NO_OPENGL
     QCocoaGLContext *m_glContext;
 #endif
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index 56c356711e5..6656212457c 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -381,6 +381,7 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw)
     , m_windowUnderMouse(false)
     , m_inConstructor(true)
     , m_inSetVisible(false)
+    , m_inSetGeometry(false)
 #ifndef QT_NO_OPENGL
     , m_glContext(0)
 #endif
@@ -470,6 +471,8 @@ QSurfaceFormat QCocoaWindow::format() const
 
 void QCocoaWindow::setGeometry(const QRect &rectIn)
 {
+    QBoolBlocker inSetGeometry(m_inSetGeometry, true);
+
     QRect rect = rectIn;
     // This means it is a call from QWindow::setFramePosition() and
     // the coordinates include the frame (size is still the contents rectangle).
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index 052a7cc98f1..de30972393c 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -362,7 +362,10 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil;
     if (!m_platformWindow->m_inConstructor) {
         QWindowSystemInterface::handleGeometryChange(m_window, geometry);
         m_platformWindow->updateExposedGeometry();
-        QWindowSystemInterface::flushWindowSystemEvents();
+        // Guard against processing window system events during QWindow::setGeometry
+        // calles, which Qt and Qt applications do not excpect.
+        if (!m_platformWindow->m_inSetGeometry)
+            QWindowSystemInterface::flushWindowSystemEvents();
     }
 }
 
-- 
GitLab