9da807d
From 09215824f075813f9f09bbf840d1c367e9a3981e Mon Sep 17 00:00:00 2001
faff1df
From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
faff1df
Date: Sat, 29 Jan 2022 21:59:33 +0200
9da807d
Subject: [PATCH 05/31] Make sure QQuickWidget and its offscreen window's
faff1df
 screens are always in sync
faff1df
faff1df
By default, the offscreen window is placed on the primary screen.
faff1df
However, if the parent widget argument is passed to the QQuickWidget's
faff1df
constructor, then QQuickWidget's and the offscreen window's screens can
faff1df
be different and that can create rendering issues, e.g. blurry text if
faff1df
the primary screen and QQuickWidget's screen have different scale
faff1df
factors.
faff1df
faff1df
Change-Id: I10c62b5635664f943b11828773f14017f198a770
faff1df
Reviewed-by: David Edmundson <davidedmundson@kde.org>
faff1df
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
faff1df
(cherry picked from commit a2a2734bffa1459639b31fb3f4f83873ba44ab5c)
faff1df
---
faff1df
 src/quickwidgets/qquickwidget.cpp | 26 +++++++++++---------------
faff1df
 1 file changed, 11 insertions(+), 15 deletions(-)
faff1df
faff1df
diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp
0134d56
index cf021d9a7c..c791f209cf 100644
faff1df
--- a/src/quickwidgets/qquickwidget.cpp
faff1df
+++ b/src/quickwidgets/qquickwidget.cpp
faff1df
@@ -106,6 +106,7 @@ void QQuickWidgetPrivate::init(QQmlEngine* e)
faff1df
 
faff1df
     renderControl = new QQuickWidgetRenderControl(q);
faff1df
     offscreenWindow = new QQuickWindow(*new QQuickOffcreenWindowPrivate(),renderControl);
faff1df
+    offscreenWindow->setScreen(q->screen());
faff1df
     offscreenWindow->setTitle(QString::fromLatin1("Offscreen"));
faff1df
     offscreenWindow->setObjectName(QString::fromLatin1("QQuickOffScreenWindow"));
faff1df
     // Do not call create() on offscreenWindow.
faff1df
@@ -901,9 +902,7 @@ void QQuickWidgetPrivate::createContext()
faff1df
 
faff1df
         context = new QOpenGLContext;
faff1df
         context->setFormat(offscreenWindow->requestedFormat());
faff1df
-        const QWindow *win = q->window()->windowHandle();
faff1df
-        if (win && win->screen())
faff1df
-            context->setScreen(win->screen());
faff1df
+        context->setScreen(q->screen());
faff1df
         QOpenGLContext *shareContext = qt_gl_global_share_context();
faff1df
         if (!shareContext)
faff1df
             shareContext = QWidgetPrivate::get(q->window())->shareContext();
0134d56
@@ -1527,19 +1526,16 @@ bool QQuickWidget::event(QEvent *e)
faff1df
         d->handleWindowChange();
faff1df
         break;
faff1df
 
faff1df
-    case QEvent::ScreenChangeInternal:
faff1df
-        if (QWindow *window = this->window()->windowHandle()) {
faff1df
-            QScreen *newScreen = window->screen();
faff1df
-
faff1df
-            if (d->offscreenWindow)
faff1df
-                d->offscreenWindow->setScreen(newScreen);
faff1df
-            if (d->offscreenSurface)
faff1df
-                d->offscreenSurface->setScreen(newScreen);
faff1df
+    case QEvent::ScreenChangeInternal: {
faff1df
+        QScreen *newScreen = screen();
faff1df
+        if (d->offscreenWindow)
faff1df
+            d->offscreenWindow->setScreen(newScreen);
faff1df
+        if (d->offscreenSurface)
faff1df
+            d->offscreenSurface->setScreen(newScreen);
faff1df
 #if QT_CONFIG(opengl)
faff1df
-            if (d->context)
faff1df
-                d->context->setScreen(newScreen);
faff1df
+        if (d->context)
faff1df
+            d->context->setScreen(newScreen);
faff1df
 #endif
faff1df
-        }
faff1df
 
faff1df
         if (d->useSoftwareRenderer
faff1df
 #if QT_CONFIG(opengl)
0134d56
@@ -1552,7 +1548,7 @@ bool QQuickWidget::event(QEvent *e)
faff1df
             d->render(true);
faff1df
         }
faff1df
         break;
faff1df
-
faff1df
+    }
faff1df
     case QEvent::Show:
faff1df
     case QEvent::Move:
faff1df
         d->updatePosition();
faff1df
-- 
9da807d
2.43.0
faff1df