summaryrefslogtreecommitdiff
path: root/src/core/frontend/emu_window.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/frontend/emu_window.cpp')
-rw-r--r--src/core/frontend/emu_window.cpp43
1 files changed, 24 insertions, 19 deletions
diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp
index 8c1193894..ee7a58b1c 100644
--- a/src/core/frontend/emu_window.cpp
+++ b/src/core/frontend/emu_window.cpp
@@ -21,21 +21,18 @@ public:
21 21
22 std::mutex mutex; 22 std::mutex mutex;
23 23
24 bool touch_pressed = false; ///< True if touchpad area is currently pressed, otherwise false 24 Input::TouchStatus status;
25
26 float touch_x = 0.0f; ///< Touchpad X-position
27 float touch_y = 0.0f; ///< Touchpad Y-position
28 25
29private: 26private:
30 class Device : public Input::TouchDevice { 27 class Device : public Input::TouchDevice {
31 public: 28 public:
32 explicit Device(std::weak_ptr<TouchState>&& touch_state) : touch_state(touch_state) {} 29 explicit Device(std::weak_ptr<TouchState>&& touch_state) : touch_state(touch_state) {}
33 std::tuple<float, float, bool> GetStatus() const override { 30 Input::TouchStatus GetStatus() const override {
34 if (auto state = touch_state.lock()) { 31 if (auto state = touch_state.lock()) {
35 std::lock_guard guard{state->mutex}; 32 std::lock_guard guard{state->mutex};
36 return std::make_tuple(state->touch_x, state->touch_y, state->touch_pressed); 33 return state->status;
37 } 34 }
38 return std::make_tuple(0.0f, 0.0f, false); 35 return {};
39 } 36 }
40 37
41 private: 38 private:
@@ -79,36 +76,44 @@ std::tuple<unsigned, unsigned> EmuWindow::ClipToTouchScreen(unsigned new_x, unsi
79 return std::make_tuple(new_x, new_y); 76 return std::make_tuple(new_x, new_y);
80} 77}
81 78
82void EmuWindow::TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y) { 79void EmuWindow::TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y, std::size_t id) {
83 if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) 80 if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) {
84 return; 81 return;
82 }
83 if (id >= touch_state->status.size()) {
84 return;
85 }
85 86
86 std::lock_guard guard{touch_state->mutex}; 87 std::lock_guard guard{touch_state->mutex};
87 touch_state->touch_x = 88 const float x =
88 static_cast<float>(framebuffer_x - framebuffer_layout.screen.left) / 89 static_cast<float>(framebuffer_x - framebuffer_layout.screen.left) /
89 static_cast<float>(framebuffer_layout.screen.right - framebuffer_layout.screen.left); 90 static_cast<float>(framebuffer_layout.screen.right - framebuffer_layout.screen.left);
90 touch_state->touch_y = 91 const float y =
91 static_cast<float>(framebuffer_y - framebuffer_layout.screen.top) / 92 static_cast<float>(framebuffer_y - framebuffer_layout.screen.top) /
92 static_cast<float>(framebuffer_layout.screen.bottom - framebuffer_layout.screen.top); 93 static_cast<float>(framebuffer_layout.screen.bottom - framebuffer_layout.screen.top);
93 94
94 touch_state->touch_pressed = true; 95 touch_state->status[id] = std::make_tuple(x, y, true);
95} 96}
96 97
97void EmuWindow::TouchReleased() { 98void EmuWindow::TouchReleased(std::size_t id) {
99 if (id >= touch_state->status.size()) {
100 return;
101 }
98 std::lock_guard guard{touch_state->mutex}; 102 std::lock_guard guard{touch_state->mutex};
99 touch_state->touch_pressed = false; 103 touch_state->status[id] = std::make_tuple(0.0f, 0.0f, false);
100 touch_state->touch_x = 0;
101 touch_state->touch_y = 0;
102} 104}
103 105
104void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) { 106void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y, std::size_t id) {
105 if (!touch_state->touch_pressed) 107 if (id >= touch_state->status.size()) {
108 return;
109 }
110 if (!std::get<2>(touch_state->status[id]))
106 return; 111 return;
107 112
108 if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) 113 if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y))
109 std::tie(framebuffer_x, framebuffer_y) = ClipToTouchScreen(framebuffer_x, framebuffer_y); 114 std::tie(framebuffer_x, framebuffer_y) = ClipToTouchScreen(framebuffer_x, framebuffer_y);
110 115
111 TouchPressed(framebuffer_x, framebuffer_y); 116 TouchPressed(framebuffer_x, framebuffer_y, id);
112} 117}
113 118
114void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) { 119void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) {