Bug 4576: track both FingerId and TrackId
diff --git a/src/core/linux/SDL_evdev.c b/src/core/linux/SDL_evdev.c
index 7b51e4b..0ae3194 100644
--- a/src/core/linux/SDL_evdev.c
+++ b/src/core/linux/SDL_evdev.c
@@ -270,9 +270,7 @@
                     /* BTH_TOUCH event value 1 indicates there is contact with
                        a touchscreen or trackpad (earlist finger's current
                        position is sent in EV_ABS ABS_X/ABS_Y, switching to
-                       next finger after earlist is released) however using it
-                       for virtual mouse SDL_TOUCH_MOUSEID would differ from
-                       other SDL backends which require a new finger touch. */
+                       next finger after earlist is released) */
                     if (item->is_touchscreen && events[i].code == BTN_TOUCH) {
                         break;
                     }
diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c
index 2d9ad8f..451b451 100644
--- a/src/events/SDL_mouse.c
+++ b/src/events/SDL_mouse.c
@@ -298,10 +298,6 @@
     int xrel;
     int yrel;
 
-    if (mouseID == SDL_TOUCH_MOUSEID && !mouse->touch_mouse_events) {
-        return 0;
-    }
-
     if (mouseID != SDL_TOUCH_MOUSEID && mouse->relative_mode_warp) {
         int center_x = 0, center_y = 0;
         SDL_GetWindowSize(window, &center_x, &center_y);
@@ -447,10 +443,6 @@
     Uint32 type;
     Uint32 buttonstate = mouse->buttonstate;
 
-    if (mouseID == SDL_TOUCH_MOUSEID && !mouse->touch_mouse_events) {
-        return 0;
-    }
-
     /* Figure out which event to perform */
     switch (state) {
     case SDL_PRESSED:
@@ -520,7 +512,7 @@
     if (window && state == SDL_RELEASED) {
         SDL_UpdateMouseFocus(window, mouse->x, mouse->y, buttonstate);
     }
-    
+
     return posted;
 }
 
diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c
index 0d227b4..1f5810a 100644
--- a/src/events/SDL_touch.c
+++ b/src/events/SDL_touch.c
@@ -32,11 +32,9 @@
 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
+static SDL_FingerID track_fingerid;
+static SDL_TouchID  track_touchid;
 
 /* Public functions */
 int
@@ -247,28 +245,31 @@
         return -1;
     }
 
-#if defined(DUPLICATE_TO_MOUSE_EVENT)
+    /* SDL_HINT_TOUCH_MOUSE_EVENTS: controlling whether touch events should generate synthetic mouse events */
     {
-        SDL_Window *window = SDL_GetMouseFocus();
-        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);
-                    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;
+        SDL_Mouse *mouse = SDL_GetMouse();
+        if (mouse->touch_mouse_events) {
+            SDL_Window *window = SDL_GetMouseFocus();
+            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);
+                        finger_touching = SDL_TRUE;
+                        track_touchid = id;
+                        track_fingerid = 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 && track_touchid == id && track_fingerid == fingerid) {
+                        SDL_SendMouseButton(window, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT);
+                        finger_touching = SDL_FALSE;
+                    }
                 }
             }
         }
     }
-#endif
 
     finger = SDL_GetFinger(touch, fingerid);
     if (down) {
@@ -334,18 +335,20 @@
         return -1;
     }
 
-#if defined(DUPLICATE_TO_MOUSE_EVENT)
+    /* SDL_HINT_TOUCH_MOUSE_EVENTS: controlling whether touch events should generate synthetic mouse events */
     {
-        SDL_Window *window = SDL_GetMouseFocus();
-        if (window) {
-            if (finger_touching == SDL_TRUE && first_finger == fingerid) {
-                int pos_x = (int)(x * (float)window->w);
-                int pos_y = (int)(y * (float)window->h);
-                SDL_SendMouseMotion(window, SDL_TOUCH_MOUSEID, 0, pos_x, pos_y);
+        SDL_Mouse *mouse = SDL_GetMouse();
+        if (mouse->touch_mouse_events) {
+            SDL_Window *window = SDL_GetMouseFocus();
+            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);
+                    SDL_SendMouseMotion(window, SDL_TOUCH_MOUSEID, 0, pos_x, pos_y);
+                }
             }
         }
     }
-#endif
 
     finger = SDL_GetFinger(touch,fingerid);
     if (!finger) {