src/video/android/SDL_androidvideo.c
author Sam Lantinga <slouken@libsdl.org>
Sun, 11 Feb 2018 18:23:37 -0800
changeset 11865 af91d564aa40
parent 11811 5d94cb6b24d3
child 12012 6de756c9975a
permissions -rw-r--r--
On Android show the system UI when an SDL window is windowed, hide the system UI when it's fullscreen, like we do on iOS.
We're increasing the Android SDK minimum version to API 19, this doesn't increase the minimum target API, which is API 14.
paul@4701
     1
/*
slouken@5535
     2
  Simple DirectMedia Layer
slouken@11811
     3
  Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
paul@4701
     4
slouken@5535
     5
  This software is provided 'as-is', without any express or implied
slouken@5535
     6
  warranty.  In no event will the authors be held liable for any damages
slouken@5535
     7
  arising from the use of this software.
paul@4701
     8
slouken@5535
     9
  Permission is granted to anyone to use this software for any purpose,
slouken@5535
    10
  including commercial applications, and to alter it and redistribute it
slouken@5535
    11
  freely, subject to the following restrictions:
paul@4701
    12
slouken@5535
    13
  1. The origin of this software must not be misrepresented; you must not
slouken@5535
    14
     claim that you wrote the original software. If you use this software
slouken@5535
    15
     in a product, an acknowledgment in the product documentation would be
slouken@5535
    16
     appreciated but is not required.
slouken@5535
    17
  2. Altered source versions must be plainly marked as such, and must not be
slouken@5535
    18
     misrepresented as being the original software.
slouken@5535
    19
  3. This notice may not be removed or altered from any source distribution.
paul@4701
    20
*/
icculus@8093
    21
#include "../../SDL_internal.h"
paul@4701
    22
slouken@6044
    23
#if SDL_VIDEO_DRIVER_ANDROID
slouken@6044
    24
paul@4701
    25
/* Android SDL video driver implementation
paul@4701
    26
*/
paul@4701
    27
paul@4701
    28
#include "SDL_video.h"
paul@4701
    29
#include "SDL_mouse.h"
paul@4701
    30
#include "../SDL_sysvideo.h"
paul@4701
    31
#include "../SDL_pixels_c.h"
paul@4701
    32
#include "../../events/SDL_events_c.h"
slouken@5001
    33
#include "../../events/SDL_windowevents_c.h"
paul@4701
    34
paul@4701
    35
#include "SDL_androidvideo.h"
slouken@10672
    36
#include "SDL_androidgl.h"
slouken@6464
    37
#include "SDL_androidclipboard.h"
paul@4703
    38
#include "SDL_androidevents.h"
slouken@4980
    39
#include "SDL_androidkeyboard.h"
philipp@10051
    40
#include "SDL_androidmouse.h"
philipp@7786
    41
#include "SDL_androidtouch.h"
slouken@4998
    42
#include "SDL_androidwindow.h"
icculus@11365
    43
#include "SDL_androidvulkan.h"
paul@4701
    44
paul@4701
    45
#define ANDROID_VID_DRIVER_NAME "Android"
paul@4701
    46
paul@4701
    47
/* Initialization/Query functions */
paul@4701
    48
static int Android_VideoInit(_THIS);
paul@4701
    49
static void Android_VideoQuit(_THIS);
slouken@11662
    50
int Android_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi);
paul@4701
    51
gabomdq@8021
    52
#include "../SDL_egl_c.h"
gabomdq@7659
    53
#define Android_GLES_GetProcAddress SDL_EGL_GetProcAddress
gabomdq@7659
    54
#define Android_GLES_UnloadLibrary SDL_EGL_UnloadLibrary
gabomdq@7659
    55
#define Android_GLES_SetSwapInterval SDL_EGL_SetSwapInterval
gabomdq@7659
    56
#define Android_GLES_GetSwapInterval SDL_EGL_GetSwapInterval
gabomdq@7659
    57
#define Android_GLES_DeleteContext SDL_EGL_DeleteContext
paul@4701
    58
paul@4701
    59
/* Android driver bootstrap functions */
paul@4701
    60
paul@4701
    61
slouken@7191
    62
/* These are filled in with real values in Android_SetScreenResolution on init (before SDL_main()) */
slouken@4998
    63
int Android_ScreenWidth = 0;
slouken@4998
    64
int Android_ScreenHeight = 0;
slouken@4998
    65
Uint32 Android_ScreenFormat = SDL_PIXELFORMAT_UNKNOWN;
slouken@10672
    66
static int Android_ScreenRate = 0;
philipp@9314
    67
gabomdq@6330
    68
SDL_sem *Android_PauseSem = NULL, *Android_ResumeSem = NULL;
paul@4716
    69
slouken@5001
    70
/* Currently only one window */
slouken@5001
    71
SDL_Window *Android_Window = NULL;
paul@4716
    72
paul@4701
    73
static int
paul@4701
    74
Android_Available(void)
paul@4701
    75
{
paul@4701
    76
    return 1;
paul@4701
    77
}
paul@4701
    78
paul@4701
    79
static void
gabomdq@9173
    80
Android_SuspendScreenSaver(_THIS)
gabomdq@9173
    81
{
gabomdq@9173
    82
    Android_JNI_SuspendScreenSaver(_this->suspend_screensaver);
gabomdq@9173
    83
}
gabomdq@9173
    84
gabomdq@9173
    85
static void
paul@4701
    86
Android_DeleteDevice(SDL_VideoDevice * device)
paul@4701
    87
{
philipp@9317
    88
    SDL_free(device->driverdata);
paul@4701
    89
    SDL_free(device);
paul@4701
    90
}
paul@4701
    91
paul@4701
    92
static SDL_VideoDevice *
paul@4701
    93
Android_CreateDevice(int devindex)
paul@4701
    94
{
paul@4701
    95
    SDL_VideoDevice *device;
slouken@6555
    96
    SDL_VideoData *data;
paul@4701
    97
paul@4701
    98
    /* Initialize all variables that we clean on shutdown */
paul@4701
    99
    device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
paul@4701
   100
    if (!device) {
paul@4701
   101
        SDL_OutOfMemory();
slouken@6555
   102
        return NULL;
paul@4701
   103
    }
paul@4701
   104
slouken@6555
   105
    data = (SDL_VideoData*) SDL_calloc(1, sizeof(SDL_VideoData));
slouken@6555
   106
    if (!data) {
slouken@6555
   107
        SDL_OutOfMemory();
slouken@6555
   108
        SDL_free(device);
slouken@6555
   109
        return NULL;
slouken@6555
   110
    }
slouken@6555
   111
slouken@6555
   112
    device->driverdata = data;
slouken@6555
   113
paul@4701
   114
    /* Set the function pointers */
paul@4701
   115
    device->VideoInit = Android_VideoInit;
paul@4701
   116
    device->VideoQuit = Android_VideoQuit;
paul@4701
   117
    device->PumpEvents = Android_PumpEvents;
slouken@4980
   118
slouken@11662
   119
    device->GetDisplayDPI = Android_GetDisplayDPI;
slouken@11662
   120
slouken@11383
   121
    device->CreateSDLWindow = Android_CreateWindow;
slouken@4998
   122
    device->SetWindowTitle = Android_SetWindowTitle;
slouken@11865
   123
    device->SetWindowFullscreen = Android_SetWindowFullscreen;
slouken@4998
   124
    device->DestroyWindow = Android_DestroyWindow;
slouken@8799
   125
    device->GetWindowWMInfo = Android_GetWindowWMInfo;
slouken@4998
   126
paul@4701
   127
    device->free = Android_DeleteDevice;
paul@4701
   128
paul@4701
   129
    /* GL pointers */
gabomdq@7659
   130
    device->GL_LoadLibrary = Android_GLES_LoadLibrary;
gabomdq@7659
   131
    device->GL_GetProcAddress = Android_GLES_GetProcAddress;
gabomdq@7659
   132
    device->GL_UnloadLibrary = Android_GLES_UnloadLibrary;
gabomdq@7659
   133
    device->GL_CreateContext = Android_GLES_CreateContext;
gabomdq@7659
   134
    device->GL_MakeCurrent = Android_GLES_MakeCurrent;
gabomdq@7659
   135
    device->GL_SetSwapInterval = Android_GLES_SetSwapInterval;
gabomdq@7659
   136
    device->GL_GetSwapInterval = Android_GLES_GetSwapInterval;
gabomdq@7659
   137
    device->GL_SwapWindow = Android_GLES_SwapWindow;
gabomdq@7659
   138
    device->GL_DeleteContext = Android_GLES_DeleteContext;
paul@4701
   139
slouken@11381
   140
#if SDL_VIDEO_VULKAN
icculus@11365
   141
    device->Vulkan_LoadLibrary = Android_Vulkan_LoadLibrary;
icculus@11365
   142
    device->Vulkan_UnloadLibrary = Android_Vulkan_UnloadLibrary;
icculus@11365
   143
    device->Vulkan_GetInstanceExtensions = Android_Vulkan_GetInstanceExtensions;
icculus@11365
   144
    device->Vulkan_CreateSurface = Android_Vulkan_CreateSurface;
icculus@11365
   145
#endif
icculus@11365
   146
gabomdq@9173
   147
    /* Screensaver */
gabomdq@9173
   148
    device->SuspendScreenSaver = Android_SuspendScreenSaver;
gabomdq@9173
   149
slouken@6654
   150
    /* Text input */
slouken@6654
   151
    device->StartTextInput = Android_StartTextInput;
slouken@6654
   152
    device->StopTextInput = Android_StopTextInput;
slouken@6654
   153
    device->SetTextInputRect = Android_SetTextInputRect;
slouken@6654
   154
slouken@6392
   155
    /* Screen keyboard */
philipp@7135
   156
    device->HasScreenKeyboardSupport = Android_HasScreenKeyboardSupport;
philipp@7135
   157
    device->IsScreenKeyboardShown = Android_IsScreenKeyboardShown;
slouken@6392
   158
slouken@6464
   159
    /* Clipboard */
slouken@6464
   160
    device->SetClipboardText = Android_SetClipboardText;
slouken@6464
   161
    device->GetClipboardText = Android_GetClipboardText;
slouken@6464
   162
    device->HasClipboardText = Android_HasClipboardText;
slouken@6464
   163
paul@4701
   164
    return device;
paul@4701
   165
}
paul@4701
   166
paul@4701
   167
VideoBootStrap Android_bootstrap = {
paul@4701
   168
    ANDROID_VID_DRIVER_NAME, "SDL Android video driver",
paul@4701
   169
    Android_Available, Android_CreateDevice
paul@4701
   170
};
paul@4701
   171
paul@4701
   172
paul@4701
   173
int
paul@4701
   174
Android_VideoInit(_THIS)
paul@4701
   175
{
paul@4701
   176
    SDL_DisplayMode mode;
paul@4701
   177
slouken@4998
   178
    mode.format = Android_ScreenFormat;
slouken@4998
   179
    mode.w = Android_ScreenWidth;
slouken@4998
   180
    mode.h = Android_ScreenHeight;
philipp@9314
   181
    mode.refresh_rate = Android_ScreenRate;
paul@4701
   182
    mode.driverdata = NULL;
paul@4701
   183
    if (SDL_AddBasicVideoDisplay(&mode) < 0) {
paul@4701
   184
        return -1;
paul@4701
   185
    }
paul@4701
   186
paul@4701
   187
    SDL_AddDisplayMode(&_this->displays[0], &mode);
paul@4701
   188
slouken@4980
   189
    Android_InitKeyboard();
paul@4713
   190
philipp@7786
   191
    Android_InitTouch();
philipp@7786
   192
philipp@10051
   193
    Android_InitMouse();
philipp@10051
   194
paul@4701
   195
    /* We're done! */
paul@4701
   196
    return 0;
paul@4701
   197
}
paul@4701
   198
paul@4701
   199
void
paul@4701
   200
Android_VideoQuit(_THIS)
paul@4701
   201
{
icculus@9441
   202
    Android_QuitTouch();
paul@4701
   203
}
paul@4701
   204
slouken@11662
   205
int
slouken@11662
   206
Android_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi)
slouken@11662
   207
{
slouken@11662
   208
    return Android_JNI_GetDisplayDPI(ddpi, hdpi, vdpi);
slouken@11662
   209
}
slouken@11662
   210
slouken@4981
   211
void
philipp@9314
   212
Android_SetScreenResolution(int width, int height, Uint32 format, float rate)
slouken@4981
   213
{
slouken@10937
   214
	SDL_VideoDevice* device;
slouken@10937
   215
	SDL_VideoDisplay *display;
slouken@4998
   216
    Android_ScreenWidth = width;
slouken@7191
   217
    Android_ScreenHeight = height;
slouken@4998
   218
    Android_ScreenFormat = format;
philipp@9314
   219
    Android_ScreenRate = rate;
slouken@5001
   220
mbvett@10438
   221
    /*
mbvett@10438
   222
      Update the resolution of the desktop mode, so that the window
mbvett@10438
   223
      can be properly resized. The screen resolution change can for
slouken@11865
   224
      example happen when the Activity enters or exits immersive mode,
mbvett@10438
   225
      which can happen after VideoInit().
mbvett@10438
   226
    */
slouken@10937
   227
    device = SDL_GetVideoDevice();
mbvett@10438
   228
    if (device && device->num_displays > 0)
mbvett@10438
   229
    {
slouken@10937
   230
        display = &device->displays[0];
mbvett@10438
   231
        display->desktop_mode.format = Android_ScreenFormat;
mbvett@10438
   232
        display->desktop_mode.w = Android_ScreenWidth;
mbvett@10438
   233
        display->desktop_mode.h = Android_ScreenHeight;
mbvett@10438
   234
        display->desktop_mode.refresh_rate  = Android_ScreenRate;
mbvett@10438
   235
    }
mbvett@10438
   236
slouken@5001
   237
    if (Android_Window) {
slouken@10475
   238
        /* Force the current mode to match the resize otherwise the SDL_WINDOWEVENT_RESTORED event
slouken@10475
   239
         * will fall back to the old mode */
slouken@10937
   240
        display = SDL_GetDisplayForWindow(Android_Window);
slouken@10475
   241
slouken@11865
   242
        display->display_modes[0].format = format;
slouken@11865
   243
        display->display_modes[0].w = width;
slouken@11865
   244
        display->display_modes[0].h = height;
slouken@11865
   245
        display->display_modes[0].refresh_rate = rate;
slouken@11865
   246
        display->current_mode = display->display_modes[0];
slouken@11865
   247
slouken@11865
   248
        SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_RESIZED, width, height);
slouken@5001
   249
    }
paul@4716
   250
}
paul@4716
   251
slouken@6044
   252
#endif /* SDL_VIDEO_DRIVER_ANDROID */
slouken@6044
   253
paul@4701
   254
/* vi: set ts=4 sw=4 expandtab: */