From 23a74e810bb2ec4cb950eaae9760889c1e8a5d54 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@qt.io>
Date: Tue, 22 Nov 2016 14:10:56 +0100
Subject: [PATCH] QWindowVideoWidgetBackend: scale coordinates passed to
 control
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Use native coordinates when setting the display rectangle.

Task-number: QTBUG-57145
Change-Id: I4783edcbee021e6020e8ca946f15cca8a1173589
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
---
 src/multimediawidgets/qvideowidget.cpp | 23 +++++++++++++++++++----
 src/multimediawidgets/qvideowidget_p.h |  2 ++
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/multimediawidgets/qvideowidget.cpp b/src/multimediawidgets/qvideowidget.cpp
index 3d5e5c830..60a968813 100644
--- a/src/multimediawidgets/qvideowidget.cpp
+++ b/src/multimediawidgets/qvideowidget.cpp
@@ -55,6 +55,9 @@
 #include <qboxlayout.h>
 #include <qnamespace.h>
 
+#include <qwindow.h>
+#include <private/qhighdpiscaling_p.h>
+
 using namespace Qt;
 
 QT_BEGIN_NAMESPACE
@@ -372,11 +375,23 @@ QSize QWindowVideoWidgetBackend::sizeHint() const
     return m_windowControl->nativeSize();
 }
 
+void QWindowVideoWidgetBackend::updateDisplayRect()
+{
+    QRect rect = m_widget->rect();
+    if (QHighDpiScaling::isActive()) {
+        const qreal factor = QHighDpiScaling::factor(m_widget->windowHandle());
+        if (!qFuzzyCompare(factor, qreal(1))) {
+            rect = QRectF(QPointF(rect.topLeft()) * factor,
+                          QSizeF(rect.size()) * factor).toRect();
+        }
+    }
+    m_windowControl->setDisplayRect(rect);
+}
+
 void QWindowVideoWidgetBackend::showEvent()
 {
     m_windowControl->setWinId(m_widget->winId());
-
-    m_windowControl->setDisplayRect(m_widget->rect());
+    updateDisplayRect();
 
 #if defined(Q_WS_WIN)
     m_widget->setUpdatesEnabled(false);
@@ -392,12 +407,12 @@ void QWindowVideoWidgetBackend::hideEvent(QHideEvent *)
 
 void QWindowVideoWidgetBackend::moveEvent(QMoveEvent *)
 {
-    m_windowControl->setDisplayRect(m_widget->rect());
+    updateDisplayRect();
 }
 
 void QWindowVideoWidgetBackend::resizeEvent(QResizeEvent *)
 {
-    m_windowControl->setDisplayRect(m_widget->rect());
+    updateDisplayRect();
 }
 
 void QWindowVideoWidgetBackend::paintEvent(QPaintEvent *event)
diff --git a/src/multimediawidgets/qvideowidget_p.h b/src/multimediawidgets/qvideowidget_p.h
index 15aaa5a60..039ace24e 100644
--- a/src/multimediawidgets/qvideowidget_p.h
+++ b/src/multimediawidgets/qvideowidget_p.h
@@ -211,6 +211,8 @@ public:
 #endif
 
 private:
+    void updateDisplayRect();
+
     QMediaService *m_service;
     QVideoWindowControl *m_windowControl;
     QWidget *m_widget;
-- 
GitLab