summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorliamwhite <liamwhite@users.noreply.github.com>2023-02-20 15:05:49 +0100
committerGitHub <noreply@github.com>2023-02-20 15:05:49 +0100
commit89221ca7d549492dd66286214571021b21215c8a (patch)
treed3aa1391459db96ccb410e203e861eae2a5a8e44
parentMerge pull request #9771 from ameerj/host-thread-id (diff)
parentQt: Reintroduce scaling for touch input (diff)
downloadyuzu-89221ca7d549492dd66286214571021b21215c8a.tar
yuzu-89221ca7d549492dd66286214571021b21215c8a.tar.gz
yuzu-89221ca7d549492dd66286214571021b21215c8a.tar.bz2
yuzu-89221ca7d549492dd66286214571021b21215c8a.tar.lz
yuzu-89221ca7d549492dd66286214571021b21215c8a.tar.xz
yuzu-89221ca7d549492dd66286214571021b21215c8a.tar.zst
yuzu-89221ca7d549492dd66286214571021b21215c8a.zip
-rw-r--r--src/yuzu/bootmanager.cpp20
-rw-r--r--src/yuzu/bootmanager.h2
2 files changed, 16 insertions, 6 deletions
diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp
index 17acd3933..4c7bf28d8 100644
--- a/src/yuzu/bootmanager.cpp
+++ b/src/yuzu/bootmanager.cpp
@@ -401,6 +401,12 @@ qreal GRenderWindow::windowPixelRatio() const {
return devicePixelRatioF();
}
+std::pair<u32, u32> GRenderWindow::ScaleTouch(const QPointF& pos) const {
+ const qreal pixel_ratio = windowPixelRatio();
+ return {static_cast<u32>(std::max(std::round(pos.x() * pixel_ratio), qreal{0.0})),
+ static_cast<u32>(std::max(std::round(pos.y() * pixel_ratio), qreal{0.0}))};
+}
+
void GRenderWindow::closeEvent(QCloseEvent* event) {
emit Closed();
QWidget::closeEvent(event);
@@ -643,7 +649,8 @@ void GRenderWindow::mousePressEvent(QMouseEvent* event) {
// Qt sometimes returns the parent coordinates. To avoid this we read the global mouse
// coordinates and map them to the current render area
const auto pos = mapFromGlobal(QCursor::pos());
- const auto [touch_x, touch_y] = MapToTouchScreen(pos.x(), pos.y());
+ const auto [x, y] = ScaleTouch(pos);
+ const auto [touch_x, touch_y] = MapToTouchScreen(x, y);
const auto button = QtButtonToMouseButton(event->button());
input_subsystem->GetMouse()->PressMouseButton(button);
@@ -661,7 +668,8 @@ void GRenderWindow::mouseMoveEvent(QMouseEvent* event) {
// Qt sometimes returns the parent coordinates. To avoid this we read the global mouse
// coordinates and map them to the current render area
const auto pos = mapFromGlobal(QCursor::pos());
- const auto [touch_x, touch_y] = MapToTouchScreen(pos.x(), pos.y());
+ const auto [x, y] = ScaleTouch(pos);
+ const auto [touch_x, touch_y] = MapToTouchScreen(x, y);
const int center_x = width() / 2;
const int center_y = height() / 2;
@@ -695,8 +703,8 @@ void GRenderWindow::wheelEvent(QWheelEvent* event) {
void GRenderWindow::TouchBeginEvent(const QTouchEvent* event) {
QList<QTouchEvent::TouchPoint> touch_points = event->touchPoints();
for (const auto& touch_point : touch_points) {
- const auto pos = touch_point.pos();
- const auto [touch_x, touch_y] = MapToTouchScreen(pos.x(), pos.y());
+ const auto [x, y] = ScaleTouch(touch_point.pos());
+ const auto [touch_x, touch_y] = MapToTouchScreen(x, y);
input_subsystem->GetTouchScreen()->TouchPressed(touch_x, touch_y, touch_point.id());
}
}
@@ -705,8 +713,8 @@ void GRenderWindow::TouchUpdateEvent(const QTouchEvent* event) {
QList<QTouchEvent::TouchPoint> touch_points = event->touchPoints();
input_subsystem->GetTouchScreen()->ClearActiveFlag();
for (const auto& touch_point : touch_points) {
- const auto pos = touch_point.pos();
- const auto [touch_x, touch_y] = MapToTouchScreen(pos.x(), pos.y());
+ const auto [x, y] = ScaleTouch(touch_point.pos());
+ const auto [touch_x, touch_y] = MapToTouchScreen(x, y);
input_subsystem->GetTouchScreen()->TouchMoved(touch_x, touch_y, touch_point.id());
}
input_subsystem->GetTouchScreen()->ReleaseInactiveTouch();
diff --git a/src/yuzu/bootmanager.h b/src/yuzu/bootmanager.h
index 627e19f42..bb4eca07f 100644
--- a/src/yuzu/bootmanager.h
+++ b/src/yuzu/bootmanager.h
@@ -147,6 +147,8 @@ public:
qreal windowPixelRatio() const;
+ std::pair<u32, u32> ScaleTouch(const QPointF& pos) const;
+
void closeEvent(QCloseEvent* event) override;
void resizeEvent(QResizeEvent* event) override;