diff options
Diffstat (limited to 'src/yuzu_cmd/emu_window/emu_window_sdl2.cpp')
| -rw-r--r-- | src/yuzu_cmd/emu_window/emu_window_sdl2.cpp | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp index 155095095..a9ad92a80 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp | |||
| @@ -40,6 +40,35 @@ void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) { | |||
| 40 | } | 40 | } |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | std::pair<unsigned, unsigned> EmuWindow_SDL2::TouchToPixelPos(float touch_x, float touch_y) const { | ||
| 44 | int w, h; | ||
| 45 | SDL_GetWindowSize(render_window, &w, &h); | ||
| 46 | |||
| 47 | touch_x *= w; | ||
| 48 | touch_y *= h; | ||
| 49 | |||
| 50 | return {static_cast<unsigned>(std::max(std::round(touch_x), 0.0f)), | ||
| 51 | static_cast<unsigned>(std::max(std::round(touch_y), 0.0f))}; | ||
| 52 | } | ||
| 53 | |||
| 54 | void EmuWindow_SDL2::OnFingerDown(float x, float y) { | ||
| 55 | // TODO(NeatNit): keep track of multitouch using the fingerID and a dictionary of some kind | ||
| 56 | // This isn't critical because the best we can do when we have that is to average them, like the | ||
| 57 | // 3DS does | ||
| 58 | |||
| 59 | const auto [px, py] = TouchToPixelPos(x, y); | ||
| 60 | TouchPressed(px, py); | ||
| 61 | } | ||
| 62 | |||
| 63 | void EmuWindow_SDL2::OnFingerMotion(float x, float y) { | ||
| 64 | const auto [px, py] = TouchToPixelPos(x, y); | ||
| 65 | TouchMoved(px, py); | ||
| 66 | } | ||
| 67 | |||
| 68 | void EmuWindow_SDL2::OnFingerUp() { | ||
| 69 | TouchReleased(); | ||
| 70 | } | ||
| 71 | |||
| 43 | void EmuWindow_SDL2::OnKeyEvent(int key, u8 state) { | 72 | void EmuWindow_SDL2::OnKeyEvent(int key, u8 state) { |
| 44 | if (state == SDL_PRESSED) { | 73 | if (state == SDL_PRESSED) { |
| 45 | InputCommon::GetKeyboard()->PressKey(key); | 74 | InputCommon::GetKeyboard()->PressKey(key); |
| @@ -219,11 +248,26 @@ void EmuWindow_SDL2::PollEvents() { | |||
| 219 | OnKeyEvent(static_cast<int>(event.key.keysym.scancode), event.key.state); | 248 | OnKeyEvent(static_cast<int>(event.key.keysym.scancode), event.key.state); |
| 220 | break; | 249 | break; |
| 221 | case SDL_MOUSEMOTION: | 250 | case SDL_MOUSEMOTION: |
| 222 | OnMouseMotion(event.motion.x, event.motion.y); | 251 | // ignore if it came from touch |
| 252 | if (event.button.which != SDL_TOUCH_MOUSEID) | ||
| 253 | OnMouseMotion(event.motion.x, event.motion.y); | ||
| 223 | break; | 254 | break; |
| 224 | case SDL_MOUSEBUTTONDOWN: | 255 | case SDL_MOUSEBUTTONDOWN: |
| 225 | case SDL_MOUSEBUTTONUP: | 256 | case SDL_MOUSEBUTTONUP: |
| 226 | OnMouseButton(event.button.button, event.button.state, event.button.x, event.button.y); | 257 | // ignore if it came from touch |
| 258 | if (event.button.which != SDL_TOUCH_MOUSEID) { | ||
| 259 | OnMouseButton(event.button.button, event.button.state, event.button.x, | ||
| 260 | event.button.y); | ||
| 261 | } | ||
| 262 | break; | ||
| 263 | case SDL_FINGERDOWN: | ||
| 264 | OnFingerDown(event.tfinger.x, event.tfinger.y); | ||
| 265 | break; | ||
| 266 | case SDL_FINGERMOTION: | ||
| 267 | OnFingerMotion(event.tfinger.x, event.tfinger.y); | ||
| 268 | break; | ||
| 269 | case SDL_FINGERUP: | ||
| 270 | OnFingerUp(); | ||
| 227 | break; | 271 | break; |
| 228 | case SDL_QUIT: | 272 | case SDL_QUIT: |
| 229 | is_open = false; | 273 | is_open = false; |