From ab03892ddfa65da9f5136721c1e88ec2f2f0285a Mon Sep 17 00:00:00 2001 From: Sylvain Becker Date: Thu, 4 Apr 2019 15:19:00 +0200 Subject: [PATCH] Bug 4576: track both FingerId and TrackId --- src/core/linux/SDL_evdev.c | 4 +-- src/events/SDL_mouse.c | 10 +------ src/events/SDL_touch.c | 61 ++++++++++++++++++++------------------ 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/src/core/linux/SDL_evdev.c b/src/core/linux/SDL_evdev.c index 7b51e4b16..0ae319419 100644 --- a/src/core/linux/SDL_evdev.c +++ b/src/core/linux/SDL_evdev.c @@ -270,9 +270,7 @@ SDL_EVDEV_Poll(void) /* 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 2d9ad8ffb..451b451a5 100644 --- a/src/events/SDL_mouse.c +++ b/src/events/SDL_mouse.c @@ -298,10 +298,6 @@ SDL_PrivateSendMouseMotion(SDL_Window * window, SDL_MouseID mouseID, int relativ 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 @@ SDL_PrivateSendMouseButton(SDL_Window * window, SDL_MouseID mouseID, Uint8 state 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 @@ SDL_PrivateSendMouseButton(SDL_Window * window, SDL_MouseID mouseID, Uint8 state 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 0d227b469..1f5810af1 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -32,11 +32,9 @@ 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 +static SDL_FingerID track_fingerid; +static SDL_TouchID track_touchid; /* Public functions */ int @@ -247,28 +245,31 @@ SDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid, 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 @@ SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, 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) {