summaryrefslogtreecommitdiffstats
path: root/src/widgets/kernel/qdesktopwidget.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2016-05-18 15:33:49 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2016-06-22 11:22:24 +0000
commit450e7f06f22e6a30c85624b4d37f8433cbfd3b73 (patch)
treeb8ef3e464459b2f22f143d3a1e2c857d5e0b13d2 /src/widgets/kernel/qdesktopwidget.cpp
parentf54bd20f6afbbd7bcbc55b3f3f59ed15f91f8ecd (diff)
QDesktopScreenWidget::screenNumber(): Use native geometry.
Coordinates in device independent pixels are not suitable for checking intersection of screen areas since the screen positions are always unscaled. Move the code to determine the QWindow handle out and transform the frame to device pixels and use QPlatformScreen to check. Change-Id: Idd94f32abc43bc7a04e4056243b7f810631f70cc Task-number: QTBUG-52606 Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src/widgets/kernel/qdesktopwidget.cpp')
-rw-r--r--src/widgets/kernel/qdesktopwidget.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/widgets/kernel/qdesktopwidget.cpp b/src/widgets/kernel/qdesktopwidget.cpp
index e87b13c630..19e292375a 100644
--- a/src/widgets/kernel/qdesktopwidget.cpp
+++ b/src/widgets/kernel/qdesktopwidget.cpp
@@ -38,6 +38,9 @@
#include "qwidget_p.h"
#include "qwindow.h"
+#include <private/qhighdpiscaling_p.h>
+#include <qpa/qplatformscreen.h>
+
QT_BEGIN_NAMESPACE
QDesktopScreenWidget::QDesktopScreenWidget(QScreen *screen, const QRect &geometry)
@@ -239,18 +242,18 @@ int QDesktopWidget::screenNumber(const QWidget *w) const
if (screens.isEmpty()) // This should never happen
return primaryScreen();
+ const QWindow *winHandle = w->windowHandle();
+ if (!winHandle) {
+ if (const QWidget *nativeParent = w->nativeParentWidget())
+ winHandle = nativeParent->windowHandle();
+ }
+
// If there is more than one virtual desktop
if (screens.count() != screens.constFirst()->virtualSiblings().count()) {
// Find the root widget, get a QScreen from it and use the
// virtual siblings for checking the window position.
- const QWidget *root = w;
- const QWidget *tmp = w;
- while ((tmp = tmp->parentWidget()))
- root = tmp;
- const QWindow *winHandle = root->windowHandle();
if (winHandle) {
- const QScreen *winScreen = winHandle->screen();
- if (winScreen)
+ if (const QScreen *winScreen = winHandle->screen())
screens = winScreen->virtualSiblings();
}
}
@@ -260,11 +263,12 @@ int QDesktopWidget::screenNumber(const QWidget *w) const
QRect frame = w->frameGeometry();
if (!w->isWindow())
frame.moveTopLeft(w->mapToGlobal(QPoint(0, 0)));
+ const QRect nativeFrame = QHighDpi::toNativePixels(frame, winHandle);
QScreen *widgetScreen = Q_NULLPTR;
int largestArea = 0;
foreach (QScreen *screen, screens) {
- QRect intersected = screen->geometry().intersected(frame);
+ const QRect intersected = screen->handle()->geometry().intersected(nativeFrame);
int area = intersected.width() * intersected.height();
if (largestArea < area) {
widgetScreen = screen;