Added support for multitouch on Android.
Fixes Bugzilla #1294. Thanks to Gabriel Jacobo for the patch!
This commit is contained in:
parent
bc13816375
commit
62176df129
4 changed files with 72 additions and 23 deletions
|
@ -93,7 +93,8 @@ public class SDLActivity extends Activity {
|
||||||
public static native void onNativeResize(int x, int y, int format);
|
public static native void onNativeResize(int x, int y, int format);
|
||||||
public static native void onNativeKeyDown(int keycode);
|
public static native void onNativeKeyDown(int keycode);
|
||||||
public static native void onNativeKeyUp(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);
|
float y, float p);
|
||||||
public static native void onNativeAccel(float x, float y, float z);
|
public static native void onNativeAccel(float x, float y, float z);
|
||||||
public static native void nativeRunAudioThread();
|
public static native void nativeRunAudioThread();
|
||||||
|
@ -459,16 +460,34 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
|
||||||
|
|
||||||
// Touch events
|
// Touch events
|
||||||
public boolean onTouch(View v, MotionEvent event) {
|
public boolean onTouch(View v, MotionEvent event) {
|
||||||
|
{
|
||||||
int action = event.getAction();
|
final int touchDevId = event.getDeviceId();
|
||||||
float x = event.getX();
|
final int pointerCount = event.getPointerCount();
|
||||||
float y = event.getY();
|
// touchId, pointerId, action, x, y, pressure
|
||||||
float p = event.getPressure();
|
int actionPointerIndex = event.getActionIndex();
|
||||||
|
int pointerFingerId = event.getPointerId(actionPointerIndex);
|
||||||
|
int action = event.getActionMasked();
|
||||||
|
|
||||||
// TODO: Anything else we need to pass?
|
float x = event.getX(actionPointerIndex);
|
||||||
SDLActivity.onNativeTouch(action, x, y, p);
|
float y = event.getY(actionPointerIndex);
|
||||||
return true;
|
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
|
// Sensor events
|
||||||
public void enableSensor(int sensortype, boolean enabled) {
|
public void enableSensor(int sensortype, boolean enabled) {
|
||||||
|
|
|
@ -123,9 +123,10 @@ extern "C" void Java_org_libsdl_app_SDLActivity_onNativeKeyUp(
|
||||||
// Touch
|
// Touch
|
||||||
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeTouch(
|
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeTouch(
|
||||||
JNIEnv* env, jclass jcls,
|
JNIEnv* env, jclass jcls,
|
||||||
|
jint touch_device_id_in, jint pointer_finger_id_in,
|
||||||
jint action, jfloat x, jfloat y, jfloat p)
|
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
|
// Accelerometer
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#include "SDL_events.h"
|
#include "SDL_events.h"
|
||||||
#include "../../events/SDL_mouse_c.h"
|
#include "../../events/SDL_mouse_c.h"
|
||||||
|
#include "../../events/SDL_touch_c.h"
|
||||||
|
|
||||||
#include "SDL_androidtouch.h"
|
#include "SDL_androidtouch.h"
|
||||||
|
|
||||||
|
@ -33,27 +34,55 @@
|
||||||
#define ACTION_MOVE 2
|
#define ACTION_MOVE 2
|
||||||
#define ACTION_CANCEL 3
|
#define ACTION_CANCEL 3
|
||||||
#define ACTION_OUTSIDE 4
|
#define ACTION_OUTSIDE 4
|
||||||
|
// The following two are deprecated but it seems they are still emitted (instead the corresponding ACTION_UP/DOWN) as of Android 3.2
|
||||||
|
#define ACTION_POINTER_1_DOWN 5
|
||||||
|
#define ACTION_POINTER_1_UP 6
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
SDL_TouchID touchDeviceId = 0;
|
||||||
|
SDL_FingerID fingerId = 0;
|
||||||
|
|
||||||
if (!Android_Window) {
|
if (!Android_Window) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 = touch.x_max - touch.x_min;
|
||||||
|
touch.y_min = 0.0f;
|
||||||
|
touch.y_max = (float)Android_ScreenHeight;
|
||||||
|
touch.native_yres = touch.y_max - touch.y_min;
|
||||||
|
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__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((action != ACTION_CANCEL) && (action != ACTION_OUTSIDE)) {
|
|
||||||
SDL_SetMouseFocus(Android_Window);
|
fingerId = (SDL_FingerID)pointer_finger_id_in;
|
||||||
SDL_SendMouseMotion(Android_Window, 0, (int)x, (int)y);
|
switch (action) {
|
||||||
switch(action) {
|
|
||||||
case ACTION_DOWN:
|
case ACTION_DOWN:
|
||||||
SDL_SendMouseButton(Android_Window, SDL_PRESSED, SDL_BUTTON_LEFT);
|
case ACTION_POINTER_1_DOWN:
|
||||||
|
SDL_SendFingerDown(touchDeviceId, fingerId, SDL_TRUE, x, y, p);
|
||||||
|
break;
|
||||||
|
case ACTION_MOVE:
|
||||||
|
SDL_SendTouchMotion(touchDeviceId, fingerId, SDL_FALSE, x, y, p);
|
||||||
break;
|
break;
|
||||||
case ACTION_UP:
|
case ACTION_UP:
|
||||||
SDL_SendMouseButton(Android_Window, SDL_RELEASED, SDL_BUTTON_LEFT);
|
case ACTION_POINTER_1_UP:
|
||||||
|
SDL_SendFingerDown(touchDeviceId, fingerId, SDL_FALSE, x, y, p);
|
||||||
break;
|
break;
|
||||||
}
|
default:
|
||||||
} else {
|
break;
|
||||||
SDL_SetMouseFocus(NULL);
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
|
@ -22,6 +22,6 @@
|
||||||
|
|
||||||
#include "SDL_androidvideo.h"
|
#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: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue