From 64dd829b0adace5921092d2221dd3bb0663bf525 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 14 Aug 2017 13:48:13 -0700 Subject: [PATCH] Fixed bug 2418 - Structure SDL_gestureTouch leaking Leonardo Structure SDL_gestureTouch gets reallocated for every new added gesture but its never freed. Proposed patch add the function SDL_GestureQuit() that takes care of doing that and gets called when TouchQuit is called. Gabriel Jacobo Thanks for the patch. I think it needs a bit of extra work though, looking at the code in SDL_gesture.c , I see that SDL_numGestureTouches only goes up, I think the right fix here involves adding SDL_GestureDelTouch (hooked into SDL_DelTouch) as well as SDL_GestureQuit (as you posted in your patch). --- src/events/SDL_gesture.c | 28 ++++++++++++++++++++++++++++ src/events/SDL_gesture_c.h | 3 +++ src/events/SDL_touch.c | 4 ++++ 3 files changed, 35 insertions(+) diff --git a/src/events/SDL_gesture.c b/src/events/SDL_gesture.c index 8b21066b2..e8477acbb 100644 --- a/src/events/SDL_gesture.c +++ b/src/events/SDL_gesture.c @@ -101,6 +101,12 @@ int SDL_RecordGesture(SDL_TouchID touchId) return (touchId < 0); } +void SDL_GestureQuit() +{ + SDL_free(SDL_gestureTouch); + SDL_gestureTouch = NULL; +} + static unsigned long SDL_HashDollar(SDL_FloatPoint* points) { unsigned long hash = 5381; @@ -457,6 +463,28 @@ int SDL_GestureAddTouch(SDL_TouchID touchId) return 0; } +int SDL_GestureDelTouch(SDL_TouchID touchId) +{ + int i; + for (i = 0; i < SDL_numGestureTouches; i++) { + if (SDL_gestureTouch[i].id == touchId) { + break; + } + } + + if (i == SDL_numGestureTouches) { + /* not found */ + return -1; + } + + SDL_free(SDL_gestureTouch[i].dollarTemplate); + SDL_zero(SDL_gestureTouch[i]); + + SDL_numGestureTouches--; + SDL_gestureTouch[i] = SDL_gestureTouch[SDL_numGestureTouches]; + return 0; +} + static SDL_GestureTouch * SDL_GetGestureTouch(SDL_TouchID id) { int i; diff --git a/src/events/SDL_gesture_c.h b/src/events/SDL_gesture_c.h index bce812b9e..ab588b04e 100644 --- a/src/events/SDL_gesture_c.h +++ b/src/events/SDL_gesture_c.h @@ -24,9 +24,12 @@ #define SDL_gesture_c_h_ extern int SDL_GestureAddTouch(SDL_TouchID touchId); +extern int SDL_GestureDelTouch(SDL_TouchID touchId); extern void SDL_GestureProcessEvent(SDL_Event* event); +extern void SDL_GestureQuit(void); + #endif /* SDL_gesture_c_h_ */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index 92e76f2e4..39a765a78 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -352,6 +352,9 @@ SDL_DelTouch(SDL_TouchID id) SDL_num_touch--; SDL_touchDevices[index] = SDL_touchDevices[SDL_num_touch]; + + /* Delete this touch device for gestures */ + SDL_GestureDelTouch(id); } void @@ -366,6 +369,7 @@ SDL_TouchQuit(void) SDL_free(SDL_touchDevices); SDL_touchDevices = NULL; + SDL_GestureQuit(); } /* vi: set ts=4 sw=4 expandtab: */