From 9cd2e9ec8fc0127393dfce9c0359d500c8c238be Mon Sep 17 00:00:00 2001
From: Edward Rudd <urkle@outoforder.cc>
Date: Tue, 09 Apr 2019 02:22:50 +0000
Subject: [PATCH] updae source to 2.0.9 source

---
 source/src/video/android/SDL_androidmouse.c |  157 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 153 insertions(+), 4 deletions(-)

diff --git a/source/src/video/android/SDL_androidmouse.c b/source/src/video/android/SDL_androidmouse.c
index 1c075fb..037b453 100644
--- a/source/src/video/android/SDL_androidmouse.c
+++ b/source/src/video/android/SDL_androidmouse.c
@@ -42,13 +42,162 @@
 #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 */
@@ -71,7 +220,7 @@
 }
 
 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 @@
             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 @@
             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:

--
Gitblit v1.9.3