From e51d64e42066aefd3310da4d90e759945a93ec10 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 4 Nov 2012 20:11:51 -0800 Subject: [PATCH] Added mouse emulation for touch events on Android. --- src/video/android/SDL_androidtouch.c | 40 +++++++++++++++++++++++++-- src/video/android/SDL_androidwindow.c | 4 +++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/video/android/SDL_androidtouch.c b/src/video/android/SDL_androidtouch.c index d577e8878..645a9071c 100644 --- a/src/video/android/SDL_androidtouch.c +++ b/src/video/android/SDL_androidtouch.c @@ -40,15 +40,28 @@ #define ACTION_POINTER_1_DOWN 5 #define ACTION_POINTER_1_UP 6 +static SDL_FingerID leftFingerDown = 0; + +static void Android_GetWindowCoordinates(float x, float y, + int *window_x, int *window_y) +{ + int window_w, window_h; + + SDL_GetWindowSize(Android_Window, &window_w, &window_h); + *window_x = (int)(x * window_w); + *window_y = (int)(y * window_h); +} + 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; - + int window_x, window_y; + if (!Android_Window) { return; } - + touchDeviceId = (SDL_TouchID)touch_device_id_in; if (!SDL_GetTouch(touchDeviceId)) { SDL_Touch touch; @@ -68,18 +81,39 @@ void Android_OnTouch(int touch_device_id_in, int pointer_finger_id_in, int actio } } - fingerId = (SDL_FingerID)pointer_finger_id_in; switch (action) { case ACTION_DOWN: case ACTION_POINTER_1_DOWN: + if (!leftFingerDown) { + Android_GetWindowCoordinates(x, y, &window_x, &window_y); + + /* send moved event */ + SDL_SendMouseMotion(NULL, 0, window_x, window_y); + + /* send mouse down event */ + SDL_SendMouseButton(NULL, SDL_PRESSED, SDL_BUTTON_LEFT); + + leftFingerDown = fingerId; + } SDL_SendFingerDown(touchDeviceId, fingerId, SDL_TRUE, x, y, p); break; case ACTION_MOVE: + if (!leftFingerDown) { + Android_GetWindowCoordinates(x, y, &window_x, &window_y); + + /* send moved event */ + SDL_SendMouseMotion(NULL, 0, window_x, window_y); + } SDL_SendTouchMotion(touchDeviceId, fingerId, SDL_FALSE, x, y, p); break; case ACTION_UP: case ACTION_POINTER_1_UP: + if (fingerId == leftFingerDown) { + /* send mouse up */ + SDL_SendMouseButton(NULL, SDL_RELEASED, SDL_BUTTON_LEFT); + leftFingerDown = 0; + } SDL_SendFingerDown(touchDeviceId, fingerId, SDL_FALSE, x, y, p); break; default: diff --git a/src/video/android/SDL_androidwindow.c b/src/video/android/SDL_androidwindow.c index fec1e17d9..6df317fa2 100644 --- a/src/video/android/SDL_androidwindow.c +++ b/src/video/android/SDL_androidwindow.c @@ -50,6 +50,10 @@ Android_CreateWindow(_THIS, SDL_Window * window) window->flags |= SDL_WINDOW_SHOWN; /* only one window on Android */ window->flags |= SDL_WINDOW_INPUT_FOCUS; /* always has input focus */ + /* One window, it always has focus */ + SDL_SetMouseFocus(window); + //SDL_SetKeyboardFocus(window); + return 0; }