Atlas - SDL_androidevents.c
Home / ext / SDL2 / src / video / android Lines: 1 | Size: 4318 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)][FILE BEGIN]1/* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2018 Sam Lantinga <[email protected]> 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/* We're going to do this by default */ 26#define SDL_ANDROID_BLOCK_ON_PAUSE 1 27 28#include "SDL_androidevents.h" 29#include "SDL_events.h" 30#include "SDL_androidwindow.h" 31 32#if !SDL_AUDIO_DISABLED 33/* Can't include sysaudio "../../audio/android/SDL_androidaudio.h" 34 * because of THIS redefinition */ 35extern void ANDROIDAUDIO_ResumeDevices(void); 36extern void ANDROIDAUDIO_PauseDevices(void); 37#else 38static void ANDROIDAUDIO_ResumeDevices(void) {} 39static void ANDROIDAUDIO_PauseDevices(void) {} 40#endif 41 42static void 43android_egl_context_restore() 44{ 45 SDL_Event event; 46 SDL_WindowData *data = (SDL_WindowData *) Android_Window->driverdata; 47 if (SDL_GL_MakeCurrent(Android_Window, (SDL_GLContext) data->egl_context) < 0) { 48 /* The context is no longer valid, create a new one */ 49 data->egl_context = (EGLContext) SDL_GL_CreateContext(Android_Window); 50 SDL_GL_MakeCurrent(Android_Window, (SDL_GLContext) data->egl_context); 51 event.type = SDL_RENDER_DEVICE_RESET; 52 SDL_PushEvent(&event); 53 } 54} 55 56static void 57android_egl_context_backup() 58{ 59 /* Keep a copy of the EGL Context so we can try to restore it when we resume */ 60 SDL_WindowData *data = (SDL_WindowData *) Android_Window->driverdata; 61 data->egl_context = SDL_GL_GetCurrentContext(); 62 /* We need to do this so the EGLSurface can be freed */ 63 SDL_GL_MakeCurrent(Android_Window, NULL); 64} 65 66void 67Android_PumpEvents(_THIS) 68{ 69 static int isPaused = 0; 70#if SDL_ANDROID_BLOCK_ON_PAUSE 71 static int isPausing = 0; 72#endif 73 /* No polling necessary */ 74 75 /* 76 * Android_ResumeSem and Android_PauseSem are signaled from Java_org_libsdl_app_SDLActivity_nativePause and Java_org_libsdl_app_SDLActivity_nativeResume 77 * 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. 78 */ 79 80#if SDL_ANDROID_BLOCK_ON_PAUSE 81 if (isPaused && !isPausing) { 82 /* Make sure this is the last thing we do before pausing */ 83 android_egl_context_backup(); 84 ANDROIDAUDIO_PauseDevices(); 85 if(SDL_SemWait(Android_ResumeSem) == 0) { 86#else 87 if (isPaused) { 88 if(SDL_SemTryWait(Android_ResumeSem) == 0) { 89#endif 90 isPaused = 0; 91 ANDROIDAUDIO_ResumeDevices(); 92 /* Restore the GL Context from here, as this operation is thread dependent */ 93 if (!SDL_HasEvent(SDL_QUIT)) { 94 android_egl_context_restore(); 95 } 96 } 97 } 98 else { 99#if SDL_ANDROID_BLOCK_ON_PAUSE 100 if( isPausing || SDL_SemTryWait(Android_PauseSem) == 0 ) { 101 /* We've been signaled to pause, but before we block ourselves, 102 we need to make sure that certain key events have reached the app */ 103 if (SDL_HasEvent(SDL_WINDOWEVENT) || SDL_HasEvent(SDL_APP_WILLENTERBACKGROUND) || SDL_HasEvent(SDL_APP_DIDENTERBACKGROUND) ) { 104 isPausing = 1; 105 } 106 else { 107 isPausing = 0; 108 isPaused = 1; 109 } 110 } 111#else 112 if(SDL_SemTryWait(Android_PauseSem) == 0) { 113 android_egl_context_backup(); 114 ANDROIDAUDIO_PauseDevices(); 115 isPaused = 1; 116 } 117#endif 118 } 119} 120 121#endif /* SDL_VIDEO_DRIVER_ANDROID */ 122 123/* vi: set ts=4 sw=4 expandtab: */ 124[FILE END](C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.