From 03f8528315fa46c95991a34f3325d7b33ae5538c Mon Sep 17 00:00:00 2001
From: Edward Rudd <urkle@outoforder.cc>
Date: Sat, 02 May 2020 21:48:36 +0000
Subject: [PATCH] Update source to SDL2 2.0.12

---
 source/src/events/SDL_touch.c |  118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 111 insertions(+), 7 deletions(-)

diff --git a/source/src/events/SDL_touch.c b/source/src/events/SDL_touch.c
index 0037416..5cc7ea3 100644
--- a/source/src/events/SDL_touch.c
+++ b/source/src/events/SDL_touch.c
@@ -1,6 +1,6 @@
 /*
   Simple DirectMedia Layer
-  Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
+  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -31,6 +31,15 @@
 static int SDL_num_touch = 0;
 static SDL_Touch **SDL_touchDevices = NULL;
 
+/* for mapping touch events to mice */
+
+#define SYNTHESIZE_TOUCH_TO_MOUSE 1
+
+#if SYNTHESIZE_TOUCH_TO_MOUSE
+static SDL_bool finger_touching = SDL_FALSE;
+static SDL_FingerID track_fingerid;
+static SDL_TouchID  track_touchid;
+#endif
 
 /* Public functions */
 int
@@ -86,6 +95,16 @@
     return SDL_touchDevices[index];
 }
 
+SDL_TouchDeviceType
+SDL_GetTouchDeviceType(SDL_TouchID id)
+{
+    SDL_Touch *touch = SDL_GetTouch(id);
+    if (touch) {
+        return touch->type;
+    }
+    return SDL_TOUCH_DEVICE_INVALID;
+}
+
 static int
 SDL_GetFingerIndex(const SDL_Touch * touch, SDL_FingerID fingerid)
 {
@@ -133,7 +152,7 @@
 }
 
 int
-SDL_AddTouch(SDL_TouchID touchID, const char *name)
+SDL_AddTouch(SDL_TouchID touchID, SDL_TouchDeviceType type, const char *name)
 {
     SDL_Touch **touchDevices;
     int index;
@@ -163,6 +182,7 @@
 
     /* we're setting the touch properties */
     SDL_touchDevices[index]->id = touchID;
+    SDL_touchDevices[index]->type = type;
     SDL_touchDevices[index]->num_fingers = 0;
     SDL_touchDevices[index]->max_fingers = 0;
     SDL_touchDevices[index]->fingers = NULL;
@@ -219,15 +239,65 @@
 }
 
 int
-SDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid,
+SDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid, SDL_Window * window,
               SDL_bool down, float x, float y, float pressure)
 {
     int posted;
     SDL_Finger *finger;
+    SDL_Mouse *mouse;
 
     SDL_Touch* touch = SDL_GetTouch(id);
     if (!touch) {
         return -1;
+    }
+
+    mouse = SDL_GetMouse();
+
+#if SYNTHESIZE_TOUCH_TO_MOUSE
+    /* SDL_HINT_TOUCH_MOUSE_EVENTS: controlling whether touch events should generate synthetic mouse events */
+    {
+        if (mouse->touch_mouse_events) {
+            /* FIXME: maybe we should only restrict to a few SDL_TouchDeviceType */
+            if (id != SDL_MOUSE_TOUCHID) {
+                if (window) {
+                    if (down) {
+                        if (finger_touching == SDL_FALSE) {
+                            int pos_x = (int)(x * (float)window->w);
+                            int pos_y = (int)(y * (float)window->h);
+                            if (pos_x < 0) pos_x = 0;
+                            if (pos_x > window->w - 1) pos_x = window->w - 1;
+                            if (pos_y < 0) pos_y = 0;
+                            if (pos_y > window->h - 1) pos_y = window->h - 1;
+                            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 && track_touchid == id && track_fingerid == fingerid) {
+                            SDL_SendMouseButton(window, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT);
+                        }
+                    }
+                }
+                if (down) {
+                    if (finger_touching == SDL_FALSE) {
+                        finger_touching = SDL_TRUE;
+                        track_touchid = id;
+                        track_fingerid = fingerid;
+                    }
+                } else {
+                    if (finger_touching == SDL_TRUE && track_touchid == id && track_fingerid == fingerid) {
+                        finger_touching = SDL_FALSE;
+                    }
+                }
+            }
+        }
+    }
+#endif
+
+    /* SDL_HINT_MOUSE_TOUCH_EVENTS: if not set, discard synthetic touch events coming from platform layer */
+    if (mouse->mouse_touch_events == 0) {
+        if (id == SDL_MOUSE_TOUCHID) {
+            return 0;
+        }
     }
 
     finger = SDL_GetFinger(touch, fingerid);
@@ -252,6 +322,7 @@
             event.tfinger.dx = 0;
             event.tfinger.dy = 0;
             event.tfinger.pressure = pressure;
+            event.tfinger.windowID = window ? SDL_GetWindowID(window) : 0;
             posted = (SDL_PushEvent(&event) > 0);
         }
     } else {
@@ -264,7 +335,7 @@
         if (SDL_GetEventState(SDL_FINGERUP) == SDL_ENABLE) {
             SDL_Event event;
             event.tfinger.type = SDL_FINGERUP;
-            event.tfinger.touchId =  id;
+            event.tfinger.touchId = id;
             event.tfinger.fingerId = fingerid;
             /* I don't trust the coordinates passed on fingerUp */
             event.tfinger.x = finger->x;
@@ -272,6 +343,7 @@
             event.tfinger.dx = 0;
             event.tfinger.dy = 0;
             event.tfinger.pressure = pressure;
+            event.tfinger.windowID = window ? SDL_GetWindowID(window) : 0;
             posted = (SDL_PushEvent(&event) > 0);
         }
 
@@ -281,11 +353,12 @@
 }
 
 int
-SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid,
+SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, SDL_Window * window,
                     float x, float y, float pressure)
 {
     SDL_Touch *touch;
     SDL_Finger *finger;
+    SDL_Mouse *mouse;
     int posted;
     float xrel, yrel, prel;
 
@@ -294,9 +367,39 @@
         return -1;
     }
 
+    mouse = SDL_GetMouse();
+
+#if SYNTHESIZE_TOUCH_TO_MOUSE
+    /* SDL_HINT_TOUCH_MOUSE_EVENTS: controlling whether touch events should generate synthetic mouse events */
+    {
+        if (mouse->touch_mouse_events) {
+            if (id != SDL_MOUSE_TOUCHID) {
+                if (window) {
+                    if (finger_touching == SDL_TRUE && track_touchid == id && track_fingerid == fingerid) {
+                        int pos_x = (int)(x * (float)window->w);
+                        int pos_y = (int)(y * (float)window->h);
+                        if (pos_x < 0) pos_x = 0;
+                        if (pos_x > window->w - 1) pos_x = window->w - 1;
+                        if (pos_y < 0) pos_y = 0;
+                        if (pos_y > window->h - 1) pos_y = window->h - 1;
+                        SDL_SendMouseMotion(window, SDL_TOUCH_MOUSEID, 0, pos_x, pos_y);
+                    }
+                }
+            }
+        }
+    }
+#endif
+
+    /* SDL_HINT_MOUSE_TOUCH_EVENTS: if not set, discard synthetic touch events coming from platform layer */
+    if (mouse->mouse_touch_events == 0) {
+        if (id == SDL_MOUSE_TOUCHID) {
+            return 0;
+        }
+    }
+
     finger = SDL_GetFinger(touch,fingerid);
     if (!finger) {
-        return SDL_SendTouch(id, fingerid, SDL_TRUE, x, y, pressure);
+        return SDL_SendTouch(id, fingerid, window, SDL_TRUE, x, y, pressure);
     }
 
     xrel = x - finger->x;
@@ -304,7 +407,7 @@
     prel = pressure - finger->pressure;
 
     /* Drop events that don't change state */
-    if (!xrel && !yrel && !prel) {
+    if (xrel == 0.0f && yrel == 0.0f && prel == 0.0f) {
 #if 0
         printf("Touch event didn't change state - dropped!\n");
 #endif
@@ -328,6 +431,7 @@
         event.tfinger.dx = xrel;
         event.tfinger.dy = yrel;
         event.tfinger.pressure = pressure;
+        event.tfinger.windowID = window ? SDL_GetWindowID(window) : 0;
         posted = (SDL_PushEvent(&event) > 0);
     }
     return posted;

--
Gitblit v1.9.3