Commit a3f2c446ef320fa0986cfe4d3501316be0d45244

Sylvain Becker 2019-04-02T16:46:17

Bug 4576: handle mapping of TouchEvents to MouseEvents at higher level

diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c
index 26565f5..839ea2e 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);