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, ¢er_x, ¢er_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) {