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).
parent
f142a7961e
commit
64dd829b0a
|
@ -101,6 +101,12 @@ int SDL_RecordGesture(SDL_TouchID touchId)
|
||||||
return (touchId < 0);
|
return (touchId < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SDL_GestureQuit()
|
||||||
|
{
|
||||||
|
SDL_free(SDL_gestureTouch);
|
||||||
|
SDL_gestureTouch = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned long SDL_HashDollar(SDL_FloatPoint* points)
|
static unsigned long SDL_HashDollar(SDL_FloatPoint* points)
|
||||||
{
|
{
|
||||||
unsigned long hash = 5381;
|
unsigned long hash = 5381;
|
||||||
|
@ -457,6 +463,28 @@ int SDL_GestureAddTouch(SDL_TouchID touchId)
|
||||||
return 0;
|
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)
|
static SDL_GestureTouch * SDL_GetGestureTouch(SDL_TouchID id)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -24,9 +24,12 @@
|
||||||
#define SDL_gesture_c_h_
|
#define SDL_gesture_c_h_
|
||||||
|
|
||||||
extern int SDL_GestureAddTouch(SDL_TouchID touchId);
|
extern int SDL_GestureAddTouch(SDL_TouchID touchId);
|
||||||
|
extern int SDL_GestureDelTouch(SDL_TouchID touchId);
|
||||||
|
|
||||||
extern void SDL_GestureProcessEvent(SDL_Event* event);
|
extern void SDL_GestureProcessEvent(SDL_Event* event);
|
||||||
|
|
||||||
|
extern void SDL_GestureQuit(void);
|
||||||
|
|
||||||
#endif /* SDL_gesture_c_h_ */
|
#endif /* SDL_gesture_c_h_ */
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
|
@ -352,6 +352,9 @@ SDL_DelTouch(SDL_TouchID id)
|
||||||
|
|
||||||
SDL_num_touch--;
|
SDL_num_touch--;
|
||||||
SDL_touchDevices[index] = SDL_touchDevices[SDL_num_touch];
|
SDL_touchDevices[index] = SDL_touchDevices[SDL_num_touch];
|
||||||
|
|
||||||
|
/* Delete this touch device for gestures */
|
||||||
|
SDL_GestureDelTouch(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -366,6 +369,7 @@ SDL_TouchQuit(void)
|
||||||
|
|
||||||
SDL_free(SDL_touchDevices);
|
SDL_free(SDL_touchDevices);
|
||||||
SDL_touchDevices = NULL;
|
SDL_touchDevices = NULL;
|
||||||
|
SDL_GestureQuit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
Loading…
Reference in New Issue