QHighDpi::fromNativePixels: use correct screen
Calls like QHighDpi::fromNativePixels(point, window) would return device independent coordinates outside any screen in cases where the window is spanning multiple screens and the native point was not on the main screen. Correct this by looking up the correct screen and use its scale factor and origin when scaling coordinates. Task-number: QTBUG-73231 Change-Id: I01a3a42f42121b8d9f4ced2bb0fb023d6ae6bfe7 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>bb10
parent
244ff33119
commit
b6ded193ee
|
|
@ -452,52 +452,30 @@ QDpi QHighDpiScaling::logicalDpi()
|
|||
return m_logicalDpi;
|
||||
}
|
||||
|
||||
qreal QHighDpiScaling::factor(const QScreen *screen)
|
||||
{
|
||||
// Fast path for when scaling in Qt is not used at all.
|
||||
if (!m_active)
|
||||
return qreal(1.0);
|
||||
|
||||
// The effective factor for a given screen is the product of the
|
||||
// screen and global sub-factors
|
||||
qreal factor = m_factor;
|
||||
if (screen)
|
||||
factor *= screenSubfactor(screen->handle());
|
||||
return factor;
|
||||
}
|
||||
|
||||
qreal QHighDpiScaling::factor(const QPlatformScreen *platformScreen)
|
||||
QHighDpiScaling::ScaleAndOrigin QHighDpiScaling::scaleAndOrigin(const QPlatformScreen *platformScreen, QPoint *nativePosition)
|
||||
{
|
||||
if (!m_active)
|
||||
return qreal(1.0);
|
||||
|
||||
return m_factor * screenSubfactor(platformScreen);
|
||||
return { qreal(1), QPoint() };
|
||||
const QPlatformScreen *actualScreen = nativePosition ?
|
||||
platformScreen->screenForPosition(*nativePosition) : platformScreen;
|
||||
return { m_factor * screenSubfactor(actualScreen), actualScreen->geometry().topLeft() };
|
||||
}
|
||||
|
||||
qreal QHighDpiScaling::factor(const QWindow *window)
|
||||
QHighDpiScaling::ScaleAndOrigin QHighDpiScaling::scaleAndOrigin(const QScreen *screen, QPoint *nativePosition)
|
||||
{
|
||||
if (!m_active)
|
||||
return qreal(1.0);
|
||||
|
||||
return factor(window ? window->screen() : QGuiApplication::primaryScreen());
|
||||
return { qreal(1), QPoint() };
|
||||
if (!screen)
|
||||
return { m_factor, QPoint() }; // the global factor
|
||||
return scaleAndOrigin(screen->handle(), nativePosition);
|
||||
}
|
||||
|
||||
QPoint QHighDpiScaling::origin(const QScreen *screen)
|
||||
QHighDpiScaling::ScaleAndOrigin QHighDpiScaling::scaleAndOrigin(const QWindow *window, QPoint *nativePosition)
|
||||
{
|
||||
return screen->geometry().topLeft();
|
||||
}
|
||||
|
||||
QPoint QHighDpiScaling::origin(const QPlatformScreen *platformScreen)
|
||||
{
|
||||
return platformScreen->geometry().topLeft();
|
||||
}
|
||||
|
||||
QPoint QHighDpiScaling::origin(const QWindow *window)
|
||||
{
|
||||
if (window && window->isTopLevel() && window->screen())
|
||||
return window->screen()->geometry().topLeft();
|
||||
|
||||
return QPoint(0, 0);
|
||||
if (!m_active)
|
||||
return { qreal(1), QPoint() };
|
||||
QScreen *screen = window ? window->screen() : QGuiApplication::primaryScreen();
|
||||
return scaleAndOrigin(screen, nativePosition);
|
||||
}
|
||||
|
||||
#endif //QT_NO_HIGHDPISCALING
|
||||
|
|
|
|||
|
|
@ -78,14 +78,23 @@ public:
|
|||
static void setScreenFactor(QScreen *window, qreal factor);
|
||||
|
||||
static bool isActive() { return m_active; }
|
||||
static qreal factor(const QWindow *window);
|
||||
static qreal factor(const QScreen *screen);
|
||||
static qreal factor(const QPlatformScreen *platformScreen);
|
||||
static QPoint origin(const QScreen *screen);
|
||||
static QPoint origin(const QPlatformScreen *platformScreen);
|
||||
static QPoint origin(const QWindow *window);
|
||||
static QPoint mapPositionToNative(const QPoint &pos, const QPlatformScreen *platformScreen);
|
||||
|
||||
struct ScaleAndOrigin
|
||||
{
|
||||
qreal factor;
|
||||
QPoint origin;
|
||||
};
|
||||
static ScaleAndOrigin scaleAndOrigin(const QPlatformScreen *platformScreen, QPoint *nativePosition = nullptr);
|
||||
static ScaleAndOrigin scaleAndOrigin(const QScreen *screen, QPoint *nativePosition = nullptr);
|
||||
static ScaleAndOrigin scaleAndOrigin(const QWindow *platformScreen, QPoint *nativePosition = nullptr);
|
||||
|
||||
template<typename C>
|
||||
static qreal factor(C *context, QPoint *nativePosition = nullptr) {
|
||||
return scaleAndOrigin(context, nativePosition).factor;
|
||||
}
|
||||
|
||||
static QPoint mapPositionFromNative(const QPoint &pos, const QPlatformScreen *platformScreen);
|
||||
static QPoint mapPositionToNative(const QPoint &pos, const QPlatformScreen *platformScreen);
|
||||
static QPoint mapPositionToGlobal(const QPoint &pos, const QPoint &windowGlobalPosition, const QWindow *window);
|
||||
static QPoint mapPositionFromGlobal(const QPoint &pos, const QPoint &windowGlobalPosition, const QWindow *window);
|
||||
static QDpi logicalDpi();
|
||||
|
|
@ -166,16 +175,26 @@ inline QRegion scale(const QRegion ®ion, qreal scaleFactor, QPoint origin = Q
|
|||
return scaled;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline QPoint position(T) { return QPoint(); }
|
||||
inline QPoint position(QPoint point) { return point; }
|
||||
inline QPoint position(QPointF point) { return point.toPoint(); }
|
||||
inline QPoint position(QRect rect) { return rect.center(); }
|
||||
inline QPoint position(QRectF rect) { return rect.center().toPoint(); }
|
||||
|
||||
template <typename T, typename C>
|
||||
T fromNativePixels(const T &value, const C *context)
|
||||
{
|
||||
return scale(value, qreal(1) / QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
|
||||
QPoint nativePosition = position(value);
|
||||
QHighDpiScaling::ScaleAndOrigin so = QHighDpiScaling::scaleAndOrigin(context, &nativePosition);
|
||||
return scale(value, qreal(1) / so.factor, so.origin);
|
||||
}
|
||||
|
||||
template <typename T, typename C>
|
||||
T toNativePixels(const T &value, const C *context)
|
||||
{
|
||||
return scale(value, QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
|
||||
QHighDpiScaling::ScaleAndOrigin so = QHighDpiScaling::scaleAndOrigin(context);
|
||||
return scale(value, so.factor, so.origin);
|
||||
}
|
||||
|
||||
template <typename T, typename C>
|
||||
|
|
|
|||
Loading…
Reference in New Issue