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:
parent
0ef6b3d138
commit
5290027e3b
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
|
|
||||||
|
@ -72,6 +72,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void updatePrimaryOrientation();
|
void updatePrimaryOrientation();
|
||||||
|
void updateGeometriesWithSignals();
|
||||||
|
void emitGeometryChangeSignals(bool geometryChanged, bool availableGeometryChanged);
|
||||||
|
|
||||||
QPlatformScreen *platformScreen = nullptr;
|
QPlatformScreen *platformScreen = nullptr;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user