Emit QScreen::(availableG|g)eometryChanged() on logical DPI change

When a change in logical DPI occurs due to the user changing the scaling
factor, the screen size in device independent pixels may change
due to High DPI choosing a different scale factor.

Factor out the commonly used code into QScreenPrivate methods
and use them from
QGuiApplicationPrivate::processScreenLogicalDotsPerInchChange().

Pick-to: 5.15
Task-number: QTBUG-76902
Task-number: QTBUG-79248
Change-Id: I241a0f52d8236a65084d501fb4d8f9faeea89c0f
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
This commit is contained in:
Friedemann Kleint 2019-12-03 09:21:43 +01:00
parent 0ef6b3d138
commit 5290027e3b
3 changed files with 25 additions and 11 deletions

View File

@ -3131,14 +3131,7 @@ void QGuiApplicationPrivate::processScreenGeometryChange(QWindowSystemInterfaceP
updateFilteredScreenOrientation(s); updateFilteredScreenOrientation(s);
} }
if (availableGeometryChanged) s->d_func()->emitGeometryChangeSignals(geometryChanged, availableGeometryChanged);
emit s->availableGeometryChanged(s->availableGeometry());
if (geometryChanged || availableGeometryChanged) {
const auto siblings = s->virtualSiblings();
for (QScreen* sibling : siblings)
emit sibling->virtualGeometryChanged(sibling->virtualGeometry());
}
resetCachedDevicePixelRatio(); resetCachedDevicePixelRatio();
} }
@ -3156,6 +3149,7 @@ void QGuiApplicationPrivate::processScreenLogicalDotsPerInchChange(QWindowSystem
s->d_func()->logicalDpi = QDpi(e->dpiX, e->dpiY); s->d_func()->logicalDpi = QDpi(e->dpiX, e->dpiY);
emit s->logicalDotsPerInchChanged(s->logicalDotsPerInch()); emit s->logicalDotsPerInchChanged(s->logicalDotsPerInch());
s->d_func()->updateGeometriesWithSignals();
resetCachedDevicePixelRatio(); resetCachedDevicePixelRatio();
} }

View File

@ -77,15 +77,33 @@ QScreen::QScreen(QPlatformScreen *screen)
d->setPlatformScreen(screen); d->setPlatformScreen(screen);
} }
void QScreenPrivate::updateGeometriesWithSignals()
{
const QRect oldGeometry = geometry;
const QRect oldAvailableGeometry = availableGeometry;
updateHighDpi();
emitGeometryChangeSignals(oldGeometry != geometry, oldAvailableGeometry != availableGeometry);
}
void QScreenPrivate::emitGeometryChangeSignals(bool geometryChanged, bool availableGeometryChanged)
{
Q_Q(QScreen);
if (availableGeometryChanged)
emit q->availableGeometryChanged(availableGeometry);
if (geometryChanged || availableGeometryChanged) {
const auto siblings = q->virtualSiblings();
for (QScreen* sibling : siblings)
emit sibling->virtualGeometryChanged(sibling->virtualGeometry());
}
}
void QScreenPrivate::setPlatformScreen(QPlatformScreen *screen) void QScreenPrivate::setPlatformScreen(QPlatformScreen *screen)
{ {
Q_Q(QScreen); Q_Q(QScreen);
platformScreen = screen; platformScreen = screen;
platformScreen->d_func()->screen = q; platformScreen->d_func()->screen = q;
orientation = platformScreen->orientation(); orientation = platformScreen->orientation();
geometry = platformScreen->deviceIndependentGeometry();
availableGeometry = QHighDpi::fromNative(platformScreen->availableGeometry(),
QHighDpiScaling::factor(platformScreen), geometry.topLeft());
logicalDpi = QPlatformScreen::overrideDpi(platformScreen->logicalDpi()); logicalDpi = QPlatformScreen::overrideDpi(platformScreen->logicalDpi());

View File

@ -72,6 +72,8 @@ public:
} }
void updatePrimaryOrientation(); void updatePrimaryOrientation();
void updateGeometriesWithSignals();
void emitGeometryChangeSignals(bool geometryChanged, bool availableGeometryChanged);
QPlatformScreen *platformScreen = nullptr; QPlatformScreen *platformScreen = nullptr;