From a3f2c446ef320fa0986cfe4d3501316be0d45244 Mon Sep 17 00:00:00 2001 From: Sylvain Becker Date: Tue, 2 Apr 2019 16:46:17 +0200 Subject: [PATCH] Bug 4576: handle mapping of TouchEvents to MouseEvents at higher level --- src/events/SDL_touch.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index 26565f5675dee..839ea2e394bf3 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -31,6 +31,12 @@ static int SDL_num_touch = 0; static SDL_Touch **SDL_touchDevices = NULL; +/* for mapping touch events to mice */ +#define DUPLICATE_TO_MOUSE_EVENT +#if defined(DUPLICATE_TO_MOUSE_EVENT) +static SDL_bool finger_touching = SDL_FALSE; +static SDL_FingerID first_finger; +#endif /* Public functions */ int @@ -241,6 +247,29 @@ SDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid, return -1; } +#if defined(DUPLICATE_TO_MOUSE_EVENT) + { + SDL_Window *window = SDL_GetMouseFocus(); + if (window) { + if (down) { + if (finger_touching == SDL_FALSE) { + int pos_x = x * window->w; + int pos_y = y * window->y; + finger_touching = SDL_TRUE; + first_finger = fingerid; + SDL_SendMouseMotion(window, SDL_TOUCH_MOUSEID, 0, pos_x, pos_y); + SDL_SendMouseButton(window, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT); + } + } else { + if (finger_touching == SDL_TRUE && first_finger == fingerid) { + SDL_SendMouseButton(window, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT); + finger_touching = SDL_FALSE; + } + } + } + } +#endif + finger = SDL_GetFinger(touch, fingerid); if (down) { if (finger) { @@ -305,6 +334,19 @@ SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, return -1; } +#if defined(DUPLICATE_TO_MOUSE_EVENT) + { + SDL_Window *window = SDL_GetMouseFocus(); + if (window) { + if (finger_touching == SDL_TRUE && first_finger == fingerid) { + int pos_x = x * window->w; + int pos_y = y * window->y; + SDL_SendMouseMotion(window, SDL_TOUCH_MOUSEID, 0, pos_x, pos_y); + } + } + } +#endif + finger = SDL_GetFinger(touch,fingerid); if (!finger) { return SDL_SendTouch(id, fingerid, SDL_TRUE, x, y, pressure);