Skip to content

Latest commit

 

History

History
179 lines (144 loc) · 5.68 KB

SDL_androidevents.c

File metadata and controls

179 lines (144 loc) · 5.68 KB
 
1
2
/*
Simple DirectMedia Layer
Jan 5, 2019
Jan 5, 2019
3
Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "../../SDL_internal.h"
#if SDL_VIDEO_DRIVER_ANDROID
/* We're going to do this by default */
#define SDL_ANDROID_BLOCK_ON_PAUSE 1
#include "SDL_androidevents.h"
#include "SDL_events.h"
Jan 12, 2019
Jan 12, 2019
30
#include "SDL_androidkeyboard.h"
31
32
#include "SDL_androidwindow.h"
Feb 24, 2018
Feb 24, 2018
33
#if !SDL_AUDIO_DISABLED
Dec 2, 2016
Dec 2, 2016
34
35
36
37
/* Can't include sysaudio "../../audio/android/SDL_androidaudio.h"
* because of THIS redefinition */
extern void ANDROIDAUDIO_ResumeDevices(void);
extern void ANDROIDAUDIO_PauseDevices(void);
Feb 24, 2018
Feb 24, 2018
38
39
40
41
#else
static void ANDROIDAUDIO_ResumeDevices(void) {}
static void ANDROIDAUDIO_PauseDevices(void) {}
#endif
Jan 5, 2019
Jan 5, 2019
43
/* Number of 'type' events in the event queue */
Jan 5, 2019
Jan 5, 2019
44
static int
Jan 5, 2019
Jan 5, 2019
45
SDL_NumberOfEvents(Uint32 type)
Jan 5, 2019
Jan 5, 2019
46
47
48
49
{
return SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, type, type);
}
Jan 3, 2019
Jan 3, 2019
50
51
static void
android_egl_context_restore(SDL_Window *window)
Jan 3, 2019
Jan 3, 2019
54
55
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
if (SDL_GL_MakeCurrent(window, (SDL_GLContext) data->egl_context) < 0) {
56
/* The context is no longer valid, create a new one */
Jan 3, 2019
Jan 3, 2019
57
58
data->egl_context = (EGLContext) SDL_GL_CreateContext(window);
SDL_GL_MakeCurrent(window, (SDL_GLContext) data->egl_context);
59
60
61
62
63
event.type = SDL_RENDER_DEVICE_RESET;
SDL_PushEvent(&event);
}
}
Jan 3, 2019
Jan 3, 2019
64
65
static void
android_egl_context_backup(SDL_Window *window)
66
67
{
/* Keep a copy of the EGL Context so we can try to restore it when we resume */
Jan 3, 2019
Jan 3, 2019
68
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
69
70
data->egl_context = SDL_GL_GetCurrentContext();
/* We need to do this so the EGLSurface can be freed */
Jan 3, 2019
Jan 3, 2019
71
SDL_GL_MakeCurrent(window, NULL);
Jan 4, 2019
Jan 4, 2019
74
75
76
77
78
79
80
81
82
83
/*
* Android_ResumeSem and Android_PauseSem are signaled from Java_org_libsdl_app_SDLActivity_nativePause and Java_org_libsdl_app_SDLActivity_nativeResume
* When the pause semaphore is signaled, if SDL_ANDROID_BLOCK_ON_PAUSE is defined the event loop will block until the resume signal is emitted.
*
* No polling necessary
*/
#if SDL_ANDROID_BLOCK_ON_PAUSE
84
85
86
87
88
89
void
Android_PumpEvents(_THIS)
{
static int isPaused = 0;
static int isPausing = 0;
Jan 5, 2019
Jan 5, 2019
90
if (isPaused) {
Jan 4, 2019
Jan 4, 2019
91
92
/* Make sure this is the last thing we do before pausing */
Jan 3, 2019
Jan 3, 2019
93
SDL_LockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
94
android_egl_context_backup(Android_Window);
Jan 3, 2019
Jan 3, 2019
95
SDL_UnlockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
96
Aug 12, 2016
Aug 12, 2016
97
ANDROIDAUDIO_PauseDevices();
Jan 4, 2019
Jan 4, 2019
98
Jan 3, 2019
Jan 3, 2019
99
if (SDL_SemWait(Android_ResumeSem) == 0) {
Jan 4, 2019
Jan 4, 2019
100
Jan 4, 2019
Jan 4, 2019
102
Aug 12, 2016
Aug 12, 2016
103
ANDROIDAUDIO_ResumeDevices();
Jan 4, 2019
Jan 4, 2019
104
105
106
/* Restore the GL Context from here, as this operation is thread dependent */
if (!SDL_HasEvent(SDL_QUIT)) {
Jan 3, 2019
Jan 3, 2019
107
SDL_LockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
108
android_egl_context_restore(Android_Window);
Jan 3, 2019
Jan 3, 2019
109
SDL_UnlockMutex(Android_ActivityMutex);
Jan 6, 2019
Jan 6, 2019
111
112
113
114
115
116
/* Make sure SW Keyboard is restored when an app becomes foreground */
if (SDL_IsTextInputActive()) {
SDL_VideoDevice *_this = SDL_GetVideoDevice();
Android_StartTextInput(_this); /* Only showTextInput */
}
Jan 4, 2019
Jan 4, 2019
118
} else {
Jan 3, 2019
Jan 3, 2019
119
if (isPausing || SDL_SemTryWait(Android_PauseSem) == 0) {
Jan 5, 2019
Jan 5, 2019
120
121
122
/* We've been signaled to pause (potentially several times), but before we block ourselves,
* we need to make sure that the very last event (of the first pause sequence, if several)
* has reached the app */
Jan 5, 2019
Jan 5, 2019
123
if (SDL_NumberOfEvents(SDL_APP_DIDENTERBACKGROUND) > SDL_SemValue(Android_PauseSem)) {
124
125
126
127
128
129
130
isPausing = 1;
}
else {
isPausing = 0;
isPaused = 1;
}
}
Jan 4, 2019
Jan 4, 2019
131
132
133
}
}
Jan 4, 2019
Jan 4, 2019
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
void
Android_PumpEvents(_THIS)
{
static int isPaused = 0;
if (isPaused) {
if (SDL_SemTryWait(Android_ResumeSem) == 0) {
isPaused = 0;
ANDROIDAUDIO_ResumeDevices();
/* Restore the GL Context from here, as this operation is thread dependent */
if (!SDL_HasEvent(SDL_QUIT)) {
SDL_LockMutex(Android_ActivityMutex);
android_egl_context_restore(Android_Window);
SDL_UnlockMutex(Android_ActivityMutex);
}
Jan 6, 2019
Jan 6, 2019
154
155
156
157
158
159
/* Make sure SW Keyboard is restored when an app becomes foreground */
if (SDL_IsTextInputActive()) {
SDL_VideoDevice *_this = SDL_GetVideoDevice();
Android_StartTextInput(_this); /* Only showTextInput */
}
Jan 4, 2019
Jan 4, 2019
160
161
}
} else {
Jan 3, 2019
Jan 3, 2019
162
if (SDL_SemTryWait(Android_PauseSem) == 0) {
Jan 4, 2019
Jan 4, 2019
163
Jan 3, 2019
Jan 3, 2019
164
SDL_LockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
165
android_egl_context_backup(Android_Window);
Jan 3, 2019
Jan 3, 2019
166
SDL_UnlockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
167
Aug 12, 2016
Aug 12, 2016
168
ANDROIDAUDIO_PauseDevices();
Jan 4, 2019
Jan 4, 2019
169
170
171
172
173
174
isPaused = 1;
}
}
}
Jan 4, 2019
Jan 4, 2019
175
176
#endif
177
178
179
#endif /* SDL_VIDEO_DRIVER_ANDROID */
/* vi: set ts=4 sw=4 expandtab: */