diff -r 022880331cac android-project/src/org/libsdl/app/SDLActivity.java --- a/android-project/src/org/libsdl/app/SDLActivity.java Fri Aug 26 03:38:46 2011 -0400 +++ b/android-project/src/org/libsdl/app/SDLActivity.java Mon Aug 29 20:42:25 2011 -0300 @@ -93,7 +93,8 @@ public static native void onNativeResize(int x, int y, int format); public static native void onNativeKeyDown(int keycode); public static native void onNativeKeyUp(int keycode); - public static native void onNativeTouch(int action, float x, + public static native void onNativeTouch(int touchDevId, int pointerFingerId, + int action, float x, float y, float p); public static native void onNativeAccel(float x, float y, float z); public static native void nativeRunAudioThread(); @@ -459,16 +460,34 @@ // Touch events public boolean onTouch(View v, MotionEvent event) { - - int action = event.getAction(); - float x = event.getX(); - float y = event.getY(); - float p = event.getPressure(); + { + final int touchDevId = event.getDeviceId(); + final int pointerCount = event.getPointerCount(); + // touchId, pointerId, action, x, y, pressure + int actionPointerIndex = event.getActionIndex(); + int pointerFingerId = event.getPointerId(actionPointerIndex); + int action = event.getActionMasked(); - // TODO: Anything else we need to pass? - SDLActivity.onNativeTouch(action, x, y, p); - return true; - } + float x = event.getX(actionPointerIndex); + float y = event.getY(actionPointerIndex); + float p = event.getPressure(actionPointerIndex); + + if (action == MotionEvent.ACTION_MOVE && pointerCount > 1) { + // TODO send motion to every pointer if its position has + // changed since prev event. + for (int i = 0; i < pointerCount; i++) { + pointerFingerId = event.getPointerId(i); + x = event.getX(i); + y = event.getY(i); + p = event.getPressure(i); + SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p); + } + } else { + SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p); + } + } + return true; + } // Sensor events public void enableSensor(int sensortype, boolean enabled) { diff -r 022880331cac src/core/android/SDL_android.cpp --- a/src/core/android/SDL_android.cpp Fri Aug 26 03:38:46 2011 -0400 +++ b/src/core/android/SDL_android.cpp Mon Aug 29 20:42:25 2011 -0300 @@ -123,9 +123,10 @@ // Touch extern "C" void Java_org_libsdl_app_SDLActivity_onNativeTouch( JNIEnv* env, jclass jcls, + jint touch_device_id_in, jint pointer_finger_id_in, jint action, jfloat x, jfloat y, jfloat p) { - Android_OnTouch(action, x, y, p); + Android_OnTouch(touch_device_id_in, pointer_finger_id_in, action, x, y, p); } // Accelerometer diff -r 022880331cac src/events/SDL_touch.c --- a/src/events/SDL_touch.c Fri Aug 26 03:38:46 2011 -0400 +++ b/src/events/SDL_touch.c Mon Aug 29 20:42:25 2011 -0300 @@ -312,6 +312,9 @@ SDL_SendFingerDown(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down, float xin, float yin, float pressurein) { + printf("SDL_SendFingerDown: id: %lld, fingerid %lld, down %d, xin %f, yin %f, pressurein %f\n", id, fingerid, (int)down, xin, yin, pressurein); + fflush(stdout); + int posted; Uint16 x; Uint16 y; @@ -392,9 +395,11 @@ } int -SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, int relative, - float xin, float yin, float pressurein) +SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, int relative, float xin, float yin, float pressurein) { + printf("SDL_SendTouchMotion: id: %lld, fingerid %lld, relative %d, xin %f, yin %f, pressurein %f\n", id, fingerid, relative, xin, yin, pressurein); + fflush(stdout); + SDL_Touch *touch; SDL_Finger *finger; int posted; @@ -402,6 +407,7 @@ Uint16 x; Uint16 y; Uint16 pressure; + touch = SDL_GetTouch(id); if (!touch) { diff -r 022880331cac src/video/android/SDL_androidtouch.c --- a/src/video/android/SDL_androidtouch.c Fri Aug 26 03:38:46 2011 -0400 +++ b/src/video/android/SDL_androidtouch.c Mon Aug 29 20:42:25 2011 -0300 @@ -34,13 +34,18 @@ #define ACTION_CANCEL 3 #define ACTION_OUTSIDE 4 -void Android_OnTouch(int action, float x, float y, float p) +void Android_OnTouch(int touch_device_id_in, int pointer_finger_id_in, int action, float x, float y, float p) { + printf("Android_OnTouch: touch_device_id_in: %d, pointer_finger_id_in %d, action %d, x %f, y %f, p %f\n", touch_device_id_in, pointer_finger_id_in, action, x, y, p); + fflush(stdout); + SDL_TouchID touchDeviceId = 0; + SDL_FingerID fingerId = 0; + if (!Android_Window) { return; } - if ((action != ACTION_CANCEL) && (action != ACTION_OUTSIDE)) { + /*if ((action != ACTION_CANCEL) && (action != ACTION_OUTSIDE)) { SDL_SetMouseFocus(Android_Window); SDL_SendMouseMotion(Android_Window, 0, (int)x, (int)y); switch(action) { @@ -53,7 +58,48 @@ } } else { SDL_SetMouseFocus(NULL); + }*/ + + + touchDeviceId = (SDL_TouchID)touch_device_id_in; + if (!SDL_GetTouch(touchDeviceId)) { + SDL_Touch touch; + memset( &touch, 0, sizeof(touch) ); + touch.id = touchDeviceId; + touch.x_min = 0.0f; + touch.x_max = (float)Android_ScreenWidth; + // touch.native_xres should be the difference between the min and max values, but as touch.xres is fixed to be 32768 in SDL_AddTouch, + // we set native_xres to be the same to compensate it. Beats me what's the logic behind this. + //touch.native_xres = touch.x_max - touch.x_min; + touch.native_xres = (1<<(16-1)); + touch.y_min = 0.0f; + touch.y_max = (float)Android_ScreenHeight; + // Ditto for native_yres + //touch.native_yres = touch.y_max - touch.y_min; + touch.native_yres = (1<<(16-1)); + touch.pressure_min = 0.0f; + touch.pressure_max = 1.0f; + touch.native_pressureres = touch.pressure_max - touch.pressure_min; + if (SDL_AddTouch(&touch, "") < 0) { + SDL_Log("error: can't add touch %s, %d", __FILE__, __LINE__); + } } + + + fingerId = (SDL_FingerID)pointer_finger_id_in; + switch (action) { + case ACTION_DOWN: + SDL_SendFingerDown(touchDeviceId, fingerId, SDL_TRUE, x, y, p); + break; + case ACTION_MOVE: + SDL_SendTouchMotion(touchDeviceId, fingerId, SDL_FALSE, x, y, p); + break; + case ACTION_UP: + SDL_SendFingerDown(touchDeviceId, fingerId, SDL_FALSE, x, y, p); + break; + default: + break; + } } /* vi: set ts=4 sw=4 expandtab: */ diff -r 022880331cac src/video/android/SDL_androidtouch.h --- a/src/video/android/SDL_androidtouch.h Fri Aug 26 03:38:46 2011 -0400 +++ b/src/video/android/SDL_androidtouch.h Mon Aug 29 20:42:25 2011 -0300 @@ -22,6 +22,6 @@ #include "SDL_androidvideo.h" -extern void Android_OnTouch(int action, float x, float y, float p); +extern void Android_OnTouch( int touch_device_id_in, int pointer_finger_id_in, int action, float x, float y, float p); /* vi: set ts=4 sw=4 expandtab: */