aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/common/emu_window.cpp
diff options
context:
space:
mode:
authorGravatar Zaneo <gareth.higgins@ryerson.ca>2015-04-14 00:06:44 -0400
committerGravatar Zaneo <gareth.higgins@ryerson.ca>2015-05-01 23:52:33 -0400
commitb8328593fe3d60ecb066ad0959d8c1e8dfb4d3c5 (patch)
treefdeec9f5d356b84f21c92ddb4b469aedb11e93db /src/common/emu_window.cpp
parent5b9bbc37d4a64ac2ca347dc2a7ce1de9e28f0d5e (diff)
EmuWindow: Clip mouse input coordinates to emulated screen dimensions.
If the mouse position for a mouse move/drag would take it outside the emulated screen dimensions, clip the coordinates to the emulated screen dimensions. Qt and GLFW will report negative coordinates for mouse positions to the left, or above citra window. Added restriction to mouse coordinates passed to touchmoved by Qt/GLFW to be greater or equal to zero.
Diffstat (limited to 'src/common/emu_window.cpp')
-rw-r--r--src/common/emu_window.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/common/emu_window.cpp b/src/common/emu_window.cpp
index 6516fc63..f5b6c730 100644
--- a/src/common/emu_window.cpp
+++ b/src/common/emu_window.cpp
@@ -28,6 +28,17 @@ static bool IsWithinTouchscreen(const EmuWindow::FramebufferLayout& layout, unsi
framebuffer_x < layout.bottom_screen.right);
}
+std::tuple<unsigned,unsigned> EmuWindow::ClipToTouchScreen(unsigned new_x, unsigned new_y) {
+
+ new_x = std::max(new_x, framebuffer_layout.bottom_screen.left);
+ new_x = std::min(new_x, framebuffer_layout.bottom_screen.right-1);
+
+ new_y = std::max(new_y, framebuffer_layout.bottom_screen.top);
+ new_y = std::min(new_y, framebuffer_layout.bottom_screen.bottom-1);
+
+ return std::make_tuple(new_x, new_y);
+}
+
void EmuWindow::TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y) {
if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y))
return;
@@ -52,14 +63,13 @@ void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) {
if (!touch_pressed)
return;
- if (IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y))
- TouchPressed(framebuffer_x, framebuffer_y);
- else
- TouchReleased();
+ if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y))
+ std::tie(framebuffer_x, framebuffer_y) = ClipToTouchScreen(framebuffer_x, framebuffer_y);
+
+ TouchPressed(framebuffer_x, framebuffer_y);
}
-EmuWindow::FramebufferLayout EmuWindow::FramebufferLayout::DefaultScreenLayout(unsigned width,
- unsigned height) {
+EmuWindow::FramebufferLayout EmuWindow::FramebufferLayout::DefaultScreenLayout(unsigned width, unsigned height) {
ASSERT(width > 0);
ASSERT(height > 0);