summaryrefslogtreecommitdiff
path: root/Source/3rdParty/SDL2/src/video/android/SDL_androidmouse.c
diff options
context:
space:
mode:
Diffstat (limited to 'Source/3rdParty/SDL2/src/video/android/SDL_androidmouse.c')
-rw-r--r--Source/3rdParty/SDL2/src/video/android/SDL_androidmouse.c157
1 files changed, 153 insertions, 4 deletions
diff --git a/Source/3rdParty/SDL2/src/video/android/SDL_androidmouse.c b/Source/3rdParty/SDL2/src/video/android/SDL_androidmouse.c
index 1c075fb..037b453 100644
--- a/Source/3rdParty/SDL2/src/video/android/SDL_androidmouse.c
+++ b/Source/3rdParty/SDL2/src/video/android/SDL_androidmouse.c
@@ -42,15 +42,164 @@
#define BUTTON_BACK 8
#define BUTTON_FORWARD 16
+typedef struct
+{
+ int custom_cursor;
+ int system_cursor;
+
+} SDL_AndroidCursorData;
+
/* Last known Android mouse button state (includes all buttons) */
static int last_state;
+/* Blank cursor */
+static SDL_Cursor *empty_cursor;
+
+static SDL_Cursor *
+Android_WrapCursor(int custom_cursor, int system_cursor)
+{
+ SDL_Cursor *cursor;
+
+ cursor = SDL_calloc(1, sizeof(*cursor));
+ if (cursor) {
+ SDL_AndroidCursorData *data = (SDL_AndroidCursorData*)SDL_calloc(1, sizeof(*data));
+ if (data) {
+ data->custom_cursor = custom_cursor;
+ data->system_cursor = system_cursor;
+ cursor->driverdata = data;
+ } else {
+ SDL_free(cursor);
+ cursor = NULL;
+ SDL_OutOfMemory();
+ }
+ } else {
+ SDL_OutOfMemory();
+ }
+
+ return cursor;
+}
+
+static SDL_Cursor *
+Android_CreateDefaultCursor()
+{
+ return Android_WrapCursor(0, SDL_SYSTEM_CURSOR_ARROW);
+}
+
+static SDL_Cursor *
+Android_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y)
+{
+ int custom_cursor;
+ SDL_Surface *converted;
+
+ converted = SDL_ConvertSurfaceFormat(surface, SDL_PIXELFORMAT_ARGB8888, 0);
+ if (!converted) {
+ return NULL;
+ }
+ custom_cursor = Android_JNI_CreateCustomCursor(converted, hot_x, hot_y);
+ SDL_FreeSurface(converted);
+ if (!custom_cursor) {
+ SDL_Unsupported();
+ return NULL;
+ }
+ return Android_WrapCursor(custom_cursor, 0);
+}
+
+static SDL_Cursor *
+Android_CreateSystemCursor(SDL_SystemCursor id)
+{
+ return Android_WrapCursor(0, id);
+}
+
+static void
+Android_FreeCursor(SDL_Cursor * cursor)
+{
+ SDL_free(cursor->driverdata);
+ SDL_free(cursor);
+}
+
+static SDL_Cursor *
+Android_CreateEmptyCursor()
+{
+ if (!empty_cursor) {
+ SDL_Surface *empty_surface = SDL_CreateRGBSurfaceWithFormat(0, 1, 1, 32, SDL_PIXELFORMAT_ARGB8888);
+ if (empty_surface) {
+ SDL_memset(empty_surface->pixels, 0, empty_surface->h * empty_surface->pitch);
+ empty_cursor = Android_CreateCursor(empty_surface, 0, 0);
+ SDL_FreeSurface(empty_surface);
+ }
+ }
+ return empty_cursor;
+}
+
+static void
+Android_DestroyEmptyCursor()
+{
+ if (empty_cursor) {
+ Android_FreeCursor(empty_cursor);
+ empty_cursor = NULL;
+ }
+}
+
+static int
+Android_ShowCursor(SDL_Cursor * cursor)
+{
+ if (!cursor) {
+ cursor = Android_CreateEmptyCursor();
+ }
+ if (cursor) {
+ SDL_AndroidCursorData *data = (SDL_AndroidCursorData*)cursor->driverdata;
+ if (data->custom_cursor) {
+ if (!Android_JNI_SetCustomCursor(data->custom_cursor)) {
+ return SDL_Unsupported();
+ }
+ } else {
+ if (!Android_JNI_SetSystemCursor(data->system_cursor)) {
+ return SDL_Unsupported();
+ }
+ }
+ return 0;
+ } else {
+ /* SDL error set inside Android_CreateEmptyCursor() */
+ return -1;
+ }
+}
+
+static int
+Android_SetRelativeMouseMode(SDL_bool enabled)
+{
+ if (!Android_JNI_SupportsRelativeMouse()) {
+ return SDL_Unsupported();
+ }
+
+ if (!Android_JNI_SetRelativeMouseEnabled(enabled)) {
+ return SDL_Unsupported();
+ }
+
+ return 0;
+}
+
void
Android_InitMouse(void)
{
+ SDL_Mouse *mouse = SDL_GetMouse();
+
+ mouse->CreateCursor = Android_CreateCursor;
+ mouse->CreateSystemCursor = Android_CreateSystemCursor;
+ mouse->ShowCursor = Android_ShowCursor;
+ mouse->FreeCursor = Android_FreeCursor;
+ mouse->SetRelativeMouseMode = Android_SetRelativeMouseMode;
+
+ SDL_SetDefaultCursor(Android_CreateDefaultCursor());
+
last_state = 0;
}
+void
+Android_QuitMouse(void)
+{
+ Android_DestroyEmptyCursor();
+}
+
/* Translate Android mouse button state to SDL mouse button */
static Uint8
TranslateButton(int state)
@@ -71,7 +220,7 @@ TranslateButton(int state)
}
void
-Android_OnMouse(int state, int action, float x, float y)
+Android_OnMouse(int state, int action, float x, float y, SDL_bool relative)
{
int changes;
Uint8 button;
@@ -85,7 +234,7 @@ Android_OnMouse(int state, int action, float x, float y)
changes = state & ~last_state;
button = TranslateButton(changes);
last_state = state;
- SDL_SendMouseMotion(Android_Window, 0, 0, x, y);
+ SDL_SendMouseMotion(Android_Window, 0, relative, x, y);
SDL_SendMouseButton(Android_Window, 0, SDL_PRESSED, button);
break;
@@ -93,13 +242,13 @@ Android_OnMouse(int state, int action, float x, float y)
changes = last_state & ~state;
button = TranslateButton(changes);
last_state = state;
- SDL_SendMouseMotion(Android_Window, 0, 0, x, y);
+ SDL_SendMouseMotion(Android_Window, 0, relative, x, y);
SDL_SendMouseButton(Android_Window, 0, SDL_RELEASED, button);
break;
case ACTION_MOVE:
case ACTION_HOVER_MOVE:
- SDL_SendMouseMotion(Android_Window, 0, 0, x, y);
+ SDL_SendMouseMotion(Android_Window, 0, relative, x, y);
break;
case ACTION_SCROLL: