src/video/android/SDL_androidwindow.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.
slouken@4998
     1
/*
slouken@5535
     2
  Simple DirectMedia Layer
slouken@11811
     3
  Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
slouken@4998
     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.
slouken@4998
     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:
slouken@4998
    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.
slouken@4998
    20
*/
icculus@8093
    21
#include "../../SDL_internal.h"
slouken@4998
    22
slouken@6044
    23
#if SDL_VIDEO_DRIVER_ANDROID
slouken@6044
    24
slouken@8803
    25
#include "SDL_syswm.h"
slouken@4998
    26
#include "../SDL_sysvideo.h"
philipp@7254
    27
#include "../../events/SDL_keyboard_c.h"
philipp@7254
    28
#include "../../events/SDL_mouse_c.h"
slouken@4998
    29
slouken@4998
    30
#include "SDL_androidvideo.h"
slouken@4998
    31
#include "SDL_androidwindow.h"
slouken@11270
    32
#include "SDL_hints.h"
slouken@4998
    33
slouken@4998
    34
int
slouken@4998
    35
Android_CreateWindow(_THIS, SDL_Window * window)
slouken@4998
    36
{
gabomdq@7659
    37
    SDL_WindowData *data;
gabomdq@7659
    38
    
slouken@5001
    39
    if (Android_Window) {
icculus@7037
    40
        return SDL_SetError("Android only supports one window");
slouken@5001
    41
    }
gabomdq@7659
    42
    
gabomdq@6330
    43
    Android_PauseSem = SDL_CreateSemaphore(0);
gabomdq@6330
    44
    Android_ResumeSem = SDL_CreateSemaphore(0);
slouken@5001
    45
slouken@11270
    46
    /* Set orientation */
slouken@11270
    47
    Android_JNI_SetOrientation(window->w, window->h, window->flags & SDL_WINDOW_RESIZABLE, SDL_GetHint(SDL_HINT_ORIENTATIONS));
slouken@11270
    48
slouken@4998
    49
    /* Adjust the window data to match the screen */
slouken@4998
    50
    window->x = 0;
slouken@4998
    51
    window->y = 0;
slouken@4998
    52
    window->w = Android_ScreenWidth;
slouken@4998
    53
    window->h = Android_ScreenHeight;
slouken@4998
    54
slouken@5222
    55
    window->flags &= ~SDL_WINDOW_RESIZABLE;     /* window is NEVER resizeable */
slouken@6262
    56
    window->flags &= ~SDL_WINDOW_HIDDEN;
slouken@5222
    57
    window->flags |= SDL_WINDOW_SHOWN;          /* only one window on Android */
slouken@7191
    58
    window->flags |= SDL_WINDOW_INPUT_FOCUS;    /* always has input focus */
slouken@5222
    59
slouken@6651
    60
    /* One window, it always has focus */
slouken@6651
    61
    SDL_SetMouseFocus(window);
slouken@6654
    62
    SDL_SetKeyboardFocus(window);
gabomdq@7659
    63
    
gabomdq@7659
    64
    data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data));
gabomdq@7659
    65
    if (!data) {
gabomdq@7659
    66
        return SDL_OutOfMemory();
gabomdq@7659
    67
    }
gabomdq@7659
    68
    
gabomdq@7659
    69
    data->native_window = Android_JNI_GetNativeWindow();
gabomdq@7659
    70
    
gabomdq@7659
    71
    if (!data->native_window) {
gabomdq@7659
    72
        SDL_free(data);
gabomdq@7659
    73
        return SDL_SetError("Could not fetch native window");
gabomdq@7659
    74
    }
slouken@6651
    75
slouken@11006
    76
    /* Do not create EGLSurface for Vulkan window since it will then make the window
slouken@11006
    77
       incompatible with vkCreateAndroidSurfaceKHR */
slouken@11006
    78
    if ((window->flags & SDL_WINDOW_VULKAN) == 0) {
slouken@11006
    79
        data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->native_window);
slouken@11006
    80
slouken@11006
    81
        if (data->egl_surface == EGL_NO_SURFACE) {
slouken@11006
    82
            ANativeWindow_release(data->native_window);
slouken@11006
    83
            SDL_free(data);
slouken@11006
    84
            return SDL_SetError("Could not create GLES window surface");
slouken@11006
    85
        }
gabomdq@7659
    86
    }
gabomdq@7659
    87
gabomdq@7659
    88
    window->driverdata = data;
gabomdq@7659
    89
    Android_Window = window;
gabomdq@7659
    90
    
slouken@4998
    91
    return 0;
slouken@4998
    92
}
slouken@4998
    93
slouken@4998
    94
void
slouken@4998
    95
Android_SetWindowTitle(_THIS, SDL_Window * window)
slouken@4998
    96
{
slouken@4998
    97
    Android_JNI_SetActivityTitle(window->title);
slouken@4998
    98
}
slouken@4998
    99
slouken@4998
   100
void
slouken@11865
   101
Android_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen)
slouken@11865
   102
{
slouken@11865
   103
    Android_JNI_SetWindowStyle(fullscreen);
slouken@11865
   104
}
slouken@11865
   105
slouken@11865
   106
void
slouken@4998
   107
Android_DestroyWindow(_THIS, SDL_Window * window)
slouken@4998
   108
{
gabomdq@7659
   109
    SDL_WindowData *data;
gabomdq@7659
   110
    
slouken@5001
   111
    if (window == Android_Window) {
slouken@5001
   112
        Android_Window = NULL;
gabomdq@6330
   113
        if (Android_PauseSem) SDL_DestroySemaphore(Android_PauseSem);
gabomdq@6330
   114
        if (Android_ResumeSem) SDL_DestroySemaphore(Android_ResumeSem);
gabomdq@6330
   115
        Android_PauseSem = NULL;
gabomdq@6330
   116
        Android_ResumeSem = NULL;
gabomdq@7659
   117
        
gabomdq@7659
   118
        if(window->driverdata) {
gabomdq@7659
   119
            data = (SDL_WindowData *) window->driverdata;
gabomdq@7986
   120
            if (data->egl_surface != EGL_NO_SURFACE) {
gabomdq@7986
   121
                SDL_EGL_DestroySurface(_this, data->egl_surface);
gabomdq@7986
   122
            }
slouken@8799
   123
            if (data->native_window) {
gabomdq@7659
   124
                ANativeWindow_release(data->native_window);
gabomdq@7659
   125
            }
gabomdq@7659
   126
            SDL_free(window->driverdata);
gabomdq@7659
   127
            window->driverdata = NULL;
gabomdq@7659
   128
        }
slouken@5001
   129
    }
slouken@4998
   130
}
slouken@4998
   131
slouken@8799
   132
SDL_bool
slouken@8799
   133
Android_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
slouken@8799
   134
{
slouken@8799
   135
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
slouken@8799
   136
slouken@8799
   137
    if (info->version.major == SDL_MAJOR_VERSION &&
slouken@8799
   138
        info->version.minor == SDL_MINOR_VERSION) {
slouken@8799
   139
        info->subsystem = SDL_SYSWM_ANDROID;
slouken@8799
   140
        info->info.android.window = data->native_window;
slouken@8799
   141
        info->info.android.surface = data->egl_surface;
slouken@8799
   142
        return SDL_TRUE;
slouken@8799
   143
    } else {
philipp@10945
   144
        SDL_SetError("Application not compiled with SDL %d.%d",
slouken@8799
   145
                     SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
slouken@8799
   146
        return SDL_FALSE;
slouken@8799
   147
    }
slouken@8799
   148
}
slouken@8799
   149
slouken@6044
   150
#endif /* SDL_VIDEO_DRIVER_ANDROID */
slouken@6044
   151
slouken@4998
   152
/* vi: set ts=4 sw=4 expandtab: */