SDL 2.0
SDL_androidevents.c
Go to the documentation of this file.
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "../../SDL_internal.h"
22
23#if SDL_VIDEO_DRIVER_ANDROID
24
25#include "SDL_androidevents.h"
26#include "SDL_events.h"
27#include "SDL_androidkeyboard.h"
28#include "SDL_androidwindow.h"
29
30/* Can't include sysaudio "../../audio/android/SDL_androidaudio.h"
31 * because of THIS redefinition */
32
33#if !SDL_AUDIO_DISABLED && SDL_AUDIO_DRIVER_ANDROID
34extern void ANDROIDAUDIO_ResumeDevices(void);
35extern void ANDROIDAUDIO_PauseDevices(void);
36#else
37static void ANDROIDAUDIO_ResumeDevices(void) {}
38static void ANDROIDAUDIO_PauseDevices(void) {}
39#endif
40
41#if !SDL_AUDIO_DISABLED && SDL_AUDIO_DRIVER_OPENSLES
42extern void openslES_ResumeDevices(void);
43extern void openslES_PauseDevices(void);
44#else
45static void openslES_ResumeDevices(void) {}
46static void openslES_PauseDevices(void) {}
47#endif
48
49/* Number of 'type' events in the event queue */
50static int
51SDL_NumberOfEvents(Uint32 type)
52{
54}
55
56static void
57android_egl_context_restore(SDL_Window *window)
58{
59 if (window) {
61 SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
62 if (SDL_GL_MakeCurrent(window, (SDL_GLContext) data->egl_context) < 0) {
63 /* The context is no longer valid, create a new one */
66 event.type = SDL_RENDER_DEVICE_RESET;
68 }
69 }
70}
71
72static void
73android_egl_context_backup(SDL_Window *window)
74{
75 if (window) {
76 /* Keep a copy of the EGL Context so we can try to restore it when we resume */
77 SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
79 /* We need to do this so the EGLSurface can be freed */
81 }
82}
83
84
85/*
86 * Android_ResumeSem and Android_PauseSem are signaled from Java_org_libsdl_app_SDLActivity_nativePause and Java_org_libsdl_app_SDLActivity_nativeResume
87 * When the pause semaphore is signaled, if Android_PumpEvents_Blocking is used, the event loop will block until the resume signal is emitted.
88 *
89 * No polling necessary
90 */
91
92void
94{
96
97 if (videodata->isPaused) {
98
99 /* Make sure this is the last thing we do before pausing */
101 android_egl_context_backup(Android_Window);
103
106
107 if (SDL_SemWait(Android_ResumeSem) == 0) {
108
109 videodata->isPaused = 0;
110
113
114 /* Restore the GL Context from here, as this operation is thread dependent */
115 if (!SDL_HasEvent(SDL_QUIT)) {
117 android_egl_context_restore(Android_Window);
119 }
120
121 /* Make sure SW Keyboard is restored when an app becomes foreground */
122 if (SDL_IsTextInputActive()) {
123 Android_StartTextInput(_this); /* Only showTextInput */
124 }
125 }
126 } else {
127 if (videodata->isPausing || SDL_SemTryWait(Android_PauseSem) == 0) {
128 /* We've been signaled to pause (potentially several times), but before we block ourselves,
129 * we need to make sure that the very last event (of the first pause sequence, if several)
130 * has reached the app */
131 if (SDL_NumberOfEvents(SDL_APP_DIDENTERBACKGROUND) > SDL_SemValue(Android_PauseSem)) {
132 videodata->isPausing = 1;
133 } else {
134 videodata->isPausing = 0;
135 videodata->isPaused = 1;
136 }
137 }
138 }
139}
140
141void
143{
145 static int backup_context = 0;
146
147 if (videodata->isPaused) {
148
149 if (backup_context) {
150
152 android_egl_context_backup(Android_Window);
154
157
158 backup_context = 0;
159 }
160
161
163
164 videodata->isPaused = 0;
165
168
169 /* Restore the GL Context from here, as this operation is thread dependent */
170 if (!SDL_HasEvent(SDL_QUIT)) {
172 android_egl_context_restore(Android_Window);
174 }
175
176 /* Make sure SW Keyboard is restored when an app becomes foreground */
177 if (SDL_IsTextInputActive()) {
178 Android_StartTextInput(_this); /* Only showTextInput */
179 }
180 }
181 } else {
182 if (videodata->isPausing || SDL_SemTryWait(Android_PauseSem) == 0) {
183 /* We've been signaled to pause (potentially several times), but before we block ourselves,
184 * we need to make sure that the very last event (of the first pause sequence, if several)
185 * has reached the app */
186 if (SDL_NumberOfEvents(SDL_APP_DIDENTERBACKGROUND) > SDL_SemValue(Android_PauseSem)) {
187 videodata->isPausing = 1;
188 } else {
189 videodata->isPausing = 0;
190 videodata->isPaused = 1;
191 backup_context = 1;
192 }
193 }
194 }
195}
196
197#endif /* SDL_VIDEO_DRIVER_ANDROID */
198
199/* vi: set ts=4 sw=4 expandtab: */
#define _THIS
void ANDROIDAUDIO_PauseDevices(void)
void ANDROIDAUDIO_ResumeDevices(void)
void Android_PumpEvents_NonBlocking(_THIS)
void Android_PumpEvents_Blocking(_THIS)
void Android_StartTextInput(_THIS)
SDL_sem * Android_ResumeSem
SDL_mutex * Android_ActivityMutex
SDL_sem * Android_PauseSem
SDL_Window * Android_Window
#define SDL_SemTryWait
#define SDL_PushEvent
#define SDL_SemValue
#define SDL_SemWait
#define SDL_LockMutex
#define SDL_GL_MakeCurrent
#define SDL_HasEvent
#define SDL_PeepEvents
#define SDL_IsTextInputActive
#define SDL_GL_CreateContext
#define SDL_UnlockMutex
#define SDL_GL_GetCurrentContext
@ SDL_QUIT
Definition: SDL_events.h:60
@ SDL_RENDER_DEVICE_RESET
Definition: SDL_events.h:155
@ SDL_APP_DIDENTERBACKGROUND
Definition: SDL_events.h:75
@ SDL_PEEKEVENT
Definition: SDL_events.h:616
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
struct _cl_event * event
void openslES_ResumeDevices(void)
void openslES_PauseDevices(void)
uint32_t Uint32
Definition: SDL_stdinc.h:203
static SDL_VideoDevice * _this
Definition: SDL_video.c:118
void * SDL_GLContext
An opaque handle to an OpenGL context.
Definition: SDL_video.h:193
#define NULL
Definition: begin_code.h:167
void * EGLContext
Definition: egl.h:60
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
EGLContext egl_context
The type used to identify a window.
Definition: SDL_sysvideo.h:74
General event structure.
Definition: SDL_events.h:558