From ba5d0f594d9c9cc0dbadb4720511c76de93e6d0d Mon Sep 17 00:00:00 2001
From: Pierre de La Morinerie <kemenaran@gmail.com>
Date: Thu, 10 Sep 2015 23:42:45 +0200
Subject: [PATCH] citra-qt: Fix mouse events coordinates on high-DPI screens

---
 src/citra_qt/bootmanager.cpp | 31 +++++++++++++++++++------------
 src/citra_qt/bootmanager.h   |  2 ++
 2 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index b19b367e1c..8e60b9cadb 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -181,16 +181,9 @@ void GRenderWindow::PollEvents() {
 void GRenderWindow::OnFramebufferSizeChanged()
 {
     // Screen changes potentially incur a change in screen DPI, hence we should update the framebuffer size
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
-    // windowHandle() might not be accessible until the window is displayed to screen.
-    auto pixel_ratio = windowHandle() ? (windowHandle()->screen()->devicePixelRatio()) : 1.0;
-
-    unsigned width = child->QPaintDevice::width() * pixel_ratio;
-    unsigned height = child->QPaintDevice::height() * pixel_ratio;
-#else
-    unsigned width = child->QPaintDevice::width();
-    unsigned height = child->QPaintDevice::height();
-#endif
+    qreal pixelRatio = windowPixelRatio();
+    unsigned width = child->QPaintDevice::width() * pixelRatio;
+    unsigned height = child->QPaintDevice::height() * pixelRatio;
 
     NotifyFramebufferLayoutChanged(EmuWindow::FramebufferLayout::DefaultScreenLayout(width, height));
 }
@@ -223,6 +216,16 @@ QByteArray GRenderWindow::saveGeometry()
         return geometry;
 }
 
+qreal GRenderWindow::windowPixelRatio()
+{
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+    // windowHandle() might not be accessible until the window is displayed to screen.
+    return windowHandle() ? windowHandle()->screen()->devicePixelRatio() : 1.0f;
+#else
+    return 1.0f;
+#endif
+}
+
 void GRenderWindow::closeEvent(QCloseEvent* event) {
     emit Closed();
     QWidget::closeEvent(event);
@@ -243,14 +246,18 @@ void GRenderWindow::mousePressEvent(QMouseEvent *event)
     if (event->button() == Qt::LeftButton)
     {
         auto pos = event->pos();
-        this->TouchPressed(static_cast<unsigned>(pos.x()), static_cast<unsigned>(pos.y()));
+        qreal pixelRatio = windowPixelRatio();
+        this->TouchPressed(static_cast<unsigned>(pos.x() * pixelRatio),
+                           static_cast<unsigned>(pos.y() * pixelRatio));
     }
 }
 
 void GRenderWindow::mouseMoveEvent(QMouseEvent *event)
 {
     auto pos = event->pos();
-    this->TouchMoved(static_cast<unsigned>(std::max(pos.x(), 0)), static_cast<unsigned>(std::max(pos.y(), 0)));
+    qreal pixelRatio = windowPixelRatio();
+    this->TouchMoved(std::max(static_cast<unsigned>(pos.x() * pixelRatio), 0u),
+                     std::max(static_cast<unsigned>(pos.y() * pixelRatio), 0u));
 }
 
 void GRenderWindow::mouseReleaseEvent(QMouseEvent *event)
diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h
index 0a9d263b8f..0dcf3e5ebc 100644
--- a/src/citra_qt/bootmanager.h
+++ b/src/citra_qt/bootmanager.h
@@ -111,6 +111,8 @@ public:
     void restoreGeometry(const QByteArray& geometry); // overridden
     QByteArray saveGeometry();  // overridden
 
+    qreal windowPixelRatio();
+
     void closeEvent(QCloseEvent* event) override;
 
     void keyPressEvent(QKeyEvent* event) override;
-- 
GitLab