From d05ae1941c61e571644c9451e6a9bd69943ac8dc Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Fri, 12 Aug 2016 19:59:00 -0400 Subject: [PATCH] emscripten: send fake mouse events for touches, like other targets do. (This really should be handled at the higher level and not in the individual targets, but this fixes the immediate bug.) --- src/video/emscripten/SDL_emscriptenevents.c | 19 ++++++++++++++++--- src/video/emscripten/SDL_emscriptenvideo.h | 4 ++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/video/emscripten/SDL_emscriptenevents.c b/src/video/emscripten/SDL_emscriptenevents.c index 0f915c6f37f0f..306ec552ab968 100644 --- a/src/video/emscripten/SDL_emscriptenevents.c +++ b/src/video/emscripten/SDL_emscriptenevents.c @@ -391,11 +391,24 @@ Emscripten_HandleTouch(int eventType, const EmscriptenTouchEvent *touchEvent, vo x = touchEvent->touches[i].canvasX / (float)window_data->windowed_width; y = touchEvent->touches[i].canvasY / (float)window_data->windowed_height; - if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) { - SDL_SendTouchMotion(deviceId, id, x, y, 1.0f); - } else if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) { + if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) { + if (!window_data->finger_touching) { + window_data->finger_touching = SDL_TRUE; + window_data->first_finger = id; + SDL_SendMouseMotion(window_data->window, SDL_TOUCH_MOUSEID, 0, x, y); + SDL_SendMouseButton(window_data->window, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT); + } SDL_SendTouch(deviceId, id, SDL_TRUE, x, y, 1.0f); + } else if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) { + if ((window_data->finger_touching) && (window_data->first_finger == id)) { + SDL_SendMouseMotion(window_data->window, SDL_TOUCH_MOUSEID, 0, x, y); + } + SDL_SendTouchMotion(deviceId, id, x, y, 1.0f); } else { + if ((window_data->finger_touching) && (window_data->first_finger == id)) { + SDL_SendMouseButton(window_data->window, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT); + window_data->finger_touching = SDL_FALSE; + } SDL_SendTouch(deviceId, id, SDL_FALSE, x, y, 1.0f); } } diff --git a/src/video/emscripten/SDL_emscriptenvideo.h b/src/video/emscripten/SDL_emscriptenvideo.h index e824de34fb027..49b0b356b6492 100644 --- a/src/video/emscripten/SDL_emscriptenvideo.h +++ b/src/video/emscripten/SDL_emscriptenvideo.h @@ -24,6 +24,7 @@ #define _SDL_emscriptenvideo_h #include "../SDL_sysvideo.h" +#include "../../events/SDL_touch_c.h" #include #include @@ -45,6 +46,9 @@ typedef struct SDL_WindowData SDL_bool external_size; int requested_fullscreen_mode; + + SDL_bool finger_touching; /* for mapping touch events to mice */ + SDL_FingerID first_finger; } SDL_WindowData; #endif /* _SDL_emscriptenvideo_h */