QScreen's physicalSize can change. Ensure siblings are updated.
authorShawn Rutledge <shawn.rutledge@digia.com>
Thu, 4 Oct 2012 13:47:02 +0000 (15:47 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Tue, 16 Oct 2012 06:41:48 +0000 (08:41 +0200)
I have found the following scenarios when the physical size can
appear to change even though you can't actually stretch your monitor:
1) VNC allows setting the resolution.  Physical size will then be a
fraction of the physical size of the monitor on which you display the
VNC window.
2) When you rotate your display, the width and height are reversed.
3) MacOS X simulates a change in physical size when you change the
mode to one whose aspect ratio does not match your monitor, and also
when you use simulated HiDPI mode on a non-HiDPI monitor.  While this
info is basically wrong, since we are now querying the OS for it, we
might as well make sure it is propagated all the way through to the
QScreen object's properties.

Also, make sure that when geometry changes on one screen, all the
siblings are informed of the change in virtual geometry.  Also
simplified the signals (don't need separate ones to inform of
changes which are fundamentally related to each other and always
change together).

Change-Id: I6a98a1c203e24e8fbeef6e90999671e56dc0c655
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
src/gui/kernel/qguiapplication.cpp
src/gui/kernel/qscreen.h

index f9b38d2..a67917c 100644 (file)
@@ -1946,13 +1946,12 @@ void QGuiApplicationPrivate::reportGeometryChange(QWindowSystemInterfacePrivate:
     Qt::ScreenOrientation primaryOrientation = s->primaryOrientation();
     s->d_func()->updatePrimaryOrientation();
 
-    emit s->sizeChanged(s->size());
     emit s->geometryChanged(s->geometry());
-    emit s->physicalDotsPerInchXChanged(s->physicalDotsPerInchX());
-    emit s->physicalDotsPerInchYChanged(s->physicalDotsPerInchY());
+    emit s->physicalSizeChanged(s->physicalSize());
     emit s->physicalDotsPerInchChanged(s->physicalDotsPerInch());
-    emit s->availableSizeChanged(s->availableSize());
-    emit s->availableGeometryChanged(s->availableGeometry());
+    emit s->logicalDotsPerInchChanged(s->logicalDotsPerInch());
+    foreach (QScreen* sibling, s->virtualSiblings())
+        emit sibling->virtualGeometryChanged(sibling->virtualGeometry());
 
     if (s->primaryOrientation() != primaryOrientation)
         emit s->primaryOrientationChanged(s->primaryOrientation());
@@ -1974,8 +1973,8 @@ void QGuiApplicationPrivate::reportAvailableGeometryChange(
     QScreen *s = e->screen.data();
     s->d_func()->availableGeometry = e->availableGeometry;
 
-    emit s->availableSizeChanged(s->availableSize());
-    emit s->availableGeometryChanged(s->availableGeometry());
+    foreach (QScreen* sibling, s->virtualSiblings())
+        emit sibling->virtualGeometryChanged(sibling->virtualGeometry());
 }
 
 void QGuiApplicationPrivate::reportLogicalDotsPerInchChange(QWindowSystemInterfacePrivate::ScreenLogicalDotsPerInchEvent *e)
@@ -1990,8 +1989,6 @@ void QGuiApplicationPrivate::reportLogicalDotsPerInchChange(QWindowSystemInterfa
     QScreen *s = e->screen.data();
     s->d_func()->logicalDpi = QDpi(e->dpiX, e->dpiY);
 
-    emit s->logicalDotsPerInchXChanged(s->logicalDotsPerInchX());
-    emit s->logicalDotsPerInchYChanged(s->logicalDotsPerInchY());
     emit s->logicalDotsPerInchChanged(s->logicalDotsPerInch());
 }
 
index 6a47a7b..48eaad9 100644 (file)
@@ -70,20 +70,20 @@ class Q_GUI_EXPORT QScreen : public QObject
 
     Q_PROPERTY(QString name READ name CONSTANT)
     Q_PROPERTY(int depth READ depth CONSTANT)
-    Q_PROPERTY(QSize size READ size NOTIFY sizeChanged)
-    Q_PROPERTY(QSize availableSize READ availableSize NOTIFY availableSizeChanged)
-    Q_PROPERTY(QSize virtualSize READ virtualSize NOTIFY sizeChanged)
-    Q_PROPERTY(QSize availableVirtualSize READ availableVirtualSize NOTIFY availableSizeChanged)
+    Q_PROPERTY(QSize size READ size NOTIFY geometryChanged)
+    Q_PROPERTY(QSize availableSize READ availableSize NOTIFY virtualGeometryChanged)
+    Q_PROPERTY(QSize virtualSize READ virtualSize NOTIFY virtualGeometryChanged)
+    Q_PROPERTY(QSize availableVirtualSize READ availableVirtualSize NOTIFY virtualGeometryChanged)
     Q_PROPERTY(QRect geometry READ geometry NOTIFY geometryChanged)
-    Q_PROPERTY(QRect availableGeometry READ availableGeometry NOTIFY availableGeometryChanged)
-    Q_PROPERTY(QRect virtualGeometry READ virtualGeometry NOTIFY sizeChanged)
-    Q_PROPERTY(QRect availableVirtualGeometry READ availableVirtualGeometry NOTIFY availableGeometryChanged)
-    Q_PROPERTY(QSizeF physicalSize READ physicalSize CONSTANT)
-    Q_PROPERTY(qreal physicalDotsPerInchX READ physicalDotsPerInchX NOTIFY physicalDotsPerInchXChanged)
-    Q_PROPERTY(qreal physicalDotsPerInchY READ physicalDotsPerInchY NOTIFY physicalDotsPerInchYChanged)
+    Q_PROPERTY(QRect availableGeometry READ availableGeometry NOTIFY virtualGeometryChanged)
+    Q_PROPERTY(QRect virtualGeometry READ virtualGeometry NOTIFY virtualGeometryChanged)
+    Q_PROPERTY(QRect availableVirtualGeometry READ availableVirtualGeometry NOTIFY virtualGeometryChanged)
+    Q_PROPERTY(QSizeF physicalSize READ physicalSize NOTIFY physicalSizeChanged)
+    Q_PROPERTY(qreal physicalDotsPerInchX READ physicalDotsPerInchX NOTIFY physicalDotsPerInchChanged)
+    Q_PROPERTY(qreal physicalDotsPerInchY READ physicalDotsPerInchY NOTIFY physicalDotsPerInchChanged)
     Q_PROPERTY(qreal physicalDotsPerInch READ physicalDotsPerInch NOTIFY physicalDotsPerInchChanged)
-    Q_PROPERTY(qreal logicalDotsPerInchX READ logicalDotsPerInchX NOTIFY logicalDotsPerInchXChanged)
-    Q_PROPERTY(qreal logicalDotsPerInchY READ logicalDotsPerInchY NOTIFY logicalDotsPerInchYChanged)
+    Q_PROPERTY(qreal logicalDotsPerInchX READ logicalDotsPerInchX NOTIFY logicalDotsPerInchChanged)
+    Q_PROPERTY(qreal logicalDotsPerInchY READ logicalDotsPerInchY NOTIFY logicalDotsPerInchChanged)
     Q_PROPERTY(qreal logicalDotsPerInch READ logicalDotsPerInch NOTIFY logicalDotsPerInchChanged)
     Q_PROPERTY(Qt::ScreenOrientation primaryOrientation READ primaryOrientation NOTIFY primaryOrientationChanged)
     Q_PROPERTY(Qt::ScreenOrientation orientation READ orientation NOTIFY orientationChanged)
@@ -138,16 +138,11 @@ public:
     qreal refreshRate() const;
 
 Q_SIGNALS:
-    void sizeChanged(const QSize &size);
     void geometryChanged(const QRect &geometry);
-    void physicalDotsPerInchXChanged(qreal dpi);
-    void physicalDotsPerInchYChanged(qreal dpi);
+    void physicalSizeChanged(const QSizeF &size);
     void physicalDotsPerInchChanged(qreal dpi);
-    void logicalDotsPerInchXChanged(qreal dpi);
-    void logicalDotsPerInchYChanged(qreal dpi);
     void logicalDotsPerInchChanged(qreal dpi);
-    void availableSizeChanged(const QSize &size);
-    void availableGeometryChanged(const QRect &rect);
+    void virtualGeometryChanged(const QRect &rect);
     void primaryOrientationChanged(Qt::ScreenOrientation orientation);
     void orientationChanged(Qt::ScreenOrientation orientation);
     void refreshRateChanged(qreal refreshRate);