Mercurial > sdl-ios-xcode
changeset 5126:d79ff339d1f2
Fixed bug #1056 (Frequent crashes in Touch events by simply touching the screen)
Joseba GarcĂa Echebarria 2010-12-15 01:55:22 PST
I believe the crash is caused by a check not being performed on wether an
SDL_Touch element is NULL before using it in the SDL_SendTouchMotion function
in src/events/SDL_touch.c around line 400.
Judging from the rest of the code, there's a missing
if (!touch) {
return 0;
}
before using "touch" as SDL_GetFinger(), SDL_GetFingerIndexId() use
touch->num_fingers without checking.
I can attach a patch if you like. It seems pretty straightforward, though.
I have yet to discover why touch is being returned as NULL as this error is
only triggered when an actual gesture has been performed, maybe something
related to SDL_AddTouch()?
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 28 Jan 2011 10:21:58 -0800 |
parents | dc0dfdd58f27 |
children | b6c7a6b07ebf |
files | src/events/SDL_touch.c |
diffstat | 1 files changed, 10 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/events/SDL_touch.c Thu Jan 27 22:44:08 2011 -0800 +++ b/src/events/SDL_touch.c Fri Jan 28 10:21:58 2011 -0800 @@ -397,15 +397,16 @@ float xin, float yin, float pressurein) { int index = SDL_GetTouchIndexId(id); - SDL_Touch *touch = SDL_GetTouch(id); - SDL_Finger *finger = SDL_GetFinger(touch,fingerid); + SDL_Touch *touch; + SDL_Finger *finger; int posted; Sint16 xrel, yrel; float x_max = 0, y_max = 0; - Uint16 x; - Uint16 y; - Uint16 pressure; + Uint16 x; + Uint16 y; + Uint16 pressure; + touch = SDL_GetTouch(id); if (!touch) { return SDL_TouchNotFoundError(id); } @@ -418,6 +419,7 @@ return 0; } + finger = SDL_GetFinger(touch,fingerid); if(finger == NULL || !finger->down) { return SDL_SendFingerDown(id,fingerid,SDL_TRUE,xin,yin,pressurein); } else { @@ -496,14 +498,16 @@ return posted; } } + int SDL_SendTouchButton(SDL_TouchID id, Uint8 state, Uint8 button) { - SDL_Touch *touch = SDL_GetTouch(id); + SDL_Touch *touch; int posted; Uint32 type; + touch = SDL_GetTouch(id); if (!touch) { return SDL_TouchNotFoundError(id); }