aboutsummaryrefslogtreecommitdiff
path: root/qt-wayland-scale-hack.patch
blob: a87403545bbec1740810ab783daee291f42cabfe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
diff --git a/src/frontend/qt_sdl/Screen.cpp b/src/frontend/qt_sdl/Screen.cpp
index d8af6624..019ce246 100644
--- a/src/frontend/qt_sdl/Screen.cpp
+++ b/src/frontend/qt_sdl/Screen.cpp
@@ -30,6 +30,7 @@
 #include <QPaintEvent>
 #include <QPainter>
 #include <QDebug>
+#include <QApplication>
 #ifndef _WIN32
 #ifndef APPLE
 #include <qpa/qplatformnativeinterface.h>
@@ -596,23 +597,20 @@ void ScreenPanelGL::drawScreenGL()
     glContext->SwapBuffers();
 }
 
-qreal ScreenPanelGL::devicePixelRatioFromScreen() const
+qreal ScreenPanelGL::devicePixelRatioFromWindow() const
 {
-    const QScreen* screen_for_ratio = window()->windowHandle()->screen();
-    if (!screen_for_ratio)
-        screen_for_ratio = QGuiApplication::primaryScreen();
-
-    return screen_for_ratio ? screen_for_ratio->devicePixelRatio() : static_cast<qreal>(1);
+    QWindow* window = windowHandle();
+    return window->devicePixelRatio();
 }
 
 int ScreenPanelGL::scaledWindowWidth() const
 {
-  return std::max(static_cast<int>(std::ceil(static_cast<qreal>(width()) * devicePixelRatioFromScreen())), 1);
+  return std::max(static_cast<int>(std::ceil(static_cast<qreal>(width()) * devicePixelRatioFromWindow())), 1);
 }
 
 int ScreenPanelGL::scaledWindowHeight() const
 {
-  return std::max(static_cast<int>(std::ceil(static_cast<qreal>(height()) * devicePixelRatioFromScreen())), 1);
+  return std::max(static_cast<int>(std::ceil(static_cast<qreal>(height()) * devicePixelRatioFromWindow())), 1);
 }
 
 std::optional<WindowInfo> ScreenPanelGL::getWindowInfo()
@@ -644,6 +642,7 @@ std::optional<WindowInfo> ScreenPanelGL::getWindowInfo()
 
         wi.display_connection = pni->nativeResourceForWindow("display", handle);
         wi.window_handle = pni->nativeResourceForWindow("surface", handle);
+        qApp->processEvents();
     }
     else
     {
@@ -654,7 +653,7 @@ std::optional<WindowInfo> ScreenPanelGL::getWindowInfo()
 
     wi.surface_width = static_cast<u32>(scaledWindowWidth());
     wi.surface_height = static_cast<u32>(scaledWindowHeight());
-    wi.surface_scale = static_cast<float>(devicePixelRatioFromScreen());
+    wi.surface_scale = static_cast<float>(devicePixelRatioFromWindow());
 
     return wi;
 }
diff --git a/src/frontend/qt_sdl/Screen.h b/src/frontend/qt_sdl/Screen.h
index b11df29b..79889a3f 100644
--- a/src/frontend/qt_sdl/Screen.h
+++ b/src/frontend/qt_sdl/Screen.h
@@ -23,6 +23,8 @@
 #include "FrontendUtil.h"
 #include "duckstation/gl/context.h"
 
+#include <optional>
+
 #include <QWidget>
 #include <QWindow>
 #include <QMainWindow>
@@ -133,7 +135,7 @@ public:
     void transferLayout();
 protected:
 
-    qreal devicePixelRatioFromScreen() const;
+    qreal devicePixelRatioFromWindow() const;
     int scaledWindowWidth() const;
     int scaledWindowHeight() const;