diff options
author | bunnei <bunneidev@gmail.com> | 2015-03-08 08:13:26 +0100 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2015-03-10 23:05:17 +0100 |
commit | 543232436fae8d1d0f9fdd94baf0ca88d4eea067 (patch) | |
tree | 8104a34a4d34fe42a3054967677b13667670a540 /src/common/emu_window.cpp | |
parent | HID: Added functions to emulate the touchpad. (diff) | |
download | yuzu-543232436fae8d1d0f9fdd94baf0ca88d4eea067.tar yuzu-543232436fae8d1d0f9fdd94baf0ca88d4eea067.tar.gz yuzu-543232436fae8d1d0f9fdd94baf0ca88d4eea067.tar.bz2 yuzu-543232436fae8d1d0f9fdd94baf0ca88d4eea067.tar.lz yuzu-543232436fae8d1d0f9fdd94baf0ca88d4eea067.tar.xz yuzu-543232436fae8d1d0f9fdd94baf0ca88d4eea067.tar.zst yuzu-543232436fae8d1d0f9fdd94baf0ca88d4eea067.zip |
Diffstat (limited to '')
-rw-r--r-- | src/common/emu_window.cpp | 65 |
1 files changed, 64 insertions, 1 deletions
diff --git a/src/common/emu_window.cpp b/src/common/emu_window.cpp index 6459d2f32..11e6ad76b 100644 --- a/src/common/emu_window.cpp +++ b/src/common/emu_window.cpp @@ -5,6 +5,8 @@ #include "emu_window.h" #include "video_core/video_core.h" +bool EmuWindow::touch_pressed = false; + void EmuWindow::KeyPressed(KeyMap::HostDeviceKey key) { Service::HID::PadState mapped_key = KeyMap::GetPadKey(key); @@ -17,7 +19,68 @@ void EmuWindow::KeyReleased(KeyMap::HostDeviceKey key) { Service::HID::PadButtonRelease(mapped_key); } -EmuWindow::FramebufferLayout EmuWindow::FramebufferLayout::DefaultScreenLayout(unsigned width, unsigned height) { +/** + * Check if the given x/y coordinates are within the touchpad specified by the framebuffer layout + * @param layout FramebufferLayout object describing the framebuffer size and screen positions + * @param framebuffer_x Framebuffer x-coordinate to check + * @param framebuffer_y Framebuffer y-coordinate to check + * @return True if the coordinates are within the touchpad, otherwise false + */ +static bool IsWithinTouchscreen(const EmuWindow::FramebufferLayout& layout, unsigned framebuffer_x, + unsigned framebuffer_y) { + + return (framebuffer_y >= layout.bottom_screen.top && + framebuffer_y < layout.bottom_screen.bottom && + framebuffer_x >= layout.bottom_screen.left && + framebuffer_x < layout.bottom_screen.right); +} + +void EmuWindow::TouchPressed(const FramebufferLayout& layout, unsigned framebuffer_x, + unsigned framebuffer_y) { + + if (IsWithinTouchscreen(layout, framebuffer_x, framebuffer_y)) { + u16 touch_x = VideoCore::kScreenBottomWidth * (framebuffer_x - layout.bottom_screen.left) / + (layout.bottom_screen.right - layout.bottom_screen.left); + u16 touch_y = VideoCore::kScreenBottomHeight * (framebuffer_y - layout.bottom_screen.top) / + (layout.bottom_screen.bottom - layout.bottom_screen.top); + + Service::HID::TouchPress(touch_x, touch_y); + Service::HID::TouchUpdateComplete(); + + touch_pressed = true; + } +} + +void EmuWindow::TouchReleased(const FramebufferLayout& layout, unsigned framebuffer_x, + unsigned framebuffer_y) { + + if (IsWithinTouchscreen(layout, framebuffer_x, framebuffer_y)) { + + Service::HID::TouchRelease(); + Service::HID::TouchUpdateComplete(); + + touch_pressed = false; + } +} + +void EmuWindow::TouchMoved(const FramebufferLayout& layout, unsigned framebuffer_x, + unsigned framebuffer_y) { + + if (touch_pressed) { + if (IsWithinTouchscreen(layout, framebuffer_x, framebuffer_y)) { + EmuWindow::TouchPressed(layout, framebuffer_x, framebuffer_y); + } else { + Service::HID::TouchRelease(); + Service::HID::TouchUpdateComplete(); + + touch_pressed = false; + } + } +} + +EmuWindow::FramebufferLayout EmuWindow::FramebufferLayout::DefaultScreenLayout(unsigned width, + unsigned height) { + ASSERT(width > 0); ASSERT(height > 0); |