Blob Blame History Raw
From 0d31aa1617c96ed3e3624d77332ea6f13aba1492 Mon Sep 17 00:00:00 2001
From: David Edmundson <davidedmundson@kde.org>
Date: Thu, 23 Apr 2015 15:01:24 +0200
Subject: [PATCH 67/68] Avoid calling potentially pure virtual method

In Qt 5.4 screenChanged is called indirectly from the destructor of
QPlatformScreen. By comparing new values against the oldScreen we call
call virtual methods of QPlatformScreen from it's own destructor which
results in a crash.

This patch simply emits change signals whenever a screen change regardless
of whether the value differs from the previous screen. Arguably less
efficient, but better than crashing.

This fix is not needed in Qt 5.5 where the QPA architecture has changed.

Task-number: QTBUG-45753
Change-Id: Ic155906928855a377add9b21bff9e72b31f4667e
Reviewed-by: Alan Alpert <aalpert@blackberry.com>
---
 src/quick/items/qquickscreen.cpp | 27 +++++++++------------------
 1 file changed, 9 insertions(+), 18 deletions(-)

diff --git a/src/quick/items/qquickscreen.cpp b/src/quick/items/qquickscreen.cpp
index c4d1407..0900adb 100644
--- a/src/quick/items/qquickscreen.cpp
+++ b/src/quick/items/qquickscreen.cpp
@@ -347,24 +347,15 @@ void QQuickScreenAttached::screenChanged(QScreen *screen)
             emit orientationUpdateMaskChanged();
         }
 
-        if (!oldScreen || screen->size() != oldScreen->size()) {
-            emit widthChanged();
-            emit heightChanged();
-        }
-        if (!oldScreen || screen->name() != oldScreen->name())
-            emit nameChanged();
-        if (!oldScreen || screen->orientation() != oldScreen->orientation())
-            emit orientationChanged();
-        if (!oldScreen || screen->primaryOrientation() != oldScreen->primaryOrientation())
-            emit primaryOrientationChanged();
-        if (!oldScreen || screen->availableVirtualGeometry() != oldScreen->availableVirtualGeometry())
-            emit desktopGeometryChanged();
-        if (!oldScreen || screen->logicalDotsPerInch() != oldScreen->logicalDotsPerInch())
-            emit logicalPixelDensityChanged();
-        if (!oldScreen || screen->physicalDotsPerInch() != oldScreen->physicalDotsPerInch())
-            emit pixelDensityChanged();
-        if (!oldScreen || screen->devicePixelRatio() != oldScreen->devicePixelRatio())
-            emit devicePixelRatioChanged();
+        emit widthChanged();
+        emit heightChanged();
+        emit nameChanged();
+        emit orientationChanged();
+        emit primaryOrientationChanged();
+        emit desktopGeometryChanged();
+        emit logicalPixelDensityChanged();
+        emit pixelDensityChanged();
+        emit devicePixelRatioChanged();
 
         connect(screen, SIGNAL(geometryChanged(QRect)),
                 this, SIGNAL(widthChanged()));
-- 
2.3.7