summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gui/kernel/qplatformscreen_qpa.cpp33
-rw-r--r--src/gui/kernel/qplatformscreen_qpa.h6
-rw-r--r--src/gui/kernel/qscreen.cpp69
-rw-r--r--src/gui/kernel/qscreen.h12
-rw-r--r--src/gui/text/qfont.cpp8
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.mm2
-rw-r--r--src/plugins/platforms/directfb/qdirectfbintegration.cpp2
-rw-r--r--src/plugins/platforms/directfb/qdirectfbintegration.h4
-rw-r--r--src/plugins/platforms/kms/qkmsscreen.cpp4
-rw-r--r--src/plugins/platforms/kms/qkmsscreen.h4
-rw-r--r--src/plugins/platforms/openwfd/qopenwfdscreen.cpp4
-rw-r--r--src/plugins/platforms/openwfd/qopenwfdscreen.h2
-rw-r--r--src/plugins/platforms/qvfb/qvfbintegration.cpp4
-rw-r--r--src/plugins/platforms/qvfb/qvfbintegration.h2
-rw-r--r--src/plugins/platforms/uikit/quikitscreen.h4
-rw-r--r--src/plugins/platforms/uikit/quikitscreen.mm2
-rw-r--r--src/plugins/platforms/windows/qwindowsscreen.cpp16
-rw-r--r--src/plugins/platforms/windows/qwindowsscreen.h7
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.cpp4
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.h2
-rw-r--r--src/plugins/platforms/xlib/qxlibscreen.cpp2
-rw-r--r--src/plugins/platforms/xlib/qxlibscreen.h4
-rw-r--r--src/widgets/kernel/qwidget_qpa.cpp23
24 files changed, 165 insertions, 59 deletions
diff --git a/src/gui/kernel/qplatformscreen_qpa.cpp b/src/gui/kernel/qplatformscreen_qpa.cpp
index 1a8e6d8f7c..86dc0bd588 100644
--- a/src/gui/kernel/qplatformscreen_qpa.cpp
+++ b/src/gui/kernel/qplatformscreen_qpa.cpp
@@ -127,20 +127,41 @@ QScreen *QPlatformScreen::screen() const
/*!
Reimplement this function in subclass to return the physical size of the
- screen. This function is used by QFont to convert point sizes to pixel
- sizes.
+ screen. The physical size represents the actual physical dimensions of
+ the display.
The default implementation takes the pixel size of the screen, considers a
resolution of 100 dots per inch, and returns the calculated physical size.
A device with a screen that has different resolutions will need to be
supported by a suitable reimplementation of this function.
+
+ \sa logcalDpi
*/
-QSize QPlatformScreen::physicalSize() const
+QSizeF QPlatformScreen::physicalSize() const
{
static const int dpi = 100;
- int width = geometry().width() / dpi * qreal(25.4) ;
- int height = geometry().height() / dpi * qreal(25.4) ;
- return QSize(width,height);
+ return QSizeF(geometry().size()) / dpi * qreal(25.4);
+}
+
+/*!
+ Reimplement this function in subclass to return the logical horizontal
+ and vertical dots per inch metrics of the screen.
+
+ The logical dots per inch metrics are used by QFont to convert point sizes
+ to pixel sizes.
+
+ The default implementation uses the screen pixel size and physical size to
+ compute the metrics.
+
+ \sa physicalSize
+*/
+QDpi QPlatformScreen::logicalDpi() const
+{
+ QSizeF ps = physicalSize();
+ QSize s = geometry().size();
+
+ return QDpi(25.4 * s.width() / ps.width(),
+ 25.4 * s.height() / ps.height());
}
QPlatformScreen * QPlatformScreen::platformScreenForWindow(const QWindow *window)
diff --git a/src/gui/kernel/qplatformscreen_qpa.h b/src/gui/kernel/qplatformscreen_qpa.h
index 7c20fba0ba..6917d5eca5 100644
--- a/src/gui/kernel/qplatformscreen_qpa.h
+++ b/src/gui/kernel/qplatformscreen_qpa.h
@@ -67,6 +67,8 @@ class QPlatformWindow;
class QScreen;
class QSurfaceFormat;
+typedef QPair<qreal, qreal> QDpi;
+
class Q_GUI_EXPORT QPlatformScreenPageFlipper : public QObject
{
Q_OBJECT
@@ -93,7 +95,9 @@ public:
virtual int depth() const = 0;
virtual QImage::Format format() const = 0;
- virtual QSize physicalSize() const;
+
+ virtual QSizeF physicalSize() const;
+ virtual QDpi logicalDpi() const;
virtual QWindow *topLevelAt(const QPoint &point) const;
virtual QList<QPlatformScreen *> virtualSiblings() const;
diff --git a/src/gui/kernel/qscreen.cpp b/src/gui/kernel/qscreen.cpp
index 96ed2bd410..c2049af1e5 100644
--- a/src/gui/kernel/qscreen.cpp
+++ b/src/gui/kernel/qscreen.cpp
@@ -102,6 +102,75 @@ QSize QScreen::size() const
}
/*!
+ Gets the number of physical dots or pixels per inch in the horizontal direction.
+
+ This value represents the actual horizontal pixel density on the screen's display.
+ Depending on what information the underlying system provides the value might not be
+ entirely accurate.
+
+ \sa physicalDotsPerInchY()
+*/
+qreal QScreen::physicalDotsPerInchX() const
+{
+ return size().width() / physicalSize().width() * 25.4;
+}
+
+/*!
+ Gets the number of physical dots or pixels per inch in the vertical direction.
+
+ This value represents the actual vertical pixel density on the screen's display.
+ Depending on what information the underlying system provides the value might not be
+ entirely accurate.
+
+ \sa physicalDotsPerInchX()
+*/
+qreal QScreen::physicalDotsPerInchY() const
+{
+ return size().height() / physicalSize().height() * 25.4;
+}
+
+/*!
+ Gets the number of logical dots or pixels per inch in the horizontal direction.
+
+ This value is used to convert font point sizes to pixel sizes.
+
+ \sa logicalDotsPerInchY()
+*/
+qreal QScreen::logicalDotsPerInchX() const
+{
+ Q_D(const QScreen);
+ return d->platformScreen->logicalDpi().first;
+}
+
+/*!
+ Gets the number of logical dots or pixels per inch in the vertical direction.
+
+ This value is used to convert font point sizes to pixel sizes.
+
+ \sa logicalDotsPerInchX()
+*/
+qreal QScreen::logicalDotsPerInchY() const
+{
+ Q_D(const QScreen);
+ return d->platformScreen->logicalDpi().second;
+}
+
+/*!
+ Get the screen's physical size (in millimeters).
+
+ The physical size represents the actual physical dimensions of the
+ screen's display.
+
+ Depending on what information the underlying system provides the value
+ might not be entirely accurate.
+*/
+QSizeF QScreen::physicalSize() const
+{
+ Q_D(const QScreen);
+ return d->platformScreen->physicalSize();
+}
+
+/*!
Get the screen's available size.
The available size is the size excluding window manager reserved areas
diff --git a/src/gui/kernel/qscreen.h b/src/gui/kernel/qscreen.h
index ea068cd834..72681eb6da 100644
--- a/src/gui/kernel/qscreen.h
+++ b/src/gui/kernel/qscreen.h
@@ -44,6 +44,9 @@
#include <QtCore/QList>
#include <QtCore/QObject>
+#include <QtCore/QRect>
+#include <QtCore/QSize>
+#include <QtCore/QSizeF>
QT_BEGIN_HEADER
@@ -54,7 +57,6 @@ QT_MODULE(Gui)
class QPlatformScreen;
class QScreenPrivate;
class QWindow;
-class QSize;
class QRect;
class Q_GUI_EXPORT QScreen : public QObject
@@ -72,6 +74,14 @@ public:
QSize size() const;
QRect geometry() const;
+ QSizeF physicalSize() const;
+
+ qreal physicalDotsPerInchX() const;
+ qreal physicalDotsPerInchY() const;
+
+ qreal logicalDotsPerInchX() const;
+ qreal logicalDotsPerInchY() const;
+
QSize availableSize() const;
QRect availableGeometry() const;
diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp
index e8308dba06..3d2dfb9c76 100644
--- a/src/gui/text/qfont.cpp
+++ b/src/gui/text/qfont.cpp
@@ -170,9 +170,7 @@ Q_GUI_EXPORT int qt_defaultDpiX()
#elif defined(Q_WS_QPA)
QScreen *screen = QGuiApplication::primaryScreen();
if (screen) {
- const QSize screenSize = screen->geometry().size();
- const QSize physicalSize = screen->handle()->physicalSize();
- dpi = qRound(screenSize.width() / (physicalSize.width() / qreal(25.4)));
+ dpi = qRound(screen->logicalDotsPerInchX());
} else {
//PI has not been initialised, or it is being initialised. Give a default dpi
dpi = 100;
@@ -200,9 +198,7 @@ Q_GUI_EXPORT int qt_defaultDpiY()
#elif defined(Q_WS_QPA)
QScreen *screen = QGuiApplication::primaryScreen();
if (screen) {
- const QSize screenSize = screen->geometry().size();
- const QSize physicalSize = screen->handle()->physicalSize();
- dpi = qRound(screenSize.height() / (physicalSize.height() / qreal(25.4)));
+ dpi = qRound(screen->logicalDotsPerInchY());
} else {
//PI has not been initialised, or it is being initialised. Give a default dpi
dpi = 100;
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.h b/src/plugins/platforms/cocoa/qcocoaintegration.h
index a253a6bea3..6e845de790 100644
--- a/src/plugins/platforms/cocoa/qcocoaintegration.h
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.h
@@ -59,14 +59,14 @@ public:
QRect geometry() const { return m_geometry; }
int depth() const { return m_depth; }
QImage::Format format() const { return m_format; }
- QSize physicalSize() const { return m_physicalSize; }
+ QSizeF physicalSize() const { return m_physicalSize; }
public:
NSScreen *m_screen;
QRect m_geometry;
int m_depth;
QImage::Format m_format;
- QSize m_physicalSize;
+ QSizeF m_physicalSize;
};
class QCocoaIntegration : public QPlatformIntegration
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm
index 63993146bd..68567a3c70 100644
--- a/src/plugins/platforms/cocoa/qcocoaintegration.mm
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm
@@ -70,7 +70,7 @@ QCocoaScreen::QCocoaScreen(int screenIndex)
const int dpi = 72;
const qreal inch = 25.4;
- m_physicalSize = QSize(qRound(m_geometry.width() * inch / dpi), qRound(m_geometry.height() *inch / dpi));
+ m_physicalSize = QSizeF(m_geometry.size()) * inch / dpi;
}
QCocoaScreen::~QCocoaScreen()
diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.cpp b/src/plugins/platforms/directfb/qdirectfbintegration.cpp
index 7bf26b433a..803d2f5dac 100644
--- a/src/plugins/platforms/directfb/qdirectfbintegration.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbintegration.cpp
@@ -73,7 +73,7 @@ QDirectFbScreen::QDirectFbScreen(int display)
const int dpi = 72;
const qreal inch = 25.4;
m_depth = QDirectFbConvenience::colorDepthForSurface(config.pixelformat);
- m_physicalSize = QSize(qRound(config.width * inch / dpi), qRound(config.height *inch / dpi));
+ m_physicalSize = QSizeF(config.width, config.height) * inch / dpi;
m_cursor = new QDirectFBCursor(this);
}
diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.h b/src/plugins/platforms/directfb/qdirectfbintegration.h
index 64f3b6005a..cba32497b3 100644
--- a/src/plugins/platforms/directfb/qdirectfbintegration.h
+++ b/src/plugins/platforms/directfb/qdirectfbintegration.h
@@ -63,13 +63,13 @@ public:
QRect geometry() const { return m_geometry; }
int depth() const { return m_depth; }
QImage::Format format() const { return m_format; }
- QSize physicalSize() const { return m_physicalSize; }
+ QSizeF physicalSize() const { return m_physicalSize; }
public:
QRect m_geometry;
int m_depth;
QImage::Format m_format;
- QSize m_physicalSize;
+ QSizeF m_physicalSize;
IDirectFBDisplayLayer *m_layer;
diff --git a/src/plugins/platforms/kms/qkmsscreen.cpp b/src/plugins/platforms/kms/qkmsscreen.cpp
index 0cd1530930..9ea20ae505 100644
--- a/src/plugins/platforms/kms/qkmsscreen.cpp
+++ b/src/plugins/platforms/kms/qkmsscreen.cpp
@@ -91,7 +91,7 @@ QImage::Format QKmsScreen::format() const
return m_format;
}
-QSize QKmsScreen::physicalSize() const
+QSizeF QKmsScreen::physicalSize() const
{
return m_physicalSize;
}
@@ -132,7 +132,7 @@ void QKmsScreen::initializeScreenMode()
m_geometry = QRect(0, 0, m_mode.hdisplay, m_mode.vdisplay);
m_depth = 32;
m_format = QImage::Format_RGB32;
- m_physicalSize = QSize(connector->mmWidth, connector->mmHeight);
+ m_physicalSize = QSizeF(connector->mmWidth, connector->mmHeight);
//Setup three buffers for current mode
m_bufferManager.setupBuffersForMode(m_mode, 3);
diff --git a/src/plugins/platforms/kms/qkmsscreen.h b/src/plugins/platforms/kms/qkmsscreen.h
index 5c8b5ca4f5..5807366f8b 100644
--- a/src/plugins/platforms/kms/qkmsscreen.h
+++ b/src/plugins/platforms/kms/qkmsscreen.h
@@ -60,7 +60,7 @@ public:
QRect geometry() const;
int depth() const;
QImage::Format format() const;
- QSize physicalSize() const;
+ QSizeF physicalSize() const;
GLuint framebufferObject() const;
quint32 crtcId() const { return m_crtcId; }
@@ -83,7 +83,7 @@ private:
quint32 m_crtcId;
drmModeModeInfo m_mode;
QRect m_geometry;
- QSize m_physicalSize;
+ QSizeF m_physicalSize;
int m_depth;
QImage::Format m_format;
diff --git a/src/plugins/platforms/openwfd/qopenwfdscreen.cpp b/src/plugins/platforms/openwfd/qopenwfdscreen.cpp
index 785bee9c55..0d3361899b 100644
--- a/src/plugins/platforms/openwfd/qopenwfdscreen.cpp
+++ b/src/plugins/platforms/openwfd/qopenwfdscreen.cpp
@@ -112,9 +112,9 @@ QImage::Format QOpenWFDScreen::format() const
return QImage::Format_RGB32;
}
-QSize QOpenWFDScreen::physicalSize() const
+QSizeF QOpenWFDScreen::physicalSize() const
{
- return mPort->physicalSize().toSize();
+ return mPort->physicalSize();
}
QOpenWFDPort * QOpenWFDScreen::port() const
diff --git a/src/plugins/platforms/openwfd/qopenwfdscreen.h b/src/plugins/platforms/openwfd/qopenwfdscreen.h
index bb23744ac4..fc65e504ac 100644
--- a/src/plugins/platforms/openwfd/qopenwfdscreen.h
+++ b/src/plugins/platforms/openwfd/qopenwfdscreen.h
@@ -64,7 +64,7 @@ public:
QRect geometry() const;
int depth() const;
QImage::Format format() const;
- QSize physicalSize() const;
+ QSizeF physicalSize() const;
QOpenWFDPort *port() const;
diff --git a/src/plugins/platforms/qvfb/qvfbintegration.cpp b/src/plugins/platforms/qvfb/qvfbintegration.cpp
index d4d8183936..1ddf934ee9 100644
--- a/src/plugins/platforms/qvfb/qvfbintegration.cpp
+++ b/src/plugins/platforms/qvfb/qvfbintegration.cpp
@@ -392,8 +392,8 @@ QImage::Format QVFbScreen::format() const
return d_ptr->format();
}
-QSize QVFbScreen::physicalSize() const {
- return (d_ptr->screenSize()*254)/720;
+QSizeF QVFbScreen::physicalSize() const {
+ return (QSizeF(d_ptr->screenSize())*254)/720.;
}
#if 0
diff --git a/src/plugins/platforms/qvfb/qvfbintegration.h b/src/plugins/platforms/qvfb/qvfbintegration.h
index 1c736c24e0..c6bfcc519c 100644
--- a/src/plugins/platforms/qvfb/qvfbintegration.h
+++ b/src/plugins/platforms/qvfb/qvfbintegration.h
@@ -60,7 +60,7 @@ public:
QRect geometry() const;
int depth() const;
QImage::Format format() const;
- QSize physicalSize() const;
+ QSizeF physicalSize() const;
QImage *screenImage();
diff --git a/src/plugins/platforms/uikit/quikitscreen.h b/src/plugins/platforms/uikit/quikitscreen.h
index 23e95f692b..bde4f89a1e 100644
--- a/src/plugins/platforms/uikit/quikitscreen.h
+++ b/src/plugins/platforms/uikit/quikitscreen.h
@@ -57,7 +57,7 @@ public:
QRect geometry() const { return m_geometry; }
int depth() const { return m_depth; }
QImage::Format format() const { return m_format; }
- QSize physicalSize() const { return m_physicalSize; }
+ QSizeF physicalSize() const { return m_physicalSize; }
UIScreen *uiScreen() const;
@@ -65,7 +65,7 @@ private:
QRect m_geometry;
int m_depth;
QImage::Format m_format;
- QSize m_physicalSize;
+ QSizeF m_physicalSize;
int m_index;
};
diff --git a/src/plugins/platforms/uikit/quikitscreen.mm b/src/plugins/platforms/uikit/quikitscreen.mm
index 0a5b027b2b..b938542df4 100644
--- a/src/plugins/platforms/uikit/quikitscreen.mm
+++ b/src/plugins/platforms/uikit/quikitscreen.mm
@@ -67,7 +67,7 @@ QUIKitScreen::QUIKitScreen(int screenIndex)
dpi = 132.;
dragDistance = 10;
}
- m_physicalSize = QSize(qRound(bounds.size.width * inch / dpi), qRound(bounds.size.height * inch / dpi));
+ m_physicalSize = QSizeF(bounds.size.width, bounds.size.height) * inch / dpi;
qApp->setStartDragDistance(dragDistance);
[pool release];
}
diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp
index cde9dec21b..c6784e5bf3 100644
--- a/src/plugins/platforms/windows/qwindowsscreen.cpp
+++ b/src/plugins/platforms/windows/qwindowsscreen.cpp
@@ -55,8 +55,6 @@
QT_BEGIN_NAMESPACE
-typedef QPair<int, int> DPI;
-
QWindowsScreenData::QWindowsScreenData() :
dpi(96, 96),
depth(32),
@@ -64,25 +62,25 @@ QWindowsScreenData::QWindowsScreenData() :
{
}
-static inline DPI deviceDPI(HDC hdc)
+static inline QDpi deviceDPI(HDC hdc)
{
- return DPI(GetDeviceCaps(hdc, LOGPIXELSX), GetDeviceCaps(hdc, LOGPIXELSY));
+ return QDpi(GetDeviceCaps(hdc, LOGPIXELSX), GetDeviceCaps(hdc, LOGPIXELSY));
}
-static inline QSize deviceSizeMM(const QSize &pixels, const DPI &dpi)
+static inline QSizeF deviceSizeMM(const QSize &pixels, const QDpi &dpi)
{
const qreal inchToMM = 25.4;
const qreal h = qreal(pixels.width()) / qreal(dpi.first) * inchToMM;
const qreal v = qreal(pixels.height()) / qreal(dpi.second) * inchToMM;
- return QSize(qRound(h), qRound(v));
+ return QSizeF(h, v);
}
-static inline DPI deviceDPI(const QSize &pixels, const QSize &physicalSizeMM)
+static inline QDpi deviceDPI(const QSize &pixels, const QSizeF &physicalSizeMM)
{
const qreal inchToMM = 25.4;
const qreal h = qreal(pixels.width()) / (qreal(physicalSizeMM.width()) / inchToMM);
const qreal v = qreal(pixels.height()) / (qreal(physicalSizeMM.height()) / inchToMM);
- return DPI(qRound(v), qRound(h));
+ return QDpi(h, v);
}
typedef QList<QWindowsScreenData> WindowsScreenDataList;
@@ -101,13 +99,13 @@ BOOL QT_WIN_CALLBACK monitorEnumCallback(HMONITOR hMonitor, HDC, LPRECT, LPARAM
data.geometry = QRect(QPoint(info.rcMonitor.left, info.rcMonitor.top), QPoint(info.rcMonitor.right - 1, info.rcMonitor.bottom - 1));
if (HDC hdc = CreateDC(info.szDevice, NULL, NULL, NULL)) {
data.dpi = deviceDPI(hdc);
+ data.physicalSizeMM = QSizeF(GetDeviceCaps(hdc, HORZSIZE), GetDeviceCaps(hdc, VERTSIZE));
DeleteDC(hdc);
} else {
qWarning("%s: Unable to obtain handle for monitor '%s', defaulting to %d DPI.",
__FUNCTION__, qPrintable(QString::fromWCharArray(info.szDevice)),
data.dpi.first);
}
- data.physicalSizeMM = deviceSizeMM(data.geometry.size(), data.dpi);
data.geometry = QRect(QPoint(info.rcMonitor.left, info.rcMonitor.top), QPoint(info.rcMonitor.right - 1, info.rcMonitor.bottom - 1));
data.availableGeometry = QRect(QPoint(info.rcWork.left, info.rcWork.top), QPoint(info.rcWork.right - 1, info.rcWork.bottom - 1));
data.primary = (info.dwFlags & MONITORINFOF_PRIMARY) != 0;
diff --git a/src/plugins/platforms/windows/qwindowsscreen.h b/src/plugins/platforms/windows/qwindowsscreen.h
index 65ee865d5e..b424375694 100644
--- a/src/plugins/platforms/windows/qwindowsscreen.h
+++ b/src/plugins/platforms/windows/qwindowsscreen.h
@@ -56,8 +56,8 @@ struct QWindowsScreenData
QRect geometry;
QRect availableGeometry;
- QPair<int, int> dpi;
- QSize physicalSizeMM;
+ QDpi dpi;
+ QSizeF physicalSizeMM;
int depth;
QImage::Format format;
bool primary;
@@ -74,7 +74,8 @@ public:
virtual QRect availableGeometry() const { return m_data.availableGeometry; }
virtual int depth() const { return m_data.depth; }
virtual QImage::Format format() const { return m_data.format; }
- virtual QSize physicalSize() const { return m_data.physicalSizeMM; }
+ virtual QSizeF physicalSize() const { return m_data.physicalSizeMM; }
+ virtual QDpi logicalDpi() const { return m_data.dpi; }
virtual QWindow *topLevelAt(const QPoint &point) const
{ return QWindowsScreen::findTopLevelAt(point, CWP_SKIPINVISIBLE); }
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp
index d9583160d7..386dbdc49f 100644
--- a/src/plugins/platforms/xcb/qxcbscreen.cpp
+++ b/src/plugins/platforms/xcb/qxcbscreen.cpp
@@ -222,9 +222,9 @@ QImage::Format QXcbScreen::format() const
return QImage::Format_RGB32;
}
-QSize QXcbScreen::physicalSize() const
+QSizeF QXcbScreen::physicalSize() const
{
- return QSize(m_screen->width_in_millimeters, m_screen->height_in_millimeters);
+ return QSizeF(m_screen->width_in_millimeters, m_screen->height_in_millimeters);
}
int QXcbScreen::screenNumber() const
diff --git a/src/plugins/platforms/xcb/qxcbscreen.h b/src/plugins/platforms/xcb/qxcbscreen.h
index 3c9bf0513c..76cc0fa1b4 100644
--- a/src/plugins/platforms/xcb/qxcbscreen.h
+++ b/src/plugins/platforms/xcb/qxcbscreen.h
@@ -67,7 +67,7 @@ public:
QRect geometry() const;
int depth() const;
QImage::Format format() const;
- QSize physicalSize() const;
+ QSizeF physicalSize() const;
int screenNumber() const;
diff --git a/src/plugins/platforms/xlib/qxlibscreen.cpp b/src/plugins/platforms/xlib/qxlibscreen.cpp
index e6263c0b33..314a3e4ecb 100644
--- a/src/plugins/platforms/xlib/qxlibscreen.cpp
+++ b/src/plugins/platforms/xlib/qxlibscreen.cpp
@@ -218,7 +218,7 @@ QXlibScreen::QXlibScreen()
int physicalWidth = DisplayWidthMM(mDisplay->nativeDisplay(), mScreen);
int physicalHeight = DisplayHeightMM(mDisplay->nativeDisplay(), mScreen);
- mPhysicalSize = QSize(physicalWidth,physicalHeight);
+ mPhysicalSize = QSizeF(physicalWidth, physicalHeight);
int xSocketNumber = XConnectionNumber(mDisplay->nativeDisplay());
diff --git a/src/plugins/platforms/xlib/qxlibscreen.h b/src/plugins/platforms/xlib/qxlibscreen.h
index 6e1a3e401d..13fc03ef0f 100644
--- a/src/plugins/platforms/xlib/qxlibscreen.h
+++ b/src/plugins/platforms/xlib/qxlibscreen.h
@@ -62,7 +62,7 @@ public:
QRect geometry() const { return mGeometry; }
int depth() const { return mDepth; }
QImage::Format format() const { return mFormat; }
- QSize physicalSize() const { return mPhysicalSize; }
+ QSizeF physicalSize() const { return mPhysicalSize; }
Window rootWindow();
unsigned long blackPixel();
@@ -94,7 +94,7 @@ private:
void handleSelectionRequest(XEvent *event);
QRect mGeometry;
- QSize mPhysicalSize;
+ QSizeF mPhysicalSize;
int mDepth;
QImage::Format mFormat;
QXlibCursor *mCursor;
diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp
index 65ba0fcb5a..f1e0835b8b 100644
--- a/src/widgets/kernel/qwidget_qpa.cpp
+++ b/src/widgets/kernel/qwidget_qpa.cpp
@@ -739,12 +739,15 @@ int QWidget::metric(PaintDeviceMetric m) const
{
Q_D(const QWidget);
- QPlatformScreen *screen = 0;
+ QScreen *screen = 0;
if (QWidget *topLevel = window())
- if (QWindow *topLevelWindow = topLevel->windowHandle())
- screen = QPlatformScreen::platformScreenForWindow(topLevelWindow);
+ if (QWindow *topLevelWindow = topLevel->windowHandle()) {
+ QPlatformScreen *platformScreen = QPlatformScreen::platformScreenForWindow(topLevelWindow);
+ if (platformScreen)
+ screen = platformScreen->screen();
+ }
if (!screen && QGuiApplication::primaryScreen())
- screen = QGuiApplication::primaryScreen()->handle();
+ screen = QGuiApplication::primaryScreen();
if (!screen) {
if (m == PdmDpiX || m == PdmDpiY)
@@ -762,18 +765,22 @@ int QWidget::metric(PaintDeviceMetric m) const
val = data->crect.height() * screen->physicalSize().height() / screen->geometry().height();
} else if (m == PdmDepth) {
return screen->depth();
- } else if (m == PdmDpiX || m == PdmPhysicalDpiX) {
+ } else if (m == PdmDpiX) {
if (d->extra && d->extra->customDpiX)
return d->extra->customDpiX;
else if (d->parent)
return static_cast<QWidget *>(d->parent)->metric(m);
- return qRound(screen->geometry().width() / double(screen->physicalSize().width() / 25.4));
- } else if (m == PdmDpiY || m == PdmPhysicalDpiY) {
+ return qRound(screen->logicalDotsPerInchX());
+ } else if (m == PdmDpiY) {
if (d->extra && d->extra->customDpiY)
return d->extra->customDpiY;
else if (d->parent)
return static_cast<QWidget *>(d->parent)->metric(m);
- return qRound(screen->geometry().height() / double(screen->physicalSize().height() / 25.4));
+ return qRound(screen->logicalDotsPerInchY());
+ } else if (m == PdmPhysicalDpiX) {
+ return qRound(screen->physicalDotsPerInchX());
+ } else if (m == PdmPhysicalDpiY) {
+ return qRound(screen->physicalDotsPerInchY());
} else {
val = QPaintDevice::metric(m);// XXX
}