Fixed bug 1423 - Finger touch events don't report pressure
authorSam Lantinga <slouken@libsdl.org>
Mon, 20 Feb 2012 23:54:33 -0500
changeset 6299 3809b2eee787
parent 6298 9110462bfc57
child 6300 82f95e6af4cd
Fixed bug 1423 - Finger touch events don't report pressure Philip Taylor 2012-02-19 08:34:52 PST SDL_touch.c never actually uses the 'pressurein' arguments to SDL_SendFingerDown/SDL_SendTouchMotion, so it doesn't report the real pressure. Also it uses touch->pressureres which is never initialised. Also it fails to initialise some fields of event.tfinger for certain events, so applications might try to use bogus data. The attached patch seems to be enough to produce generally sensible output on Android.
src/events/SDL_touch.c
--- a/src/events/SDL_touch.c	Mon Feb 20 23:51:53 2012 -0500
+++ b/src/events/SDL_touch.c	Mon Feb 20 23:54:33 2012 -0500
@@ -141,6 +141,7 @@
     
     SDL_touchPads[index]->xres = (1<<(16-1));
     SDL_touchPads[index]->yres = (1<<(16-1));
+    SDL_touchPads[index]->pressureres = (1<<(16-1));
     //Do I want this here? Probably
     SDL_GestureAddTouch(SDL_touchPads[index]);
 
@@ -329,7 +330,7 @@
     //scale to Integer coordinates
     x = (Uint16)((xin+touch->x_min)*(touch->xres)/(touch->native_xres));
     y = (Uint16)((yin+touch->y_min)*(touch->yres)/(touch->native_yres));
-    pressure = (Uint16)((yin+touch->pressure_min)*(touch->pressureres)/(touch->native_pressureres));
+    pressure = (Uint16)((pressurein+touch->pressure_min)*(touch->pressureres)/(touch->native_pressureres));
     
     finger = SDL_GetFinger(touch,fingerid);
     if(down) {
@@ -357,6 +358,8 @@
             event.tfinger.touchId = id;
             event.tfinger.x = x;
             event.tfinger.y = y;
+            event.tfinger.dx = 0;
+            event.tfinger.dy = 0;
             event.tfinger.pressure = pressure;
             event.tfinger.state = touch->buttonstate;
             event.tfinger.windowID = touch->focus ? touch->focus->id : 0;
@@ -384,6 +387,7 @@
             event.tfinger.y = finger->y;
             event.tfinger.dx = 0;
             event.tfinger.dy = 0;
+            event.tfinger.pressure = pressure;
 
             if(SDL_DelFinger(touch,fingerid) < 0) return 0;
             posted = (SDL_PushEvent(&event) > 0);
@@ -412,7 +416,7 @@
     //scale to Integer coordinates
     x = (Uint16)((xin+touch->x_min)*(touch->xres)/(touch->native_xres));
     y = (Uint16)((yin+touch->y_min)*(touch->yres)/(touch->native_yres));
-    pressure = (Uint16)((yin+touch->pressure_min)*(touch->pressureres)/(touch->native_pressureres));
+    pressure = (Uint16)((pressurein+touch->pressure_min)*(touch->pressureres)/(touch->native_pressureres));
     if(touch->flush_motion) {
         return 0;
     }