summaryrefslogtreecommitdiff
path: root/Source/3rdParty/SDL2/src/video/android
diff options
context:
space:
mode:
Diffstat (limited to 'Source/3rdParty/SDL2/src/video/android')
-rw-r--r--Source/3rdParty/SDL2/src/video/android/SDL_androidmouse.c157
-rw-r--r--Source/3rdParty/SDL2/src/video/android/SDL_androidmouse.h3
-rw-r--r--Source/3rdParty/SDL2/src/video/android/SDL_androidvideo.c33
-rw-r--r--Source/3rdParty/SDL2/src/video/android/SDL_androidvideo.h8
-rw-r--r--Source/3rdParty/SDL2/src/video/android/SDL_androidwindow.c37
5 files changed, 213 insertions, 25 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:
diff --git a/Source/3rdParty/SDL2/src/video/android/SDL_androidmouse.h b/Source/3rdParty/SDL2/src/video/android/SDL_androidmouse.h
index f201fad..eca9e47 100644
--- a/Source/3rdParty/SDL2/src/video/android/SDL_androidmouse.h
+++ b/Source/3rdParty/SDL2/src/video/android/SDL_androidmouse.h
@@ -25,7 +25,8 @@
#include "SDL_androidvideo.h"
extern void Android_InitMouse(void);
-extern void Android_OnMouse( int button, int action, float x, float y);
+extern void Android_OnMouse(int button, int action, float x, float y, SDL_bool relative);
+extern void Android_QuitMouse(void);
#endif /* SDL_androidmouse_h_ */
diff --git a/Source/3rdParty/SDL2/src/video/android/SDL_androidvideo.c b/Source/3rdParty/SDL2/src/video/android/SDL_androidvideo.c
index 357f5cf..589461a 100644
--- a/Source/3rdParty/SDL2/src/video/android/SDL_androidvideo.c
+++ b/Source/3rdParty/SDL2/src/video/android/SDL_androidvideo.c
@@ -60,8 +60,10 @@ int Android_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float
/* These are filled in with real values in Android_SetScreenResolution on init (before SDL_main()) */
-int Android_ScreenWidth = 0;
-int Android_ScreenHeight = 0;
+int Android_SurfaceWidth = 0;
+int Android_SurfaceHeight = 0;
+int Android_DeviceWidth = 0;
+int Android_DeviceHeight = 0;
Uint32 Android_ScreenFormat = SDL_PIXELFORMAT_UNKNOWN;
static int Android_ScreenRate = 0;
@@ -176,8 +178,8 @@ Android_VideoInit(_THIS)
SDL_DisplayMode mode;
mode.format = Android_ScreenFormat;
- mode.w = Android_ScreenWidth;
- mode.h = Android_ScreenHeight;
+ mode.w = Android_DeviceWidth;
+ mode.h = Android_DeviceHeight;
mode.refresh_rate = Android_ScreenRate;
mode.driverdata = NULL;
if (SDL_AddBasicVideoDisplay(&mode) < 0) {
@@ -199,6 +201,7 @@ Android_VideoInit(_THIS)
void
Android_VideoQuit(_THIS)
{
+ Android_QuitMouse();
Android_QuitTouch();
}
@@ -209,12 +212,14 @@ Android_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * h
}
void
-Android_SetScreenResolution(int width, int height, Uint32 format, float rate)
+Android_SetScreenResolution(int surfaceWidth, int surfaceHeight, int deviceWidth, int deviceHeight, Uint32 format, float rate)
{
- SDL_VideoDevice* device;
- SDL_VideoDisplay *display;
- Android_ScreenWidth = width;
- Android_ScreenHeight = height;
+ SDL_VideoDevice* device;
+ SDL_VideoDisplay *display;
+ Android_SurfaceWidth = surfaceWidth;
+ Android_SurfaceHeight = surfaceHeight;
+ Android_DeviceWidth = deviceWidth;
+ Android_DeviceHeight = deviceHeight;
Android_ScreenFormat = format;
Android_ScreenRate = rate;
@@ -229,8 +234,8 @@ Android_SetScreenResolution(int width, int height, Uint32 format, float rate)
{
display = &device->displays[0];
display->desktop_mode.format = Android_ScreenFormat;
- display->desktop_mode.w = Android_ScreenWidth;
- display->desktop_mode.h = Android_ScreenHeight;
+ display->desktop_mode.w = Android_DeviceWidth;
+ display->desktop_mode.h = Android_DeviceHeight;
display->desktop_mode.refresh_rate = Android_ScreenRate;
}
@@ -240,12 +245,12 @@ Android_SetScreenResolution(int width, int height, Uint32 format, float rate)
display = SDL_GetDisplayForWindow(Android_Window);
display->display_modes[0].format = format;
- display->display_modes[0].w = width;
- display->display_modes[0].h = height;
+ display->display_modes[0].w = Android_DeviceWidth;
+ display->display_modes[0].h = Android_DeviceHeight;
display->display_modes[0].refresh_rate = rate;
display->current_mode = display->display_modes[0];
- SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_RESIZED, width, height);
+ SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_RESIZED, surfaceWidth, surfaceHeight);
}
}
diff --git a/Source/3rdParty/SDL2/src/video/android/SDL_androidvideo.h b/Source/3rdParty/SDL2/src/video/android/SDL_androidvideo.h
index a62c983..6dce7ed 100644
--- a/Source/3rdParty/SDL2/src/video/android/SDL_androidvideo.h
+++ b/Source/3rdParty/SDL2/src/video/android/SDL_androidvideo.h
@@ -28,7 +28,7 @@
#include "../SDL_sysvideo.h"
/* Called by the JNI layer when the screen changes size or format */
-extern void Android_SetScreenResolution(int width, int height, Uint32 format, float rate);
+extern void Android_SetScreenResolution(int surfaceWidth, int surfaceHeight, int deviceWidth, int deviceHeight, Uint32 format, float rate);
/* Private display data */
@@ -37,8 +37,10 @@ typedef struct SDL_VideoData
SDL_Rect textRect;
} SDL_VideoData;
-extern int Android_ScreenWidth;
-extern int Android_ScreenHeight;
+extern int Android_SurfaceWidth;
+extern int Android_SurfaceHeight;
+extern int Android_DeviceWidth;
+extern int Android_DeviceHeight;
extern Uint32 Android_ScreenFormat;
extern SDL_sem *Android_PauseSem, *Android_ResumeSem;
extern SDL_Window *Android_Window;
diff --git a/Source/3rdParty/SDL2/src/video/android/SDL_androidwindow.c b/Source/3rdParty/SDL2/src/video/android/SDL_androidwindow.c
index f1cbf58..cf18e67 100644
--- a/Source/3rdParty/SDL2/src/video/android/SDL_androidwindow.c
+++ b/Source/3rdParty/SDL2/src/video/android/SDL_androidwindow.c
@@ -26,6 +26,8 @@
#include "../SDL_sysvideo.h"
#include "../../events/SDL_keyboard_c.h"
#include "../../events/SDL_mouse_c.h"
+#include "../../events/SDL_windowevents_c.h"
+#include "../../core/android/SDL_android.h"
#include "SDL_androidvideo.h"
#include "SDL_androidwindow.h"
@@ -49,8 +51,8 @@ Android_CreateWindow(_THIS, SDL_Window * window)
/* Adjust the window data to match the screen */
window->x = 0;
window->y = 0;
- window->w = Android_ScreenWidth;
- window->h = Android_ScreenHeight;
+ window->w = Android_SurfaceWidth;
+ window->h = Android_SurfaceHeight;
window->flags &= ~SDL_WINDOW_RESIZABLE; /* window is NEVER resizeable */
window->flags &= ~SDL_WINDOW_HIDDEN;
@@ -100,7 +102,36 @@ Android_SetWindowTitle(_THIS, SDL_Window * window)
void
Android_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen)
{
- Android_JNI_SetWindowStyle(fullscreen);
+ /* If the window is being destroyed don't change visible state */
+ if (!window->is_destroying) {
+ Android_JNI_SetWindowStyle(fullscreen);
+ }
+
+ /* Ensure our size matches reality after we've executed the window style change.
+ *
+ * It is possible that we've set width and height to the full-size display, but on
+ * Samsung DeX or Chromebooks or other windowed Android environemtns, our window may
+ * still not be the full display size.
+ */
+ if (!SDL_IsDeXMode() && !SDL_IsChromebook()) {
+ return;
+ }
+
+ SDL_WindowData * data = (SDL_WindowData *)window->driverdata;
+
+ if (!data || !data->native_window) {
+ return;
+ }
+
+ int old_w = window->w;
+ int old_h = window->h;
+
+ int new_w = ANativeWindow_getWidth(data->native_window);
+ int new_h = ANativeWindow_getHeight(data->native_window);
+
+ if (old_w != new_w || old_h != new_h) {
+ SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, new_w, new_h);
+ }
}
void